Как определить, возвращает ли RDTSC значение счетчика с постоянной скоростью? - PullRequest
4 голосов
/ 22 декабря 2010

Кажется, что самые новые процессоры AMD и Intel используют rdtsc в качестве счетчика с постоянной скоростью, избегая проблем, вызванных изменением частоты в результате таких вещей, как TurboBoost или настройки энергосбережения.

Поскольку rdtsc намного больше подходит для измерения производительности, чем QueryPerformanceCounter, из-за его гораздо меньших накладных расходов, я хотел бы использовать его по возможности.

Как я могу надежно определить, является ли rdtsc счетчиком с постоянной скоростью или нет?

Ответы [ 4 ]

7 голосов
/ 22 декабря 2010

Вы можете использовать CPUID, чтобы сказать вам.Начиная с документы на CPUID Fn8000_0007_EDX, бит 8:

TscInvariant: TSC-инвариант .Гарантируется, что скорость TSC является инвариантной во всех P-состояниях, C-состояниях и переходах с остановкой гранта (таких как регулирование STPCLK);поэтому TSC подходит для использования в качестве источника времени.0 = Такая гарантия не предоставляется, и программное обеспечение не должно пытаться использовать TSC в качестве источника времени.

0 голосов
/ 20 декабря 2012

Я знаю, что прошло много времени с тех пор, как был задан исходный вопрос, но могу ли я просто отметить, что проверка поколения / модели процессора - абсолютно НЕПРАВИЛЬНАЯ вещь, которую нужно делать.Во-первых, очень легко ошибиться в коде, чтобы он не работал на процессорах будущего поколения (потому что номера семейства / модели не всегда "линейны"), а во-вторых, просто потому, что процессор "более поздний"семья / модель ", чем те, над которыми вы знали, это работает, это не гарантия, что функция есть.Это похоже, но я видел много кода, который делает это плохо, и, таким образом, «выходит новый процессор, а код ошибается».

Используйте бит CPUID, чтобы проверить, правильно ли процессор работаетнемного или нет.

0 голосов
/ 11 марта 2012

Я считаю количество тактов в секунду, а затем сравниваю их с информированными часами в / proc / cpuinfo. Работает только с отключенными динамическими часами. См. Источник: https://github.com/petersenna/rdtscbench

0 голосов
/ 22 декабря 2010

просто используйте CPUID, чтобы обнаружить поколение ЦП , посмотрите, использует ли оно постоянные счетчики.Однако я бы предложил вместо этого использовать API профилирования, что-то вроде AMD Codeanalyst SDK будет хорошо

...