Он так же стабилен, как кристалл часов на материнской плате, но он привязан к эталонной частоте (которая зависит от модели процессора), а не к текущей тактовой частоте ядра процессора. Это изменение составило около 15 лет go (постоянная_тс c функция ЦП), что сделало его пригодным для синхронизации настенных часов вместо подсчета циклов.
Например, Linux VDSO user- Пространственная реализация из clock_gettime
использует rdtsc
и масштабный коэффициент для вычисления смещения из менее часто обновляемой отметки времени, обновляемой прерыванием таймера ядра. (VDSO = страницы кода и данных, принадлежащих ядру, сопоставленные только для чтения с процессами пользовательского пространства.)
Каковы наилучшие практики использования TS C в пользовательском пространстве в настоящее время?
Если вы хотите подсчитать тактовые частоты ядра, используйте rdpmc
(со счетчиком производительности HW, запрограммированным и настроенным так, чтобы пользовательское пространство могло его считывать). Или пользователь perf
или другой способ использования счетчиков производительности HW.
Но, кроме этого, вы можете использовать rdtsc
прямо или косвенно с помощью библиотек-оболочек.
В зависимости от ваших накладных расходов и ваших усилий желая определить частоту TS C, чтобы вы могли соотнести значения TS C с секундами, вы можете просто использовать ее через std::chrono
или lib c clock_gettime
, которые на самом деле не должны входить в ядро спасибо VDSO.
Как узнать количество циклов ЦП в x86_64 из C ++? - мой ответ содержит более подробную информацию о TS C, в том числе о том, как он работал на старых процессорах и тот факт, что вышли из строя выполнение означает, что вам нужно lfence до / после rdtsc
, если вы хотите дождаться завершения предыдущего кода до sh выполнения до того, как он прочитает внутренний TS C.
Измерение фрагментов кода, которые короче нескольких сотен Инструкция вводит сложность, заключающуюся в том, что пропускная способность и задержка - это разные вещи, и не имеет смысла измерять производительность только одним числом. Exe-order exe c означает, что окружающий код имеет значение.
, и они собираются удалить его из пространства пользователя.
x86 в основном никогда не удалялся что угодно, и определенно не из пространства пользователя. Обратное сравнение с существующими двоичными файлами является основным требованием x86 к славе и причине продолжительного существования.
rdtsc
задокументировано в руководствах Intel и AMD x86, например, Запись Intel vol.2 для него . Существует функция ЦПУ, которая позволяет ядру отключить RDTS C для пользовательского пространства (TSD = TimeStamp Disable), но она обычно не используется в Linux. (Обратите внимание на исключение # GP (0): если установлен флаг TSD в регистре CR4 и CPL больше 0 - Текущий уровень привилегий 0 = ядро, выше = пространство пользователя.
IDK, если есть планы использовать TSD по умолчанию; я бы предположил, что нет, потому что это полезный и эффективный источник времени. Даже если это так, на компьютере разработчика, где вы хотите выполнить профилирование / микробенчмаркинг, вы сможете переключаться эта функция. (Хотя обычно я просто помещаю материал в достаточно большой повтор l oop в исполняемый файл stati c и запускаю его под perf stat
, чтобы получить общее время и счетчики производительности HW.)