RDTSC медленно работает в Ubuntu

У меня есть фрагмент встроенной сборки, которую я компилирую с помощью clang ++:

    asm volatile ("LFENCE\n\t""RDTSC\n\t""shl $32, %%rdx\n\t""or %%rdx, %%rax\n\t": "=a" (retval)
:: "%rax", "%rdx");

На OSX общая стоимость проверки rdtsc как указано выше, составляет около 10-20 циклов. Когда я компилирую тот же код в Linux (а не в виртуальной машине), это занимает около 2500 циклов. Это заставляет меня подозревать, что Linux делает что-то глупое, например отключение RDTSC в пространстве пользователя. Из этих статей похоже, что это, по крайней мере, рассматривалось для Linux:

Я использую Ubuntu 14.04

Вопросы:

  • Сделал только режим ядра rdtsc на самом деле сделать это в ядре Ubuntu?
  • Если он есть, как мне определить текущие настройки?
  • И как мне получить пользовательский режим rdtsc снова работаешь?

PS: я полностью осведомлен о проблеме с rdtsc получения неправильных измерений, промывки трубопроводов и т. Д. Я могу жить с ними и при необходимости принимаю меры предосторожности. Я просто хочу, чтобы rdtsc был быстрым.

1

Решение

Интел говорилЗащищенная операционная система будет устанавливать флаг TSD во время инициализации системы, чтобы отключить доступ пользователя к счетчику меток времени.«с тех пор, как она была представлена ​​20 лет назад. Большинство ОС игнорировали Intel; и каждые 5 лет или около того какой-то исследователь безопасности где-то« обнаруживает »новый способ использования такой точной синхронизации для ослабления паролей, ключей шифрования и т. д. Примеры: http://people.csail.mit.edu/tromer/papers/cache.pdf , http://www.daemonology.net/papers/htt.pdf

Если добавить к этому проблемы, вызванные людьми, которые предполагают, что он работает с постоянной скоростью (это не на старых процессорах); затем проблемы, вызванные людьми, которые полагают, что это как-то связано с производительностью (это не касается более новых процессоров); затем люди, которые просто используют это неправильно (например, синхронизация одной короткой последовательности, где ошибка огромна); это начинает казаться еще худшей идеей.

Если затем добавить к этому проблемы с «out-of_sync TSC» в многопроцессорных системах (особенно в системах NUMA); это становится намного хуже (особенно для ядра, пытающегося держать его «вроде синхронизированным, может быть»).

Наконец, если вы посмотрите на такие вещи, как счетчики контроля производительности, профилировщики и т. Д .; вы понимаете, что RDTSC — неподходящий инструмент для этой работы. Затем вы смотрите в другом направлении на функции «время суток» и «истекшее время», и понимаете, что там есть и достойные / переносимые альтернативы.

Примечание: я не знаю, отключил ли Ubuntu RDTSC в пользовательском пространстве во всех системах или только в некоторых системах (например, в системах, где скорость не постоянна и / или не синхронизирована между процессорами), или даже если они не отключены это вообще. Все, что я знаю, это то, что он должен был быть отключен 20 лет назад.

РЕДАКТИРОВАТЬ: выше ответ на заданный вопрос. Ниже приведен ответ, который вам нужен.

Правильно использовать RDTSC; начните с определения времени «ничего» в цикле, одновременно отбрасывая результаты «выше, чем обычно» (вызванные прерываниями, переключениями задач и т. д.). Используйте это, чтобы найти среднее значение для «ничего» (среднее значение только для RDTSC).

Затем сделайте то же самое для кода, который вы тестируете (включая отбрасывание результатов «выше, чем обычно»), чтобы найти средние издержки «RDTSC + ваш код».

В заключение; вычтите средние издержки одного RDTSC из результата «RDTSC + ваш код», чтобы узнать, сколько времени ваш код занял бы сам по себе.

3

Другие решения


По вопросам рекламы [email protected]