Я буду расширять свои комментарии здесь. Это слишком большой и глубокий для меня, чтобы вписаться в комментарии.
То, что вы пытаетесь сделать, очень сложно - до такой степени, что это непрактично по следующим причинам:
- Нет портативного способа получить частоту процессора.
rdtsc
делает НЕ всегда дает правильную частоту из-за таких эффектов, как SpeedStep и Turbo Boost.
- Все известные методы измерения частоты требуют точного измерения времени. Однако определенный мошенник может вмешаться во все часы и таймеры в системе.
- Точное считывание частоты процессора, а также времени защищенным способом потребует доступа на уровне ядра. Это подразумевает подписание драйвера для Windows.
Нет портативного способа получить частоту процессора:
«Простой» способ получить частоту ЦП - это вызвать rdtsc
дважды с фиксированной временной продолжительностью между ними. Тогда деление разницы даст вам частоту.
Проблема в том, что rdtsc
не дает истинную частоту процессора. Поскольку приложения реального времени, такие как игры, полагаются на это, rdtsc
должно быть согласованным благодаря регулированию ЦП и Turbo Boost. Поэтому, как только ваша система загрузится, rdtsc
будет всегда работать с той же скоростью (если только вы не начнете связываться со скоростями шины с SetFSB или чем-то еще).
Например, на моем Core i7 2600K rdtsc
всегда будет показывать частоту на 3.4 GHz
. Но на самом деле он работает на холостом ходу в 1.6 GHz
и работает до 4.6 GHz
под нагрузкой через разогнанный множитель Turbo Boost в 46x
.
Но как только вы найдете способ измерить истинную частоту (или вы достаточно довольны rdtsc
), вы можете легко получить частоту каждого ядра, используя thread-affinities .
Получение истинной частоты:
Чтобы получить реальную частоту процессора, вам необходимо получить доступ либо к MSR (регистрам для конкретной модели), либо к счетчикам производительности оборудования.
Это инструкции уровня ядра, поэтому они требуют использования драйвера. Если вы пытаетесь сделать это в Windows с целью распространения, вам нужно будет пройти через надлежащий протокол подписи драйверов. Кроме того, код будет отличаться в зависимости от марки и модели процессора, поэтому для каждого поколения процессоров вам потребуется различный код обнаружения.
Как только вы дойдете до этой стадии, есть множество способов прочитать частоту.
На процессорах Intel аппаратные счетчики позволяют считать необработанные циклы ЦП. В сочетании с методом точного измерения реального времени (следующий раздел) вы можете вычислить истинную частоту. MSR предоставляют вам доступ к другой информации, такой как множитель частоты процессора.
Все известные методы измерения частоты требуют точного измерения времени:
Возможно, это большая проблема. Вам нужен таймер, чтобы можно было измерить частоту. Способный хакер сможет взломать все часы, которые вы можете использовать в C / C ++.
Это включает в себя все следующее:
clock()
gettimeofday()
QueryPerformanceCounter()
- и т.д ...
Список можно продолжать и продолжать. Другими словами, вы не можете доверять ни одному из таймеров, поскольку способный хакер сможет подделать их все. Например, clock()
и gettimeofday()
могут быть обмануты путем изменения системных часов непосредственно в ОС. Дурачиться QueryPerformanceCounter()
сложнее.
Получение точного измерения времени:
Все часы, перечисленные выше, уязвимы, потому что они часто так или иначе получены из одних и тех же системных часов. И эти системные базовые часы часто привязаны к системным базовым часам, которые можно изменить после того, как система уже загружена с помощью утилит разгона.
Таким образом, единственный способ получить надежное и защищенное от времени измерение времени - это прочитать внешние часы, такие как HPET или ACPI . К сожалению, для этого также требуется доступ на уровне ядра.
Подведем итог:
Создание любого типа защищенного от взлома теста почти наверняка потребует написания драйвера режима ядра, который требует подписи сертификата для Windows. Это часто является слишком обременительным для случайных авторов тестов.
Это привело к нехватке защищенных от взломов эталонных тестов, что, вероятно, способствовало общему снижению конкурентоспособного сообщества разгона в последние годы.