Как отключить динамическое масштабирование частоты?

Я хотел бы сделать несколько микробенчмарков и попытаться сделать их правильно. К сожалению, динамическое масштабирование частоты делает бенчмаркинг крайне ненадежным.

Есть ли способ программно (С++, Windows) узнать, включено ли динамическое масштабирование частоты? Если, можно ли это отключить в программе?

Я пытался просто использовать фазу прогрева, при которой ЦП загружается на 100% за секунду до фактического теста, но это тоже оказалось ненадежным.

ОБНОВЛЕНИЕ: даже когда я отключаю SpeedStep в BIOS, cpu-z показывает, что частота меняется между 1995 и 2826 ГГц.


person martinus    schedule 20.10.2010    source источник


Ответы (3)


В общем, вам нужно сделать следующие шаги:

  • Вызовите CallNtPowerInformation() и передайте SystemPowerCapabilities параметру InformationLevel, установите для lpInputBuffer и nInputBufferSize значение NULL, затем установите lpOutputBuffer в структуру SYSTEM_POWER_CAPABILITIES, и задайте для nOutputBufferSize размер структуры. После этого первого вызова структура SYSTEM_POWER_CAPABILITIES содержит текущие возможности питания системы. Чтобы проверить, поддерживает ли система регулирование скорости процессора, прочтите значение ProcessorThrottle.

  • Нас интересуют еще два элемента: ProcessorMinThrottle и ProcessorMaxThrottle; они представляют минимальный и максимальный поддерживаемый уровень регулирования системного процессора, выраженный в процентах. Если оба члена уже имеют значения 100%, это означает, что регулирование ЦП в настоящее время отключено, поэтому вам не нужно его перенастраивать.

  • Чтобы отключить регулирование ЦП, необходимо установить для параметров ProcessorMinThrottle и ProcessorMaxThrottle значение 100%. Для этого снова вызовите CallNtPowerInformation() и передайте SystemPowerCapabilities в параметр InformationLevel; но теперь задайте для lpInputBuffer структуру SYSTEM_POWER_CAPABILITIES, в которой для двух членов установлено значение 100%. Я уверен, вы знаете, что делать дальше.

Непрограммным способом вы также можете получить/установить параметры питания Windows, используя встроенные инструменты командной строки Windows, то есть PowerCfg.

Дальнейшее чтение

person Vantomex    schedule 20.10.2010
comment
Спасибо за это. Это было полезно. Однако один вопрос. Это навсегда или только на время работы приложения? - person Glenn1234; 27.02.2013
comment
Из MSDN: SystemPowerCapabilities 4 — параметр lpInBuffer должен иметь значение NULL, иначе функция возвращает ERROR_INVALID_PARAMETER. Кто-то действительно проверял, что это работает? - person kalmiya; 18.12.2013
comment
ProcessorThrottle для меня постоянно FALSE, а процент дроссельной заслонки постоянно равен 0, хотя я уверен, что мой ноутбук масштабирует частоту. CallNtPowerInformation вернулся ERROR_SUCCESS. Я не уверен, что происходит. - person Sebastian Graf; 24.08.2018

До сих пор ни один из вышеперечисленных вариантов CallNtPowerInformation не работал у меня. Соответствующее поле ProcessorThrottle в SYSTEM_POWER_CAPABILITIES было FALSE, и изменение некоторых SYSTEM_POWER_POLICY не сработало.

Однако https://www.geeks3d.com/20170213/how-to-disable-intel-turbo-boost-technology-on-a-notebook/#_24 описывает способ сделать параметр доступным в настройках управления питанием. .

С ProcMon я смог проследить его до следующих манипуляций с реестром:

  1. Прочтите значение ActivePowerScheme SZ под HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes, чтобы получить активную схему электропитания.
  2. Установите ACSettingIndex и/или DCSettingIndex DWORD под Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes\<above active power plan GUID>\54533251-82be-4824-96c1-47b60b740d00\be337238-0d82-4146-a960-4f3749d470c7 на 0 (отключено или что вы выберете) из 2 (высокий).

К сожалению, соответствующие ключи принадлежат системе, что означает либо то, что вы должны предложить пользователю (который должен иметь доступ администратора) изменить разрешения ключа, либо вам нужно использовать powercfg для управления настройкой. Последнее предпочтительнее и действительно работает даже без доступа администратора (любезно предоставлено https://docs.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-boost-mode):

powercfg -setacvalueindex scheme_current sub_processor PERFBOOSTMODE 0
powercfg -setdcvalueindex scheme_current sub_processor PERFBOOSTMODE 0
powercfg -setactive scheme_current
person Sebastian Graf    schedule 25.08.2018
comment
У вас процессор Skylake или более поздней версии? Skylake предоставила ОС возможность полностью передать аппаратному обеспечению управление P-состояниями (масштабированием частоты). В старых процессорах это делалось только для частот Turbo (выше номинальной частоты, когда аппаратное обеспечение должно иметь возможность самостоятельно отключаться). Но в Skylake Turbo не такой особенный, и я думаю, что способ, которым ОС будет отключать его, отличается в аппаратном режиме P-state. Во всяком случае, это может объяснить, почему другие ответы больше не работают. (Я не использую Windows, поэтому подробности в IDK.) - person Peter Cordes; 26.08.2018
comment
Спасибо! Это действительно может объяснить, почему он больше не работает. - person Sebastian Graf; 26.08.2018

В Windows XP и более поздних версиях скорость ЦП регулируется политикой электропитания. Разве это не отключает масштабирование, если вы устанавливаете режим «Максимальная производительность» в диалоговом окне управления питанием Windows?

Существуют также сторонние инструменты — например, SpeedSwitchXP.

Программно это можно было бы сделать, я полагаю, используя CallNtPowerInformation функция.

person VladV    schedule 20.10.2010