Как определить, возвращает ли RDTSC постоянное значение счетчика скорости?

StackOverflow https://stackoverflow.com/questions/4509727

  •  12-10-2019
  •  | 
  •  

Вопрос

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

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

Как я могу надежно обнаружить, является ли RDTSC постоянным счетчиком скорости или нет?

Это было полезно?

Решение

Вы можете использовать CPUID сказать тебе. Из Документы на CPUID FN8000_0007_EDX BIT 8:

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top