для чего нужен андервольтинг процессора
Понижение рабочего напряжения процессора, или тюнинг Enhanced Intel SpeedStep
В современных десктопных и (в особенности) мобильных процессорах применяется целый ряд энергосберегающих технологий: ODCM, CxE, EIST и др. Сегодня нас будет интересовать, пожалуй, самая высокоуровневая из них: гибкое управление частотой и напряжением процессорного ядра во время работы — Cool ‘n’ Quiet, PowerNow! у AMD и Enhanced SpeedStep (EIST) у Intel.
Чаще всего пользователю компьютера или ноутбука достаточно просто включить (поставить галочку) поддержку той или иной технологии в BIOS и/или операционной системе — никакой тонкой настройки обычно не предусмотрено, хотя, как показывает практика, она может оказаться весьма полезной. В этой статье я расскажу о том, как можно управлять рабочим напряжением ядра процессора из операционной системы (на примере Intel Pentium M и FreeBSD), и зачем это может понадобиться.
Несмотря на большое количество руководств, редко где встретишь обстоятельное описание технологии Enhanced SpeedStep с точки зрения операционной системы (а не конечного пользователя), особенно на русском языке, поэтому значительная часть статьи посвящена деталям реализации и носит в некоторой степени теоретический характер.
Надеюсь, статья окажется полезной не только пользователям FreeBSD: мы также немного коснемся GNU/Linux, Windows и Mac OS X. Впрочем, в данном случае конкретная операционная система имеет второстепенное значение.
Предисловие
Обычно изменение штатного напряжения подразумевает его повышение с целью обеспечить стабильную работу процессора при разгоне (т.е. на повышенной частоте). Грубо говоря, каждому значению напряжения соответствует некоторый диапазон частот, на которых он может работать, и задача оверклокера — найти максимальную частоту, на которой процессор еще не «глючит». В нашем случае задача стоит в некотором смысле симметричная: для известной частоты (точнее, как мы вскоре выясним, набора частот) найти наименьшее напряжение, обеспечивающее стабильную работу CPU. Понижать же рабочую частоту не хочется, чтобы не потерять в производительности — ноут и так уже далеко не топовый. Кроме того, понижать напряжение выгоднее.
Немного теории
Как известно, тепловыделение процессора пропорционально его емкости, частоте и квадрату напряжения (кому интересно, почему это так, могут попробовать вывести зависимость самостоятельно, рассмотрев процессор как набор элементарных CMOS-инверторов (логических отрицателей), либо сходить по ссылкам: раз, два, три).
Современные мобильные процессоры могут потреблять до 50-70 Вт, которые в итоге рассеивают в тепло. Это очень много (вспомните лампы накаливания), особенно для ноутбука, который в автономном режиме под нагрузкой будет «кушать» аккумулятор как та свинья апельсины. В условиях ограниченного пространства тепло, скорее всего, придется отводить активно, а это означает дополнительный расход энергии на вращение вентилятора кулера (возможно, нескольких).
Естественно, такое положение дел никого не устраивало, и производители процессоров стали думать, как бы оптимизировать энергопотребление (и, соответственно, теплоотдачу), а заодно и предотвратить процессор от перегрева. Интересующимся рекомендую к прочтению ряд замечательных статей Дмитрия Беседина, а я тем временем перейду непосредственно к делу.
Немного истории
Версия 3.1 (2003 г.) впервые применяется в первом и втором поколениях процессоров Pentium M (ядра Banias и Dothan). Частота варьировалась (сначала — лишь переключалась между двумя значениями) от 40% до 100% от базовой, с шагом 100 МГц (для Banias) или 133 МГц (для Dothan, наш случай). Одновременно Intel вводит динамическое управление емкостью кэша второго уровня (L2), что позволяет еще лучше оптимизировать энергопотребление. Версия 3.2 (Enhanced EIST) — адаптация для многоядерных процессоров с общим L2-кэшем. (Небольшой FAQ от Intel по технологии SpeedStep.)
Теперь, вместо того, чтобы слепо следовать многочисленным howto и туториалам, скачаем pdf’ку и попробуем разобраться в принципе работы EST (я буду дальше использовать эту аббревиатуру, т.к. она универсальнее и короче).
Как работает EST
Итак, EST позволяет управлять производительностью и энергопотреблением процессора, причем динамически, во время его работы. В отличие от более ранних реализаций, которые требовали аппаратной поддержки (в чипсете) для изменения рабочих параметров процессора, EST позволяет программно, т.е. средствами BIOS или операционной системы, изменять множитель (отношение частоты процессора к частоте шины) и напряжение ядра (Vcc) в зависимости от нагрузки, типа источника питания компьютера, температурного режима CPU и/или настроек (политики) ОС.
Во время работы процессор находится в одном из нескольких состояний (power states): T (throttle), S (sleep), C (idle), P (performance), переключаясь между ними по определенным правилам (с. 386 спецификации ACPI 5.0).
EST управляет работой процессора в P-состоянии (P-state), они-то и будут нас интересовать. К примеру, Pentium M поддерживает шесть P-состояний (см. рис. 1.1 и таб. 1.6 pdf’ки), отличающихся напряжением и частотой:
Узнать, поддерживает ли ваш процессор EST, можно взглянув на 16-й бит в регистре IA_32_MISC_ENABLE (0x1A0), он должен быть установлен:
Аналогичная команда для GNU/Linux (потребуется пакет msr-tools):
Переход между состояниями происходит при записи в регистр IA32_PERF_CTL (0x199). Узнать текущий режим работы можно прочитав регистр IA32_PERF_STATUS (0x198), который обновляется динамически (таб. 1.4 pdf’ки). В дальнейшем префикс IA32_ я буду для краткости опускать.
Попробуем для начала прочитать текущее значение PERF_STATUS :
Из документации следует, что текущее состояние кодируется в нижних 16 битах (если выполнить команду несколько раз, их значение может меняться — это означает, что EST работает). Если посмотреть внимательнее на остальные биты, в них тоже явно не мусор. Погуглив, можно выяснить, что же они означают.
Структура регистра PERF_STATUS
Три 16-битных поля — это так называемые Performance State Values (PSV), их структуру мы рассмотрим ниже: текущее значение PSV, максимальное (зависит от процессора) и значение на старте системы (при включении). Текущее значение (curr_psv), очевидно, меняется при изменении режима работы, максимальное (max_psv) обычно остается постоянным, стартовое значение (init_psv) не меняется: как правило, оно равно максимальному значению для десктопов и серверов, но минимальному для мобильных CPU. Минимальный множитель (min_mult) для процессоров Intel почти всегда равен шести. Поле status содержит значение некоторых флагов, например, при наступлении событий EST или THERM (т.е. в момент изменения P-состояния или перегрева процессора, соответственно).
Структура Performance State Value (PSV)
Знать и понимать, что из себя представляет PSV, очень важно, ведь именно в таком виде задаются режимы работы процессора.
Dynamic FSB frequency switching указывает пропускать каждый второй такт FSB, т.е. вдвое понижать рабочую частоту; эта возможность впервые реализована в процессорах Core 2 Duo (ядро Merom) и нас не касается, как и Non-integer bus ratio — специальный режим, поддерживаемый некоторыми процессорами, позволяющий, как следует из названия, более тонко управлять их частотой.
К собственно технологии EST имеют отношения два поля — идентификаторы частоты (Frequency Identifier, Fid), который численно равен множителю, и напряжения (Voltage Identifier, Vid), который соответствует уровню напряжения (он же обычно и наименее документирован).
Идентификатор напряжения (Voltage Identifier)
Intel весьма неохотно раскрывает информацию (обычно требуется подписать NDA) о том, как именно кодируется идентификатор напряжения для каждого процессора. Но для большинства популярных CPU, к счастью, эта формула известна; в частности, для нашего Pentium M (и многих других): Vcc = Vid0 + (Vid × Vstep), где Vcc — текущее (действительное) напряжение, Vid0 — базовое напряжение (когда Vid == 0), Vstep — шаг. Таблица для некоторых популярных процессоров (все значения в милливольтах):
Процессор | Vid0 | Vstep | Vboot | Vmin | Vmax |
---|---|---|---|---|---|
Pentium M | 700,0 | 16,0 | xxxx,x | xxx,x | xxxx,x |
E6000, E4000 | 825,0 | 12,5 | 1100,0 | 850,0 | 1500,0 |
E8000, E7000 | 825,0 | 12,5 | 1100,0 | 850,0 | 1362,5 |
X9000 | 712,5 | 12,5 | 1200,0 | 800,0 | 1325,0 |
T9000 | 712,5 | 12,5 | 1200,0 | 750,0 | 1300,0 |
P9000, P8000 | 712,5 | 12,5 | 1200,0 | 750,0 | 1300,0 |
Q9000D, Q8000D | 825,0 | 12,5 | 1100,0 | 850,0 | 1362,5 |
Q9000M | 712,5 | 12,5 | 1200,0 | 850,0 | 1300,0 |
Множитель (т.е. Fid) записывается в PSV сдвинутым на 8 бит влево, младшие шесть бит занимает Vid. Т.к. в нашем случае остальными битами можно пренебречь, то PSV, частота процессора, системной шины и физическое напряжение связаны простой формулой (для Pentium M):
Теперь рассмотрим регистр управления ( PERF_CTL ). Запись в него должна производиться следующим образом: сначала считывается текущее значение (64-битное слово целиком), в нем изменяются нужные биты, и записывается обратно в регистр (т.н. read-modify-write).
Структура регистра PERF_CTL
IDA (Intel Dynamic Acceleration) disengage-бит позволяет временно отключать адаптивное (opportunistic) управление частотой на процессорах Intel Core 2 Duo T7700 и более поздних, — опять же, нас не интересует. Младшие 16 бит (PSV) — режим, в который мы «просим» перейти процессор.
Таблица _PSS
Таблица _PSS представляет собой массив состояний (Package в терминологии ACPI) или метод, который возвращает такой массив; каждое состояние (P-state) в свою очередь определяется следующей структурой (с. 409 спецификации ACPI):
EST-драйвер операционной системы может «знать» про некоторые процессоры, т.е. сумеет ими управлять и без поддержки ACPI. Но это редкость, особенно в наши дни (хотя для undervolting’а на Linux, где-то до версии 2.6.20, надо было патчить таблицы в драйвере, и еще в 2011 г. этот метод был весьма распространен).
Стоит отметить, что EST-драйвер может работать даже в случае отсутствия таблицы _PSS и неизвестного процессора, т.к. максимальное и минимальное значения можно узнать из PERF_STATUS (при этом, очевидно, число P-состояний вырождается в два).
Довольно теории. Что с этим всем делать?
Итак, мы знаем дефолтные Vid для каждого P-уровня: 43, 37, 32, 28, 23, 18, что соответствует напряжениям от 1388 mV до 988 mV. Суть undervolting’а в том, что наверняка эти напряжения несколько выше, чем реально необходимо для устойчивой работы процессора. Попробуем определить «границы дозволенного».
Я написал для этого простой shell-скрипт, который постепенно понижает Vid и выполняет несложный цикл (демон powerd(8) перед этим, разумеется, необходимо прибить). Таким образом я определил напряжения, позволяющие процессору хотя бы не виснуть, затем прогнал несколько раз тест Super Pi и пересборку ядра; уже позже я поднял значение Vid для двух максимальных частот еще на один пункт, иначе gcc изредка вылетал из-за ошибки illegal instruction. В результате всех экспериментов в течении нескольких дней получился такой набор “стабильных” Vid: 30, 18, 12, 7, 2, 0.
Анализ результатов
Если мы получаем значения PSV через ACPI, то логичнее всего изменить именно таблицу _PSS в DSDT. К счастью, BIOS для этого ковырять не придется: FreeBSD умеет загружать DSDT из файла (про модификацию таблиц ACPI на Хабре уже не раз писали, поэтому сейчас подробно на этом останавливаться не будем). Заменяем нужные поля в DSDT:
Компилируем новый AML-файл (байткод ACPI) и модифицируем /boot/loader.conf так, чтобы FreeBSD загружала нашу модифицированную DSDT вместо дефолтной:
Undervolting в GNU/Linux
По правде говоря, сначала я думал, что мне достаточно будет прочитать Gentoo Undervolting Guide и просто адаптировать его для FreeBSD. Это оказалось не так-то просто, ибо документ на поверку оказался на редкость бестолковым (что вообще-то странно для Gentoo Wiki). К сожалению, на их новом сайте я ничего похожего не нашел, пришлось довольствоваться старой копией; и хотя я понимаю, что это руководство во многом потеряло актуальность, я все же его немного покритикую. 🙂
Мне почему-то сразу, без объявления войны, предлагают патчить ядро (во FreeBSD, на минуточку, нам вообще никакой системный код модифицировать не пришлось). Забивать во внутренности драйвера или записывать в какие-то init-скрипты значения неких «безопасных» напряжений, непонятно кем и каким образом полученные, из специальной таблицы (в которой Pentium M 780 издевательски представлен строкой, состоящей из одних вопросительных знаков). Следовать советам, среди которых есть написанные людьми, которые явно вообще не понимают, о чем говорят. А главное, совершенно неясно, почему и как именно эти магические замены одних цифр на другие работают; не предлагается способа «потрогать» EST, прежде чем что-то патчить и пересобирать ядро, ни разу не упоминаются регистры MSR и работа с ними из командной строки. Не рассматривается модификация таблиц ACPI как альтернативный и более предпочтительный вариант.
На ThinkWiki руководство чуть получше (и поновее), но не намного. Еще более лаконично выглядит страница ArchWiki. Вот эта строчка доставляет особенно:
Так и просятся лостовские «4, 8, 15, 16, 23, 42» (правда, в обратном порядке, что несколько портит шутку).
Пожалуй, самое толковое описание всего процесса для Linux у Пата Эрлея, ссылку на которое я давал выше.
Undervolting в Windows и Mac OS X
Про Windows особо говорить смысла нет: есть и софт, и обсуждения на форумах, поэтому я просто оставлю здесь пару ссылок.
Что еще почитать
Для FreeBSD: тема на форуме, а также небезызвестное обсуждение в рассылке; исходное письмо Александра Мотина для удобства викифицировано. Для Linux можно начать с неплохой статьи в ArchWiki.
Для тех, кто хочет углубиться в тему, кроме официальной документации производителей процессоров и приведенных в тексте ссылок, вот здесь — отличная подборка материалов (исследовательских статей, презентаций) по широкому кругу вопросов управления энергопотреблением (осторожно, Comic Sans).
Как разогнать видеокарту. Часть 2 — андервольтинг
Содержание
Содержание
Современные чипы имеют отличные способности к повышению частоты, а массивные системы охлаждения могут спокойно переваривать до нескольких сотен ватт тепловыделения. Естественно, производители стараются поддерживать порядок в иерархии производительности комплектующих, поэтому все возможности кремния используются сразу «из коробки». Вряд ли кого-то заинтересуют модели верхнего ценового сегмента, если бюджетную карту можно запредельно разогнать и получить аналогичную производительность. Но энтузиасты не могут сидеть спокойно и постоянно придумывают новые способы настройки железа. Даже если с завода выжали все.
В прошлом материале мы пытались разогнать RTX 2070 Super, которая хорошо бустится еще с завода. Поэтому, как показало сравнение производительности и энергопотребления, повышение частоты чипа почти не меняет производительность, но заметно повышает аппетиты к электричеству. И дарит пользователю несколько лишних градусов тепла в корпусе.
Такой разгон называется «кукурузным»: когда мощность не меняется, а железо плавится от жары. Конечно, референсные видеокарты стоят особняком в этой ситуации, потому что их заводские характеристики заметно ниже, чем у Asus, Gigabyte и других производителей. Да, они позволяют без проблем прибавить к базовой частоте 100–150 МГц. Это будет стабильно и заметно на графике фреймрейта. Остальные видеокарты уже имеют эти 150 МГц прибавки с завода. Поэтому примерная итоговая частота будет одинакова для всех карт.
Несмотря на такие условия, энтузиасты нашли способ побаловаться с настройкой так, чтобы потребление и температура снизились, но поднялась производительность. Другими словами, если с завода все сделали за нас, то почему бы не попытаться сделать это еще лучше.
Разгон наоборот
Андервольтинг (undervolting) — снижение вольтажа. Идеальный андервольтинг — снижение вольтажа без потери фпс. Этим мы и займемся.
Если разгон RTX 2070 Super не принес существенной прибавки, то почему бы не попытаться заставить видеокарту работать на заводских частотах, но с меньшим нагревом. В теории, регулировка напряжения дает множество плюсов:
Так это или нет, проверим на практике.
Тестовый стенд
Почему автоматика хуже ручной настройки
Принцип работы турбобуста: повышение частоты, если того позволяет максимальная температура. Так как игровые сцены меняются очень быстро, а значит и нагрузка на графику тоже, алгоритм не всегда удерживает постоянную стабильную частоту. При высокой нагрузке она может варьироваться в широких пределах, работая то на 1950 МГц, то на 2080 МГц. Естественно, это отражается на плавности графика фреймрейта. Если же частота всегда стабильна, то при переходе между сценами нет скачков потребления, температуры и частоты. Это не означает прибавку мощности, но немного влияет на плавность геймплея. Задача ручной настройки — добиться постоянной частоты при минимальном напряжении.
Софт для настройки
Андервольтинг видеокарты не отличается от разгона, поэтому программное обеспечение остается то же самое.
MSI Afterburner — не только разгоняет, но и андервольтит.
GPU-Z — в рамках этого материала почти не понадобится, но для мониторинга информации можно оставить.
3DMark TimeSpy Stress Test — для окончательной проверки настройки видеокарты.
Андервольтинг
Начиная с моделей Pascal, оптимальный вольтаж для настройки стабильной частоты — 0.950 В. Температуры остаются низкими, а частота не опустится ниже необходимой для хорошей производительности в таком режиме. Обычно при таком вольтаже средний чип работает как минимум на 1950–1980 МГц. Свежие модели Turing и Ampere без проблем берут частоты повыше, до 2050 МГц, совсем удачные могут даже 2100 МГц. Вообще, с выходом новых видеокарт графика стала разгонятся еще лучше относительно базовых частот. Это заслуги новой архитектуры и улучшенной системы питания.
Подготовка
Андервольтинг, как и разгон, желательно производить при хорошем обдуве, так как стабильность работы на высоких частотах зависит и от температуры. Для этого нажимаем на значок шестеренки в Afterburner, затем выбираем вкладку «кулер», далее пункт «Включить программный пользовательский режим» и выставляем график примерно таким образом:
Ориентируемся на такое соотношение температуры к оборотам вентиляторов: 40/60, 60/80, 70/95. В таком режиме вентиляторы реагируют на изменение температуры быстрее.
Снимать лимиты энергопотребления не нужно. Низкий вольтаж не позволит видеокарте выйти из заводских рамок Power Limit. То же самое и с Temp Limit:
Снижаем аппетиты видеокарты
Открываем MSI Afterburner и нажимаем кнопку, выделенную на первом скриншоте красным, или пользуемся сочетанием клавиш Ctrl+F. Откроется график кривой частот/напряжений:
Если нажать на одну из точек, появятся цифры для частоты и вольтажа. То есть, в данных температурных рамках, а именно, при 31 °C по чипу стабильная частота для 0.950 В составит 1935 МГц. При 60-70 градусах она уменьшается на 10 единиц.
Так настроен алгоритм регулирования частоты Nvidia. Эта информация приводится для того, чтобы пользователь понимал принцип работы турбобуста и как будет снижаться вольтаж.
Настройка происходит в несколько этапов:
1. Перед каждым изменением частоты необходимо охлаждать чип до 32–35 °C, чтобы частота вернулась в исходное состояние. Для примера на скрине это 1935 МГц.
2. Определяемся с вольтажом. Можно взять за основу любой, но для Nvidia золотое сечение это 0.950 В.
3. Находим точку для напряжения на графике и поднимаем ее на несколько единиц. Например, делаем +45, нажимаем Enter, а затем кнопку «Применить». Все точки после выделенной необходимо привести в такой порядок:
Так мы заставляем видеокарту думать, что 0.950 В это максимальный для нее вольтаж.
Не забываем сохранить настройки в профиль программы, чтобы не двигать противные точки после неудачного разгона.
4. Включаем бенчмарк Unigine на таких настройках и следим за частотой и температурой:
Выставили 1980 МГц, а после прогрева видеокарты получили 1965 МГц. Оставляем тест в таком режиме на 5–10 минут, после чего пробуем поднимать точку на графике. Если тест завис или сыпет артефактами, то снижаем частоту или пробуем взять вольтаж повыше. Например, 1 В.
5. Поднимаем частоту памяти. Как известно, для каждого производителя памяти есть примерный диапазон рабочих частот:
Samsung — легко переваривают прибавку +1000 Мгц и даже выше.
Micron — стабильны от +500 до +900.
Hynix — максимум +300 Мгц к общей частоте, при этом греются сильнее предыдущих.
Узнать производителя чипов памяти можно в GPU-Z:
6. Тестируем окончательные настройки на стабильность в тесте 3DMark TimeSpy:
На стабильной системе должно быть более 95 %. На скриншоте пример неудачного разгона.
Что на практике
Assassin’s Creed Valhalla
Что и требовалось доказать. В первом же тесте полная победа не только над автоматикой, но и над разгоном. Причем как по количеству кадров, так и по температурам и энергопотреблению. Выходит, что производительность видеокарты на пониженном напряжении соответствует работе в разгоне. Потребление снизилось на 36 Вт, а температура упала на 8 °C.
Assassin’s Creed Odyssey
Андервольтинг быстрее завода на 6 % и потребляет на 20 Вт меньше. С разгоном и сравнивать не хочется, за два лишних кадра придется добавить почти 40 Ватт энергии. Примечательно, что 0.1 % и 1 % кадров остаются на уровне разогнанной видеокарты. И это заметно в геймплее.
Horizon Zero Dawn
Ситуация повторяется: 40 Вт потребления по сравнению с разгоном и 10 °C. И правда какая-то кукуруза. График кадров-то почти не меняется.
Shadow of the Tomb Raider
Мы сэкономили 53 Вт по сравнению с разгоном и 32 Вт, если бы видеокарта работала на автомате. При этом имеем выше производительность, а температуры опустились. Фантастика.
Red Dead Redemption 2
Почти 60 Вт разницы с разгоном, но практически никакой в производительности. То есть, в пределах погрешности из-за меняющихся погодных условий и световых эффектов в игре.
World of Tanks Encore
Любители пострелять из крупнокалиберного тоже перестанут потеть от пекла под столом. Минус 60 Вт и 11 °C. Между прочим, скорость танка осталась прежней.
3DMark Fire Strike Extreme
Разница 50 Вт без существенного изменения мощности. При этом нагрев на 4 °C ниже. И это синтетика, где каждая единица в частоте отражается в бенчмарке.
Разгонять или снижать вольтаж
Ответ очевиден. Да, если снять ограничения производителя и взять контроль над частотой и вольтажом в свои руки, то можно добиться большей производительности. Но никто не отменяет плату нагревом, повышенным аппетитом и возможностью испортить железку. Так как это неосуществимо в руках простого пользователя и без потери гарантии, приходится искать способы улучшить то, что уже пытались улучшить до нас.
Как показывают сравнительные тесты, самый лучший разгон для современных видеокарт Nvidia это андервольтинг с повышением частоты памяти. Выигрываем в производительности при гораздо меньших цифрах в энергопотреблении. И, если владельцы моделей с хорошей системой охлаждения не боятся повышенного нагрева, то бюджетная линейка прямо требует таких доработок.
Что касается итоговой производительности заводской RTX 2070 Super, то в пересчете на один Ватт потребления видеокарта в среднем выдает 0.3-0.4 кадра в секунду. В режиме «газ в пол» это соотношение почти не меняется и выдает не более 0.5 кадров. То есть, мы видим линейное увеличение производительности с ростом потребления.
В андервольтинге ситуация интереснее. Минимальное соотношение варьируется от 0.5, до максимум 0.7 кадров за Ватт. При этом есть большой выигрыш в температуре. Если представить разницу между стоком и андервольтом в процентах, то получается так: до 15 % прибавки мощности при уменьшении энергопотребления до 20 %. Вывод: разгон — это не только бездумное повышение частот и вольтажей, но и правильная оптимизация работы заводских алгоритмов.