Насколько стабилен TS C (TimeStamp Counter) из пользовательского пространства для процессоров Intel x86-64 в 2020 году? - PullRequest
2 голосов
/ 26 апреля 2020

Иногда мне требуется правильный способ измерения производительности в наносекунду из моего пользовательского приложения, чтобы включить задержки измерения в моем измерении. Я прочитал много старых (10-летних) статей о том, что он нестабилен, и они собираются удалить его из пространства пользователя.

  • В 2020 году для процессоров Intel 8/9-го поколения x86-64 как стабильный это? Можем ли мы по-прежнему безопасно использовать код ассемблера TS C?
  • Каков наилучший метод использования TS C в пространстве пользователя в настоящее время?

Ссылки:

1 Ответ

3 голосов
/ 26 апреля 2020

Он так же стабилен, как кристалл часов на материнской плате, но он привязан к эталонной частоте (которая зависит от модели процессора), а не к текущей тактовой частоте ядра процессора. Это изменение составило около 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...