Некоторые аспекты энергосбережения Intel Core i* and Windows

Автор: serj. Современные процессоры давно используют энергосберегающие технологии. Для их идентификации и рекламной раскрутки применяют различные громкие имена, но суть остается одной и той же – изменение производительности элементов ЦП в зависимости от загрузки. Энергосбережение – это хорошо, но как оно сказывается на производительности компьютера?
21 ноября 2012, среда 00:00
serj для раздела Лаборатория

Оглавление

Вступление

Современные процессоры давно используют энергосберегающие технологии. Для их идентификации и рекламной раскрутки применяют различные громкие имена, но суть остается одной и той же – изменение производительности элементов ЦП в зависимости от загрузки. Если какой-то модуль не используется, то логично его «заморозить», что снизит мощность потребления и тепловыделение. Первое несущественно для немобильных платформ, а вот повышенное выделение тепла может оказаться важным, поскольку стремление к тишине является общей тенденцией развития аппаратуры и крайне востребовано пользователями.

Энергосбережение – это хорошо, но как оно сказывается на производительности компьютера? Об этом и пойдет речь ниже.

Энергосберегающие технологии

Не надо переживать, я не буду тратить ваше время на изложение десятков мудреных терминов и названий данной области, они все базируются на двух понятиях:

  • «Ну дайте выключиться»;
  • Ниже напряжение = меньше потребление.

Первый прием начал широко применяться довольно давно и суть его в простом действии – если схема остановлена, то она потребляет значительно меньше энергии, чем функционирующая, даже в «облегченном» режиме. Сейчас микросхемы изготавливают по CMOS технологии, что подразумевает почти нулевой ток потребления при отсутствии коммутации. Но, как только начинает что-то происходить, сразу следует возрастание тока, и причина этого неприятного последствия заключается в паразитной емкости элементов и трасс внутри микросхемы. При заряде конденсатора на нем запасается энергия C*V^2/2, где С – емкость; V – изменение напряжения. Чем чаще изменяется логический уровень элемента, тем больше энергии циркулирует через ключевые элементы, что вызывает выделение тепла, ведь «ключи» имеют довольно большое внутреннее сопротивление во включенном состоянии.

Второй прием стал применяться относительно недавно, как дополнение к первому - в некоторых случаях можно снижать рабочую частоту простаивающих узлов, что не вызовет потери производительности. Коль скоро снизили частоту, то можно пропорционально к ней поснизить и рабочее напряжение. Чем меньше напряжение и частота, тем ниже как мощность потребления, так и «фоновый» ток утечки по полупроводниковому кристаллу.

Рассмотрим один пример. Положим, в некоторой шине был уровень «0» и требуется передать логическую единицу.

На данном рисунке отмечены основные элементы передатчика:

  • Q1, Q2 – выходные ключи;
  • C1 – паразитная емкость ключей, окружающих элементов и трассировки вокруг узла передатчика сигнала;
  • T1 – шина передачи сигнала;
  • U – приемник.

Работает схема следующим образом. Конденсатор С1 разряжен, открывается ключ Q1 и замыкает его на питание (Vcc). При этом конденсатор начинает заряжаться через включенный транзистор Q1, который имеет довольно большое сопротивление. Напряжение на конденсаторе возрастает до уровня Vcc, отсюда можно вычислить накопленную в нём энергию. Сам переходной процесс протекает время R*C, где «R» - сопротивление ключа Q1; «C» - номинальная емкость конденсатора C1. По прошествии переходного процесса напряжение на конденсаторе С1 установится в постоянное значение (Vcc) и в дальнейшем изменяться не будет. Это означает, что ток в схеме перестанет куда либо ‘течь’ и узел перестанет потреблять мощность из источника питания. При смене уровня на «логический 0» происходят схожие процессы, только при этом закрывается транзистор Q1 и открывается Q2, что приводит к «закорачиванию» конденсатора С1 на землю и вся накопленная в нём энергия израсходуется на нагрев внутреннего сопротивления включенного транзистора Q2. Иначе говоря, чем чаще происходит смена уровня, тем больше потребляется мощность из источника питания, и эта зависимости линейная. С другой стороны, энергия, накапливаемая на конденсаторе, пропорциональна квадрату напряжения, поэтому даже небольшое снижение разности уровней «логического 1» и «логического 0» приводит к существенной экономии затрат.

Данный пример характеризует работу обоих приемов энергосбережения:

  • Если узел не переключается, то на перезарядку конденсатора С1 не тратится мощность;
  • Энергия, накапливаемая на конденсаторе С1 пропорциональна квадрату разности напряжений «0» и «1», а потому снижение этих величин весьма чувствительно понижает расходуемую мощность.

Режим остановки узлов процессора инициируется операционной системой. Для процессоров, точнее ядер, существует несколько состояний. Обязательными являются два – нормальный режим работы «С0» и простой «С1». Состояние остановки требуется любой операционной системе, ведь не всегда есть что выполнять и процессор надо останавливать. Для «усыпления» используется специальная команда «hlt» (MWAIT), по которой процессор останавливает выполнение программы. Интересно, что программно вывести его из этого состояния нельзя и он может находиться в нем неограниченное время. К слову, как же тогда работает ОС, если процессор усыплен и не может быть разбужен с помощью программы? (Да и о какой «программе» может идти речь, если инструмент ее выполнения, процессор, спит.) Все просто, процессор просыпается по любому (незамаскированному) аппаратному прерыванию. Один из основных движущих элементов в работе ОС – это аппаратный таймер, который задает «тик» работы системы. Период его работы зависит от операционной системы и имеет величину порядка 1 мс. Итак, если выдать hlt, то процессор уснет и будет разбужен следующим тиком таймера или любым прерыванием от аппаратуры компьютера (дисковая система, клавиатура, видеокарта и другое). Поэтому процесс работы процессора выглядит как циклическое выполнение следующих стадий:

  • Выполнить имеющиеся задания;
  • hlt = усыпили;
  • (сон);
  • Аппаратное прерывание = разбудили.

Вроде бы простая технология, ненужное время процессор «спит». Но, как и у людей, степень «сна» бывает разной. Состояние «С1» предполагает, что процессор не выполняет программу, но это не означает его полное бездействие. Он может (до)выполнять некоторые загрузки/выгрузки данных, синхронизацию и обмен сообщениями с другими процессорами/ядрами – все это расходует энергию и говорить о полном «сне» не приходится. Поэтому, на современных процессорах принято несколько режимов «сна» с различной мерой отключения блоков (кэш, контроллер памяти, периферия). Вначале процессор должен выгрузить несохраненные данные из кэш-памяти во внешнюю память, после чего можно остановить работу устройств их поддержки. Основная суть действа - отключить всё, что возможно, но на это требуется время. Если же в процессоре несколько исполнительных ядер, то взять и «так просто» пройти цепочку «С1 -> С3 -> С6 -> С7» не получится. В самом деле, если какое-то ядро усыпили, то из этого факта вовсе не следует, что можно отключать кеш и контроллер памяти, ведь ими пользуются другие ядра. Поэтому, при переключении свойств всего процессора считается, что его состояние равно наименьшему из состояний ядер. Например, если одно ядро выполняет программу (С0), одно усыплено (С1), а остальные отключены (С3-С7), то состояние всего процессора считается как «С0» (минимум из чисел «0»,«1»,«3-7»). Как только «работающее» ядро будет усыплено, то процессор изменит состояние на «С1» («1»,«1»,«3-7»).

Общее впечатление по характеру состояний можно получить по следующей таблице состояний, взято из документации Intel:

При описывании состояний процессора я упорно избегал определения «С1E», довольно часто встречаемого в настройках BIOS. Наверно, пришло время обсудить это «особое» состояние. Работающее ядро находится в состоянии «С0», усыпленное командой «hlt» в «С1», откуда взялось «С1E»? Это то же состояние «С1», но при этом снижается его напряжение и частота. Гм, не находите, довольно любопытно обсуждать частоту усыпленного ядра, если оно не работает? Да нее, смысл есть - сразу по пробуждении ядро будет работать на этой пониженной частоте до тех пор, пока не восстановится нормальное напряжение и появится возможность восстановить и частоту. Впрочем, об этом поговорим попозже. Проблема в том, что оказаться усыпленными и отключенными могут не все, а только некоторые ядра, а потому состояние «процессора» (не путайте с «ядром») не является столь уж очевидным. Ранее приводился пример с одним активным, одним уснувшим и несколькими отключенными ядрами. При этом состояние «процессора», с точки зрения переключения мощности, будет «активным», хоть часть ядер «спят». Довольно несуразно, но это происходит из того факта, что на процессор делают только один источник питания, а потому устанавливать разные напряжения для различных ядер невозможно. Сколько бы ядер ни «спало» и насколько «сильно» - это не важно, контроллер источника питания обязан обеспечить тот уровень напряжения, чтобы работающее ядро обеспечило нормальное функционирование.

Состояние «С1E» может быть отключено в BIOS, тогда ядра (и весь процессор) по команде «уснуть» от операционной системы будут переходить в состояние «С1». Иначе – в «С1Е». С точки зрения функционирования особых отличий между «С1» и «С1E» нет, кроме того, что в последнем устанавливается низкое напряжение – снижается мощность потребления.

В нормальном режиме работы ядра могут находиться в различном состоянии, но весь процессор только в двух - «активном» и «усыпленном» «С1х». Операционная система при работе не может отключить все ядра, хоть одно, но останется «не отключенным» – а потому состояния выше «С1х» для всего процессора не применяются и используются только для режима «сна» и «выключения» всей операционной системы (компьютера).

Зачем же нам нужны состояния отключения («С3»- «С7»), если в них могут попадать только ядра, а не весь процессор? Из-за функции турборазгона. Intel продвигает технологию автоматического разгона процессора, если в нём работают не все ядра. Довольно логично, ведь «TDP» на процессор прописан достаточно четко и превышать его нельзя. Но, коль скоро работают не все ядра, то оставшиеся можно подразогнать, с одновременным повышением напряжения - «TDP» превышен не будет, а программа станет выполняться быстрее. Для описания меры авторазгона составляется список «количество активных ядер» = «множитель» и контроллер процессора сам переустанавливает множитель на ядра в зависимости от их состояния. К чему я? Так вот, активными считаются ядра в состоянии «С0» - «С1х». А значит, для повышения производительности процессора операционная система должна отправлять неиспользуемые ядра не в «сон», а в «отключение» (С3-С7), иначе «турборазгон» окажется весьма спорным.

Кроме разной степени «усыпления» операционная система может снижать потребление и для активных ядер (состояние «С0») путем изменения (понижения) частоты их работы. При этом снижается как производительность, так и мощность потребления. Довольно неприятно терять скорость работы, но разве она кому-то нужна, если процессор практически ничего не делает?

Процессор и источник питания

В начале статьи мы немножко «пробежались» по технологиям энергосбережения, все они основаны на изменении напряжении питания процессора. Вроде бы, простая вещь - взять и поменять напряжение, но после внимательного изучения вопроса начинают всплывать неприятные моменты. Для питания процессора используется импульсный преобразователь, что явно подразумевает наличие сглаживающего дросселя (точнее дросселей, фаз же несколько) и демпферных конденсаторов ощутимой емкости. Процессор потребляет большой ток, до «сотен» ампер, а потому к качеству и количеству конденсаторов предъявляются жесткие требования. Типичная емкость конденсаторов колеблется в интервале пять-восемь тысяч микрофарад. Коль скоро в цепи участвует LC контур, то колебательный процесс неизбежен.

Ранее процессоры и их источник питания мало «общались» друг с другом. Процессор лишь выставлял VID (Идентификатор напряжения), а преобразователь источника питания переводил код в нужное напряжение и стабилизировал его на шинах процессора. Причем, довольно часто в цепь по передачи VID «вклинивалась» микросхема мониторинга и контроля (MIO), которая могла переназначить или модифицировать VID. А именно, она могла пропускать код VID из процессора, или подменять его на постоянное значение. В эпоху Core2 именно так и работал механизм разгона, отсюда вытекали два режима функционирования – или работает энергосбережение, но нельзя изменить (повысить) напряжение на процессоре, или напряжение можно выставить любым, но оно уже не сможет снижаться в простое. Отдельные микросхемы MIO, кроме режима «замены», могли использовать VID от процессора с добавлением смещения, что позволяло разгонять процессор и сохранить функцию снижения напряжения в простое, но таких MIO существовало не много, да и не все они могли работать нормально. Например, в MIO Winbond такая функция была реализована, но при попытке поставить любое смещение, не равное нулю, компьютер перегружался. В более новых процессорах это «упрощенная» технология была изменена и часть контроллера преобразователя переместилась в процессор. Если подумать, то это довольно логично, хотя и звучит дико. Процессор «знает» про себя всё, когда и что ему надо делать и насколько ему нужно какое напряжение. Фраза звучит несколько размыто, но в процессоре действительно много изменений в этой области и продвинутые режимы турборазгона лишь верхушка айсберга. Процессор знает ток потребления от источника питания, но это уже давно не новость, ограничение предельной мощности (тока) было реализовано уже в «Nehalem». К слову – в качестве датчика тока использовался фрагмент трассировки шины питания, падение на нем. В последующих моделях процессоров блок контроля мощности был существенно расширен. К сожалению, сообщить что-то интересное по данному вопросу крайне затруднительно, Intel не хочет делиться этой информацией. Единственно, что нельзя утаить – процессор общается с контроллером очень плотно и, фактически, сам устанавливает для себя напряжение. Это и раньше так было, но теперь он это делает активно и постоянно. Как бесплатный бонус – теперь можно программно знать о той мощности, которая потребляется процессором и некоторыми его частями.

Управление напряжением

Значительная часть контроллера питания находится в самом процессоре и он может отслеживать и корректировать напряжения по тем законам, которые ему нужны. Вторая часть контроллера располагается на материнской плате, как оно было всегда, но теперь ее функции несколько изменились. Ранее процессор указывал источнику питания выставить нужное ему напряжение и полагал, что это будет выполнено. После перехода на VR12 ситуация изменилась, микросхема контроллера постоянно «отчитывается» о текущих режимах работы (напряжение, ток, температура), а управление процессором условий его работы осуществляется крайне оперативно.

Посмотрим, как же происходит изменение напряжения:

В данном случае изображен процесс повышения напряжения с низкого (простой) в нормальное значение (активный). Изначально был выставлении VID для состояния простоя и для повышения напряжения процессор начинает увеличивать VID (идентификатор напряжения, а не само напряжение) на «1» с небольшой выдержкой между сменой числа. При этом полезно знать две характеристики – размер «шага» по напряжению и «время установления», необходимое на стабилизацию напряжения. Можно вычислить и привести конкретные значения dV и dT, но в этом нет необходимости, существует обобщенный параметр «SlewRate». Он указывает скорость нарастания напряжения в единицу времени. Для контроллера указывается его две разновидности:

  • Fast Slew Rate
  • Slow Slew Rate

Контроллер может управлять напряжением с различной скоростью и эти два параметра задают свойства для двух разных режимов работы.

  • «Fast Slew Rate» настраивается в зависимости от особенностей и возможностей преобразователя. В спецификации VR12 указано, что эта настройка должна быть не медленнее 10 мВ / мкс (за одну микросекунду напряжение поменяется на 10 мВ, за 10 мкс на 100 мВ и т.д.).
  • «Slow Slew Rate» в четыре раза медленнее «Fast Slew Rate», что означает скорость изменения 2.5 мВ/мкс.

Время для времени установки нового напряжения можно получить по следующему соотношению:

Формула состоит из двух частей. Первая (VID/SlewRate) определяет время установки напряжения по VID, вторая (3*RC) характеризуется выходным сопротивлением источника питания и емкостью сглаживающих конденсаторов. С первым всё более-менее просто, процессор «тикает» VID от начального значения до конечного с известной периодичностью, а вот вторая составляющая формулы гораздо интереснее. У любого источника сигнала существует такая характеристика, как «выходное сопротивление». Ничего идеального в природе не бывает, нулевого выходного сопротивления не существует в природе. Преобразователь процессора стоится из элементов с очень хорошими характеристиками, иначе они не смогли бы обеспечить приемлемый уровень тепловых потерь, я уж не говорю о поддержке качественного напряжения. Ток потребления современных процессоров очень большой величины, да еще и рабочее напряжение постоянно снижается, что крайне усложняет разработку преобразователей. В принципе, выходное сопротивление источника питания посчитать не сложно – достаточно сложить сопротивление транзисторов (нижнего ключа), дросселей и поделить на количество фаз. При этом стоит увеличить полученную цифру на 15-30% из-за потерь в трассировке. Увы, токи большие, а сопротивление меди весьма конечно. При этом следует учесть, что расчеты основаны на выходном сопротивлении без учета уровня стабилизации обратной связи. Существует т.н. схема LLC (LoadLine Calibration), которая задает величину выходного сопротивления с точки зрения всего преобразователя (с учетом обратной связи). Как следствие, расчетное выходное сопротивление элементов преобразователя может быть как больше, так и меньше получаемого значения – всё зависит от настройки обратной связи. К слову, это означает, что качество примененных компонентов (транзисторов, дросселей, конденсаторов) уже не сказывается на стабильности напряжения питания процессора? Увы, обратная связь определяет характеристики источника питания для стационарного процесса. При резком изменении напряжения или тока потребления процессора обратная связь не способна оперативно исправить напряжение на выходе, ведь ее быстродействие ограничено. А потому, качественные компоненты все так же важны, они отвечают за «динамику».

Для сглаживания пульсаций и бросков тока потребления процессора по шине питания устанавливается множество конденсаторов высокого качества. В последние несколько лет основным элементом является электролитический конденсатор с твердым диэлектриком. Кроме положительных свойств в виде низкого последовательного сопротивления (ESR) и способности долго работать при большом импульсном токе, это принесло и недостатки – сниженная номинальная емкость и концентрированная встроенная последовательная индуктивность (ESL).

Из приведенной выше формулы вытекает ряд интересных наблюдений, стоит на них остановиться. Вполне очевидно, что время установки напряжения зависит от величины изменения напряжения и той скорости, с которой преобразователь это напряжение устанавливает, но вот часть «RC» явно указывает на то, что процессор прекрасно осведомлен о напряжении на шине питания. К тому же, «R» есть не что иное, как широко известное «LLC» (Load Line Calibration). Технически оно является выходным сопротивлением преобразователя. Обычно данный параметр настраивается в BIOS и общепринятое мнение гласит – ставь его «сильнее», чтобы напряжение процессора не снижалось под нагрузкой.

Слова-слова, это скучно. Возьмем модель некоего «среднего» преобразователя процессора и посмотрим модель.

На схеме прослеживаются три 'строчки' – симулируется работа при трех значениях выходного сопротивления преобразователя:

  • (зеленый график). Высокое выходное сопротивление, LLC=«Low»;
  • (синий график). Примерно оптимальное выходное сопротивление, LLC=«High»;
  • (морская волна). Выходное сопротивление явно мало, LLC в самой «высокой» настройке.

Данное распределение дано условно, но «где-то» соответствует действительности.

Немного по представленным элементам схемы.

Резисторы R1-3 определяют выходное сопротивление источника (Rвых) - 2 мОм, 1 мОм и 0.5 мОм; источники V2-V4 симулируют компенсацию снижения напряжения из-за выходного сопротивления. Остальные же элементы не изменяются для разных вариантов схем:

  • V1 - источник напряжения, формирует импульсное напряжение трапециоидальной формы;
  • L1-3 – индуктивность сглаживающего дросселя (с учетом нескольких фаз);
  • R4-6 – сопротивление нагрузки источника питания, т.е. «процессор»;
  • С1-3 – номинальная емкость сглаживающих конденсаторов;
  • R7-9 – ESR этих конденсаторов.

Источники V2-4 поставлены для того, чтобы получить одинаковое напряжение на нагрузке при различном выходном сопротивлении, ведь чем выше Rвых , тем сильнее снижается напряжение. Если для Rвых=0.5-1 мОм это 30-60 мВ (не много), то Rвых=2мОм приводит к потерям в 115 мВ, а это уже явный перебор и нормальное функционирование процессора наверняка окажется под вопросом. Впрочем, посмотрим на результат симуляции.

Гм. Результат хоть и ожидаемый, но это не делает его менее неприятным. Чем быстрее меняется напряжение и ниже выходное сопротивление, тем больше выбросы по фронтам. Причина кроется в наличии дросселей и сглаживающих конденсаторов, причем избавиться от них невозможно - они являются обязательными элементами преобразователя. При смене уровня напряжения происходит заряд конденсаторов и через них протекает большой ток. Попробуем прикинуть, какая должна быть величина тока, чтобы зарядить конденсаторы емкостью 6000 мкФ. У нас два варианта, «Fast Slew Rate» (10 мВ/мкс) и «Slow Slew Rate» (2.5 мВ/мкс).

  • «Fast»: 10 мВ/мкс * 6000 мкФ = (10 *10e-3/10e-6) * (6*10e-3) = 60 А.
  • «Slow»: 2.5 мВ/мкс * 6000 мкФ = (2.5 *10e-3/10e-6) * (6*10e-3) = 15 А.

Расчеты весьма условны и не учитывают паразитные составляющие сглаживающих конденсаторов (ESR, ESL). Реальные величины токов наверняка окажутся в несколько раз меньше, но порядок чисел сохранится. Суть сглаживающих конденсаторов – сглаживать напряжение, уж простите мне эту тавтологию. Конденсаторы должны поддерживать неизменный уровень, но если преобразователь «захочет» поменять напряжение, то это неизбежно вызовет конфликт, который отчетливо проявил себя на рассмотренной симуляции – на одном фронте напряжение превышает необходимое (что неприятно, но терпимо), на другом недопустимо сваливается вниз. Процессор вовсе не лампочка, для его «зависания» достаточно снизить напряжение на очень короткое время и появится ошибка. Если частота процессора 4 ГГц, то за 20 мкс переходного процесса он может выполнить порядка 100 тысяч инструкций на каждом ядре.

По результатам симуляции позвольте сделать ряд наблюдений, может они окажутся кому-нибудь интересными:

  • Снижение выходного сопротивления (настройка LLC) улучшает стабильность усредненной величины напряжения питания процессора (а именно это показывают программные и аппаратные приборы измерения напряжения), но эта стабильность только кажущаяся – амплитуда выбросов резко возрастает;
  • Более мощный преобразователь процессора означает повышенное количество сглаживающих конденсаторов, а это приводит к возрастанию тока их перезарядки при смене напряжений, что приводит к возрастанию помех на шине питания;
  • Лучше использовать «Slew Rate» = «Slow», вместо «Fast».

Довольно неожиданные выводы, «общепринятые» рекомендации говорят об обратном. Впрочем, данные я выложил, и вы можете принять собственное решение.

План электропитания

Процессор выделяет тепло во время работы и это нормально, но в состоянии простоя получать ту же рассеиваемую мощность как то уже не хочется. И дело не в экономии электричества – повышенный нагрев означает работу вентиляторов системы охлаждения на высоких оборотах, что резко снижает комфортность работы за таким компьютером. Хочется отметить, что при обычном использовании компьютера бОльшую часть времени процессор простаивает и получить более тихий компьютер вполне реально. Для снижения потребления в состоянии простоя надо выдать команду hlt, для чего в древние времена Windows 9x применялись сторонние программы типа «Watefall Pro», «CpuIdle» и другие. В наше время операционные системы уже давно «умеют» выдавать команду hlt в простое, поэтому проблем быть не должно. Даже больше, в Windows Vista было введено такое понятие, как «План электропитания». К слову, нечто похожее поддерживали и более ранние выпуски Windows, но, извините, назвать это чудное исполнение ‘работающим решением’ язык не поворачивается. Впрочем, ‘как-то’ оно работало и в простое процессор останавливался, а что еще надо от данной технологии?

Увы, надо много. Пока процессор в системе был один, проблем не было. Но, с увеличением количества ядер, так же начали множиться и проблемы, во вроде бы отлаженных местах. Алгоритм «есть что делать - процессор работает, нет задач – hlt» хорошо и надежно работает в однопроцессорной (одноядерной) системе, а как быть, если ядер несколько? Какой из ядер запускать на выполнение – тот же, что работал до этого, или разбудить другой? Если первое, то меньше накладных расходов на переключение контекста, но выше нагрев этого ядра. Если второе, то наоборот. Впрочем, с двумя ядрами не так уж и сложно, но сейчас восемь (и больше) ядер не является чем-то необычным.

Итак, в Windows Vista, как и в более поздних операционных системах, присутствуют три плана электропитания:

  • Экономия энергии: Минимальное энергопотребление за счет уменьшения производительности компьютера, когда это возможно;
  • Высокая производительность: Максимальная производительность, но может потребоваться больше энергии;
  • Сбалансированный: Автоматическое соблюдение баланса между производительностью и энергопотреблением на пригодном для этого оборудовании.

Не знаю как вам, а мне эти слова ничего не говорят, за терминами может скрываться что угодно. Что ж, остается только взять и посмотреть.

Тестовый стенд

Основные компоненты:

  • Материнская плата: GIGABYTE GA-Z77X-UD3H (Z77, LGA 1155, rev. 1.0, BIOS версия F11);
  • Процессор: Intel Core i7-3570K @4.2 ГГц;
  • Оперативная память: 2 х 4 Гбайта DDR-III 1333 МГц Hynix Original (DDR3-1800, 9-9-10);
  • Накопитель SSD: RAID0 2х (CRUCIAL M4 CT064M4SSD2, 64 Гбайт), полоса 32 Кбайт;
  • Накопитель HDD1: Western Digital VelociRaptor WD1500HLFS-01G6U (150 Гбайт, 10000 об/мин);
  • Накопитель HDD2: Western Digital EADS WD15EADS-00P8B0 (1.5 Тбайт, 5400 об/мин);
  • Операционная система: Windows 7 х64 SP1;
  • RAMDISK: Primo Ramdisk, версия 5.5.0.

Остальные компоненты оказывают небольшое влияние на получаемые результаты, а потому вряд ли стоит их указывать.

Проверка производительности

Для начала стоит определиться с инструментарием, точнее – что же стоит измерять. Вполне очевидно, что при запуске программ класса «Linpack» процессор выставит максимальный множитель и будет работать с одной и той же производительностью при любых настройках энергосберегающих технологий (C1E и EIST) и на любом плане электропитания. Здесь надо выбрать менее загружающие и более реалистическое применение. В качестве «большой» нагрузки подойдет Linpack в режиме AVX, для «средней» можно применить BurnK7, запущенный в количестве, равный имеющимся ядрам процессора. Для «низкой» стоит взять что-то, что загружает процессор, но долго и старательно кого-нибудь «ждет». В этом случае можно воспользоваться каким-нибудь тестом производительности дисковой системы, но их деятельность (а нам нужна нагрузка на процессор) окажется весьма непредсказуемой. Впрочем, такое стоит попробовать. Для четкой нагрузки с долгим ожиданием (т.е. простоем) процессора лучше выбрать свойство, которое не зависит от механических устройств, например системная память. Тест памяти вызовет большой поток обмена с модулями памяти, а этот процесс очень долгий. Процессор, с одной стороны, будет полностью загружен работой, а с другой – находиться в постоянном ожидании данных от контроллера памяти. А потому, в качестве «низкой» нагрузки я использую тест памяти TestMem5, благо принцип его работы я хорошо знаю и неприятных сюрпризов быть не должно.

Что именно стоит измерять? Основное применение домашнего компьютера - игры, «интернет», некоторые музыкальные и графические редакторы. Последнее, как и использование компьютера для перекодирования видео-контента (и подобное), вызывает постоянную загрузку процессора длительное время, а потому при любом плане электропитания и настройках аппаратуры по энергосбережению результат должен быть одинаков. К слову, в играх тоже. Выходит, что и проверять нечего, статью можно заканчивать? Ну уж нет. Позвольте проявить необъяснимую упертость и проверить то, что «и так очевидно должно работать».

«Импульсная» нагрузка

Для выполнения каких-либо действий на процессоре выполняется некоторые программы, которые его загружают на различное время. При необходимости вывода на экран сообщения «Hello World!» его обсчет и растеризация не займут много процессорного времени, чего не скажешь о перекодировании фильма. При некотором упрощении можно сказать, что нагрузка на процессор в обоих случаях была одной и той же (нормальной), различие существует лишь в продолжительности. Коль скоро загрузка одинакова, то и производительность должна быть равной. Но в этом есть один нюанс - «импульсная» нагрузка «обрамляется» простоем и из этого могут произрасти проблемы.

В качестве теста можно использовать ‘что-либо’, нагружающее процессор на очень небольшой интервал времени. Например, программу тестирования производительности дисковой системы. К сожалению, большинство существующих программ выполняют замеры длительное время, что затрудняет симулирования «импульсной» нагрузки. А потому, опять же, придется воспользоваться собственной программой. «HAB» подойдет, в программе можно регулировать качество (т.е. время) выполнения, что подходит для нашей задачи. В качестве информации будет использоваться «задержка доступа канала передачи данных» (в программе это «IO Delay») для режима потокового чтения из буфера дискового накопителя. Этот характеристика вычисляет время, необходимое на выполнение довольно сложной последовательности действий от запроса данных до их получения. Сюда входит время на инициализацию протокола передачи, обработку команды контроллером дискового накопителя и сама передача данных по различным аппаратным интерфейсам. Понятно, что работа контроллера диска не зависит от скоростных характеристик процессора, но интерфейсы передачи данных (PCI Express и внутренние) могут при простое переходить в состояние сна, как и система кеширования процессора. Я ничего не имею против остановки неиспользуемых интерфейсов, но их пробуждение не происходит мгновенно (хоть и весьма быстро).

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

Задержка доступа

RAID0 SSD

Название плана электропитания
(или специального режима)
Задержка повторного
чтения, мкс
Задержка операции
чтения, мкс
Время
доступа, мкс
Ссылка на
картинку
Экономия энергии 13 16 134 картинка
Сбалансированный 5.1 6.7 136 картинка
Высокая производительность 4.6 7.7 138 картинка
Экспериментальный 3.6 7.2 132 картинка
(Отключение режима простоя) 3.6 4.1 109 картинка

RAMDISK

Название плана электропитания
(или специального режима)
Задержка повторного
чтения, мкс
Задержка операции
чтения, мкс
Время
доступа, мкс
Ссылка на
картинку
Экономия энергии 3.6 3.1 1070 картинка
Сбалансированный 2.5 2.5 1080 картинка
Высокая производительность 1 1 1030 картинка
Экспериментальный 1 1 1000 картинка
(Отключение режима простоя) 1 1 949 картинка

HDD WD1500HLFS-01G6U (150 Гбайт, 10000 об/мин), AHCI

Название плана электропитания
(или специального режима)
Задержка повторного
чтения, мкс
Задержка операции
чтения, мкс
Время
доступа, мс
Ссылка на
картинку
Экономия энергии 36 52 7.06 картинка
Сбалансированный 31 54 7.26 картинка
Высокая производительность 34 54 7.17 картинка
Экспериментальный 34 57 7.19 картинка
(Отключение режима простоя) 32 40 7.20 картинка

При измерении времени доступа имелось несколько нюансов, которые следует отметить. RAMDISK был сформирован «гибридным», с размешением его части на HDD (WD1500HLFS), что сказалось на времени доступа порядка 1мс. Подобное измерение для «RAMDISK» кажется кощунством, но не для нашей задачи. При выполнении запросов программа RAMDISK исчерпывает ресурсы выделенной памяти и начинает переводить адресацию на физический диск. С одной стороны, это тормозит обмен, а с другой «импульсно» нагружает диск, что нам и надо. Поэтому, не пугайтесь большому времени доступа при выполнении этого теста.

Тест в HAB дает две цифры задержек обмена - по доступу (повторное чтение) и по самой операции чтения. Первое значение более-менее осмыслено, а второе весьма условно. Причина заключается в алгоритмах работы контроллера диска - при повторяющемся запросе данных контроллер диска передает те данные, что имеются у него в выходном буфере. Если же запросы чтения касаются разных секторов, то здесь начинает вмешиваться блок работы с носителем данных (в контроллере диска) и время доступа меняется весьма произвольно. По той же причине следует игнорировать столбец «Linear Read» и «CPU Usage». Для получения более-менее адекватных данных по этим характеристикам следует выполнять тест достаточно долго, чтобы обеспечить получение усредненных значений. К слову, система ввода-вывода Windows кеширует процедуры записи, а потому тестирование на «импульсную запись» проводить смысла нет.

Наблюдения и выводы из полученных данных:

RAID0 SSD

  • «Экономия энергии»: задержка больше остальных режимов в 2.5 раза, что прямо пропорционально соотношению частот работы/простоя процессора, как 4.2 Ггц / 1.6 ГГц = 2.6. Это говорит о том, что «короткие» дисковые операции всегда выполняются на минимальной частоте процессора. К слову, 1.6 ГГц не самая низкая частота для простоя, у SB-E она еще ниже;
  • «Сбалансированный»: характеристики явно лучше «Экономия энергии»;
  • «Высокая производительность»: повторяет свойства «Сбалансированный», но, извините, это вовсе не самая высокая производительность!;
  • «Экспериментальный»: время повторного доступа значительно меньше всех предыдущих планов электропитания и совпадает с режимом отключенного простоя;
  • «Отключение режима простоя»: коль скоро простой отключен, то отсутствует время на «засыпание» и «просыпание». Как следствие, самая высокая производительность.

Все «стандартные» планы не могут установить максимальную производительность компьютера (интересно, зачем они так назвали план электропитания, если он не может это выполнить?).

Смена плана электропитания влияет как на задержки обмена, что логично, так и на время доступа. Я не ожидал, что отключение простоя так сильно скажется на этом параметре (109 мкс против 136 мкс), но еще больше меня удивил факт даже незначительного улучшения для плана «Экспериментальный», с учетом того, что ничего 'особенного' не установлено.

RAMDISK

  • «Экономия энергии»: традиционное снижение производительности, но теперь уже в 3.6 раза, что нельзя объяснить только снижением частоты с 4.2 до 1.6;
  • «Сбалансированный». Второй сюрприз - этот план оказывается таким же «тормозом», как и «Экономия энергии». Вот не ожидал;
  • «Высокая производительность» - «Экспериментальный» - «Отключение режима простоя»: результаты одни и те же, что говорит о работе процессора в максимальном режиме производительности.

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

HDD

Все режимы показали равную производительность, кроме состояния с отключенным режимом простоя, где задержка операции чтения снижается почти в 1.5 раза (40 мкс против 55 мкс). Причина 'провала' всех планов? HDD устройство медленное и за время получения следующего сектора данных процессор успеет весьма успешно 'выспаться'. Как видно из данных тестирования, изменение настроек плана не позволяет никак повлиять на режим засыпания - обмен с диском длится так долго, что и самый низкий порог не может оградить процессор от перехода в IDLE.

Впрочем, проведенный тест достаточно «синтетический» и может показаться не слишком полезным. Что ж, возьмем нечто «приземленное», скажем файловые операции в FAR.

Производительность операций с дисковой системой

При работе в Windows часто используются файловые операции. Переместить, что-то найти и прочее – обычные действия. Для измерения производительности можно использовать какие-либо программы, но большинство из них работают в потоковом режиме с множеством оптимизаций по скорости (различные виды многопотокового доступа и упреждения), что может представить «синтетические» результаты. Это не слишком удачно, лучше взять нечто обычное, скажем файловый менеджер. Почему именно FAR? Это не важно, можно выбрать и что-то другое, либо выполнять операции «проводником», как вам будет удобнее. Сам FAR интересен тем, что он развивается длительное время и претерпел сильное развитие, в том числе и по работе с дисками. Для выполнения тестирования я уже возьму очень старую версию 1.71, в которой явно отсутствуют какие-либо оптимизации по работе с диском (впрочем, может я и ошибаюсь), да и размер блока доступа явно 'неудобен' для современных операционных систем, всего лишь 64 Кб. Как альтернатива берется FAR одной из последних сборок (версия 3.0). В данном тесте интересно то, что программа делает одно и то же, но с разной степенью оптимизации по работе с дисковой системой. Можно сказать, что этот тест симулирует «неоптимизированный» (FAR 1.71) и «оптимизированный?»(FAR 3.0) режим доступа к дискам.

Для проверки быстродействия будет использоваться две ситуации:

  • Копирование каталога «Windows 7» (46200 файлов, 6.4 Гб) в nul. В действительности, будет просто выполняться считывание файлов без их записи;
  • Поиск в каталоге «Windows 7» файлов по маске «*.*» с 'длинной непонятной' строкой. Совпадений не было.

Во время выполнения операций осуществлялась полная (100%) загрузка одного ядра процессора. Что интересно, в режиме поиска средний блок доступа оказался 31 Кбайт.

RAID0 SSD

Название плана электропитания
(или специального режима)
Время чтения
в FAR 1.71, сек
Время чтения
в FAR 3.0, сек
Время поиска
в FAR 3.0, сек
Экономия энергии 115 28 228
Сбалансированный 111 27 89
Высокая производительность 111 27 88
Экспериментальный 110 27 87
(Отключение режима простоя) 111 27 87

HDD WD1500HLFS-01G6U (150 Гбайт, 10000 об/мин), AHCI, раздел в начале диска.

Название плана электропитания
(или специального режима)
Время чтения
в FAR 1.71, сек
Время чтения
в FAR 3.0, сек
Время поиска
в FAR 3.0, сек
Экономия энергии 238 71 230
Сбалансированный 149 57 109
Высокая производительность 143 54 109
Экспериментальный 142 54 95
(Отключение режима простоя) 142 54 93

HDD WD15EADS-00P8B0 (1.5 Тбайт, 5400 об/мин), AHCI.

Название плана электропитания
(или специального режима)
Время чтения
в FAR 1.71, сек
Время чтения
в FAR 3.0, сек
Время поиска
в FAR 3.0, сек
Экономия энергии 235 102 236
Сбалансированный 175 87 108
Высокая производительность 167 82 108
Экспериментальный 166 82 107
(Отключение режима простоя) 166 82 107

Тест на RAMDISK не проводится - операции выполняются довольно длительное время, а устройство «RAMDISK» не имеет времени ожидания, что означает обязательный перевод процессора в состояние максимальной производительности и равенство результатов для всех планов электропитания. Говоря «всех» я не имел в виду план «Экономия энергии», он всегда 'отличается' от остальных.

Наблюдения:

  • Во всех случаях план «Экспериментальный» (как и «Отключение режима простоя») имеет наибольшую производительность;
  • «Сбалансированный» и «Высокая производительность» оказывают близкие характеристики, но не максимальные - обратите внимание на время поиска для HDD WD1500HLFS;
  • «Экономия энергии» ведет себя 'традиционно' (снижение производительности в 1.5-2.5 раза), особенно это хорошо видно по времени поиска.

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

Производительность и мощность потребления ядер процессора

В простое потребление процессора по ядрам одинаково для всех планов (2.3 Вт), кроме специального режима с отключенным простоем (43 Вт; 4.2 ГГц, 1.2 В).

Если померить потребление ядер для случая крайне низкой, низкой и существенной нагрузки, то получатся следующие цифры:

Название плана электропитания
(или специального режима)
MPC, пауза, Вт MPC, просмотр, Вт BurnK7 x1, Вт BurnK7 x2, Вт BurnK7 x4, Вт
Экономия энергии 4.6 6 6.3 30 51
Сбалансированный 4.6 6 19 32 51
Высокая производительность 5.8 7.5 19 32 51
Экспериментальный 3.3 4.6 18.5 30 51
(Отключение режима простоя) 43 43 45 47 51

Под «MPC» понимался просмотр фильма в формате Xvid (624x352 23.98fps) плеером «Media Player Classic - Homecinema» версии 1.2.908.0

Довольно любопытно выглядит план «Экспериментальный» - он умудряется экономить мощность потребления даже при серьезной нагрузке, причем без потери производительности. Причина понятна, если учесть его отличие от других планов - блокировку переопределения ядра исполнения. Эта настройка позволяет отключать неиспользуемые ядра. Типичная картинка загрузки по ядрам (Linpack AVX x86, матрица 10.000) выглядит следующим образом:

Поток выполняется на ядре №1, изредка переключаясь на ядро №0. Остальные ядра остановлены. Если включить переопределение ядра исполнения, то загрузка равномерно распределяется по ядрам и ни одно из них не останавливается. Смотрится это совершенно некрасиво:

Теперь перейдем к высокой нагрузке с различным количеством потоков. Для этого хорошо взять Linpack AVX x86 с большим размером матрицы. Почему «х86», если операционная система «х64» и можно запустить более эффективную редакцию Linpack «х64»? Да, Linpack «х64» показывает выше скорость работы по преобразованию матриц, только нам интересен нагрев процессора, а тут лидерство у редакции Linpack «х86».

Размер матрицы выбран 10.000, что не является максимальным значением под «х86», но увеличение с 10.000 на 15.000 крайне незначительно увеличивает мощность потребления процессора, при этом весьма затягивая процесс тестирования.

Производительность Linpack AVX x86 для объема матрицы 10.000 и различного количества потоков:

Название плана электропитания
(или специального режима)
Один поток,
мощность, Вт
Один поток,
скорость, ГФлопс
Два потока,
мощность, Вт
Два потока, скорость, ГФлопс
Экономия энергии 8.6 11.03 41 49.83
Сбалансированный 26 27.93 44 49.86
Высокая производительность 26 27.99 44 49.8
Экспериментальный 26 27.95 43 49.87
(Отключение режима простоя) 53 27.94 60 49.81

Из всех планов выделяется «Экспериментальный», он показывает удивительно низкое потребление при однопоточной нагрузке. Разгадку можно наблюдать в соседнем столбце этого же теста - здесь падает как мощность потребления, так и производительность. Т.е. при однопоточной нагрузке этот план электропитания всегда выполняется на самой низкой частоте процессора. Вот и разгадка его "экономичности".

Если посмотреть загрузку ядер при выполнении теста производительности дисковых операций на RAID0 SSD при долговременной нагрузке:

Для плана «Экономия энергии» один поток выполняется всегда на минимальном множителе, о чем явно говорит снижение синей линии - частоты процессора. Кроме того, из данного графика отчетливо видна причина снижения производительности для первого плана - загрузка всего процессора составила 25%, что означает полную занятость одного исполнительного потока. Коль скоро тест является однопоточным приложением, то это означает, что были израсходованы все резервы процессора и сама программа просто не смогла работать с максимальной эффективностью. Всё же «RAID0 SSD» означает скорость работы порядка 900 Мб/с, и это очень много. Не так уж недавно такую пропускную способность имела системная память компьютера! К слову, это сравнение показывает отсутствие смысла в дальнейшем повышении производительности дисковой системы - процессор с трудом справляется и с двумя не самыми быстрыми SSD. Обратите внимание на время выполнения операций в FAR, приведенные ранее - HDD проиграл SSD не так уж и сильно.

Тестовый план, в качестве которого выполнялся «Экспериментальный» имеет схожие характеристики с «Высокая производительность», но по численным данным потребление в нём было все же чуть меньше, из-за парковки ядер. График мелковат, поэтому приходится отмечать в тексте.

Простой: снижение производительности, почему?

По всем рассмотренным ранее тестам план «Отключение режима простоя» показывал максимальную производительность, но почему остальные (нормальные) планы так от него отстают? По идее, выход из «С1» (простоя) в «С0» (активное состояние) должен происходить практически мгновенно. На включение тактирования требуется буквально «несколько тиков». К слову, перевод ядра в режим простоя не сказывается на производительности - раз ядро останавливают, то это означает, что оно не нужно системе, а потому затраты времени на перевод в простой не важно. Впрочем, переключение C0->C1 выполняется очень быстро.

Возьмем небольшую «импульсную» нагрузку и посмотрим, на какой частоте выполняется это приложение. Тест диска все же «синтетика», лучше взять что-то более реальное, например просмотр фильма. Скажем, тот же MPC с фильмом, что использовался ранее. При просмотре загрузка одного ядра находится в интервале 9-15 процентов.

Для измерения средней частоты я использовал программу «C&QCPU», но примерно такие же (но не 'эти') значения показывают другие программы, снимающие частоту процессора по данным счетчика производительности.

Множитель Измерено Множитель Измерено Множитель Измерено
16 16/16 25 23.7/23.4 34 29.2/27.5
17 16.9/16.9 26 24.5/24.5 35 30/27.6
18 17.8/17.7 27 25.4/25.2 36 30.2/27.6
19 18.7/18.7 28 26.1/25.9 37 30.5/27.6
20 19.5/19.5 29 26.8/26.4 38 30.9/27.6
21 20.4/20.3 30 27.6/27.3 39 31.1/27.6
22 21.3/21.2 31 28.2/27.6 40 31.6/27.6
23 22.1/22 32 28.9/27.5 41 32/27.6
24 22.9/22.7 33 28.9/27.5 42 32.5/27.7

При проведении теста устанавливался множитель процессора, от минимального (16) до максимального (42). При этом измерялся «усредненный» множитель выполняемой программы. В колонке «Измерено» указаны данные при двух значениях «Slew Rate»: «Fast» и «Slow».

До множителя «28» измеренные значения среднего значения множителя почти совпадает с устанавливаемым значением, а вот в дальнейшем рост множителя замедляется. При «Slew Rate» = «Fast» 'эффективное' значение множителя поднимается только до 32.5 (при установленном 42), а для «Slew Rate» = «Slow» вообще останавливается на «28». Причина?

Дело в том, что в BIOS по умолчанию разрешено состояние «C1E», поэтому ядра в простое снижают напряжение (и частоту). Это уменьшает потребление процессора, но цену этого вы видите перед собой. При «просыпании» процессор должен повысить напряжение до номинального, только тогда можно будет восстановить номинальную производительность, на что требуется время. Почему же цифры «замораживаются» на множителе «28»? Если напряжение/частоту надо повышать, то вполне очевидно увидеть равномерный ряд цифр от 16 до 42, а здесь четкое «28». Взглянем на соответствие множителя и напряжения процессора:

От множителя 16 до 29 происходит медленное и незначительное повышение напряжения, которое, скорее всего, вызвано работой схемы компенсации выходного сопротивления источника питания (Load Line Calibration). От 29 до 38 напряжение линейно повышается, почти пропорционально частоте. Выше множителя 38 напряжение практически не возрастает и ее увеличение, скорее всего, вызвано теми же причинами, что и на интервале 16-29 (LLC).

Итак, что же происходит при выходе процессора из «C1E»? Контроллер начинает повышать напряжение, но интервал от 16 до 29 он проходит очень быстро, может быть и 'мгновенно', а потому множитель «29» устанавливается практически сразу. Увы, далее начинается медленный процесс повышения напряжения, причем в режиме «Slew Rate» = «Slow» он идет в четыре раза медленнее, чем в «Fast». Время, необходимое на установку номинального множителя можно посчитать исходя из разности напряжений и скорости «Slew Rate» (для «Fast» это 10 мВ/мкс, «Slow» = 2.5 мВ/мкс). При вычислении надо учитывать выходное сопротивление источника питания и емкость сглаживающих конденсаторов, потому точные цифры представить весьма затруднительно. Загрузка процессора при просмотре фильма в MPC составляет 10 % (приведенная к ядру), т.е. задача выполнялась лишь 10% от кванта времени выполнения, что оказывается недостаточным для выставления сколь-нибудь значимой величины напряжения.

Если отключить в BIOS состояние «C1E», то измеренный множитель будет практически совпадать с устанавливаемым («41.6» к «42»), что подтверждает предложенную гипотезу о причине сниженного множителя.

Не совсем по теме, но просто интересно - при снятии зависимости множитель-напряжение я посмотрел и мощность потребления для различной нагрузки:

Различия планов электропитания

В операционных системах «Windows Vista» и последующих, представлено несколько планов электропитания, присутствующих изначально. Это «Экономия энергии», «Сбалансированный» и «Высокая производительность». Кроме названия, эти планы отличаются свойствами, которые можно изменить через настройку плана электропитания. К сожалению, характеристик слишком много, да и большая часть их «попрятана», поэтому использование такого пути оптимизации крайне неприятно и вызывает лишь негативные эмоции. Посмотрите, сколько настроек находится в разделе «Управление питанием процессора». А на самом деле их 35. С помощью правки реестра все эти параметры можно сделать видимыми, но использовать подобный интерфейс для просмотра и редактирования 35 параметров ... я попробовал, и категорически не советую. Что же, пришлось сесть и написать простенький редактор:

Программа может управлять как самими планами (копировать, переименовывать, удалять), так и менять настройки любого из них. Т.к. параметров очень много и их свойства подчас трудно отождествить, то основной акцент программы направлен на получение максимума полезной информации. Для этого все свойства представлены на одной странице в виде списка, а в верхнем окне выводится описание того, что сейчас выполняется. Вся справочная информация представлена компанией Microsoft, я лишь ее вывожу, поэтому ... увы, что есть, то и есть. Кроме этого, в редактируемой строке приводятся начальные значения этого параметра для трех стандартных планов («Экономия энергии», «Сбалансированный» и «Высокая производительность»). Думаю, разберетесь, только одно пожелание - вначале сделайте тестовый план и уж затем его правьте. Приведу ссылку на программу - PowerSchemeEd. Можно много говорить, но проще и ценнее попробовать всё самому. Редактор есть, дерзайте.

Посмотрим на страницу настроек столь 'ненавистного' плана «Экономия энергии» в сравнении с более-менее адекватным «Сбалансированный»:

По большей части планы совпадают, но если присмотреться к деталям, то для «Экономия энергии» наблюдается следующее:

  • Порог повышения производительности процессора (№01) составляет 90%, что означает - только в том случае, когда задача выполняется всё время кванта, засчитывать за «загруженный»;
  • Сброс загрузки (№04) считается, когда задача выполняется менее 60 % кванта;
  • Время, которое требуется для принятия решения о том, что ядро занято (№25) составляет 3 отсчета, а не 1;
  • Время до понижения частоты (№33) равно 2 против 10 для «Сбалансированный», что означает агрессивный сброс частот.

Существуют и другие отличия, они выделены цветом, но самые важные я перечислил. В качестве одного из терминов используется понятие «квант». Это то время, которое дается задаче (потоку) на выполнение. Подробнее по этому и другим сопутствующим вопросам можно почитать в интересной статье Крис Касперски «Разгон и торможение Windows NT». По окончанию кванта процессор (ядро) начинает выполнять другую задачу, если она имеется, или возобновляет выполнение прежней. Квант - это то время, когда задача не может быть прервана, как правило. Если задаче делать нечего, то она может вернуть процессорное время в операционную систему отправившись «спать» по какому-нибудь критерию. Понятно, что при этом задача не будет выполняться весь квант и операционная система запустит другую задачу в оставшееся время кванта, или отправит «спать» ядро, если нет ничего на исполнение. Так и получается «низкая» загрузка процессора, например в «Media Player Classic», использовавшаяся ранее. Программа должна формировать 25 кадров в секунду, но что ей делать после того, когда целевое количество кадров сформировано? Правильно, отправлять кадр на вывод и «спать» до вывода следующего кадра. При этом процессор (ядро) загружается полностью, но на очень короткий интервал времени, почти всегда меньше кванта. С точки зрения контроля электропитания это означает, что загрузка менее кванта (для плана «Экономия энергии» этот порог 90%), а потому может засчитываться как «низкая». В принципе, всё логично и правильно - если операционная система загружает ядро полностью, то частоту следует повышать. Аналогичный процесс следует производить при снижении загрузки ядра.

Переходим ко второму моменту - «Переопределение ядра приостановки» (№27). По умолчанию во всех планах переопределение включено. Это позволяет операционной системе переключать выполняемую задачу по ядрам. Здесь можно пропустить очевидную глупость со сбросом и перезагрузкой кешированных данных в старом-новом ядрах исполнения, о такой 'мелочи' великие M$ давно уже не задумываются, скорость работы программ для Microsoft не является приоритетным. Итак, к чему приводит ... стоп-стоп, далеко не все знают о механизме переключения. Для каждого выполняемого потока формируется таблица описания свойств и регистров, в которую входит аппаратные ресурсы (например TSS) и чисто программные, описательные. По окончанию кванта операционная система (планировщик) останавливает и сохраняет контекст текущего потока в заданной области памяти. После этого выбирает следующий поток (или этот же) и запускает его на выполнение. Но, операционной системе совершенно не важно на каком процессоре начать выполнение потока - есть контекст с регистрами, ОС может загрузить указатель в любой свободный процессор. Настройка «Переопределение ядра приостановки» говорит о том, стараться ли использовать прежний номер ядра, или 'пнуть куда-нибудь'. С этим вроде бы просто и переходим к третьему нюансу.

Задача может постоянно загружать процессор, но различные программы мониторинга, в том числе и «Диспетчер задач Windows» покажут странную картину - загрузка разбрасывается по ядрам, причем неравномерно и весьма случайно. Отчего это происходит? Задача может исполняться квант времени, обычно ее не тревожат, но по его окончании никто не гарантирует, что операционная система не сменит ядро исполнения на другое. Но это не всё, ядро исполнения могут сменить и в пределах исполнения кванта! При своей работе программа вызывает функции Windows и других приложений. Фактически, это означает применение каких-то 'исполнительных модулей', для запуска и возврата из них используется тот же контекст потока, который упоминался ранее. Что мешает при возврате из 'внешней библиотеки' запустить контекст на другом ядре? Да ничего, причем так и происходит. Это означает, что исполняемая задача начинает «гулять по ядрам». Это не важно при полностью загруженном процессоре, но когда установлен многоядерный процессор, а задача однопотоковая, то скачки по ядрам приведут к тому, что ни на одном ядре не будет полностью исполняться квант. А именно, операционная система будет считать загрузку менее 100%. Парадокс, однопоточная задача, на 100% занимает одно ядро, но из-за постоянного перекидывания ни одно из исполнительных ядер не считается занятым. Господа из Microsoft считают это правильным. Ну ... им виднее. Но не на моем компьютере, пожалуйста.

Возвращаемся к планам электропитания. Для «Экономия энергии» установлен порог загрузки 90% для признания ядра загруженным. Только в специальных программах тестов производительности используются алгоритмы БЕЗ вызова функций операционной системы в основном вычислительном цикле, в остальных программах запросы Win32API (DirectX и прочие) следуют постоянно. Это означает, что поток не всегда сможет исполняться весь квант на одном и том же ядре. Впрочем, 'иногда' цикл выполнения может не захватывать вызов сторонних функций и весь квант поток останется на своем ядре.

Краткие выводы - исполняемый поток может выполняться на одном ядре как весь квант, так и лишь его часть. В последнем случае загрузка этого ядра окажется менее 100% (при условии, что других задач не выполняется).

Кроме порога загрузки в плане электропитания указывается еще время до принятия решения. Для «Экономия энергии» порог повышения указан как 90%, а время = 3. Это означает, что загруженным считается ядро, которое занято не менее 90 процентов времени кванта на протяжении трех последовательных квантов. Для одноядерного процессора противоречий нет - если три кванта процессор был загружен полностью, то следует повышать его частоту. Но, если ядер больше одного, скажем два? Положим, выполняется однопоточная задача, один квант на №0 ядре, второй на №1 ядре, третий снова на №0 ядре. В результате, хотя имеется и полная однопоточная загрузка, но по 0 и 1 ядру в трех соседних квантах нет полной загрузки. Как следствие, система электропитания говорит, что процессор не загружен и оставляет частоту низкой. Нечто подобное мы уже наблюдали в тестировании. Для обхода этого недостатка надо уменьшить время реакции системы до одного кванта, как это установлено в других планах («Сбалансированный», «Высокая производительность»

). Впрочем, это не обеспечивает полной гарантии, что Windows не посчитает нагрузку «низкой»! Как отмечал ранее, планировщик может переключить ядро исполнения до окончания кванта по вызову функции (точнее, не 'может', а 'делает', но не для всех функций). А это приводит к тому, что загрузка ядер может быть постоянно не полной. И чем больше ядер в процессоре, тем выше мера «разбрасывания» и шанс получить «низкая загрузка». Для обхода этого можно снизить «порог увеличения производительности» (№01) с 60% до, скажем, 100%/N. Где "N" - количество ядер в процессоре. К примеру, для плана «Высокая производительность» этот параметр установлен в 30% («Сбалансированный» = 60%). Короче, сами можете оценить, насколько это оптимально для современных четырехядерных процессоров, я уж не говорю о включенной «HT» (Hyper-Threading). В последнем случае число ядер удваивается и план электропитания вполне может честно снизить частоту, посчитав загрузку процессора «низкой». Что же, еще один вариант провала процессоров при включении «HT».

Чтобы завершить вопрос о плане «Экономия энергии» обратите внимание еще и на порог понижения производительности, он установлен в 60 %. При этом время снижения производительности составляет 2 тика, против 10 у «Сбалансированный». Фактически это означает, что система электропитания будет легко и быстро скидывать частоту процессора при установке не-максимальной загрузки. Короче говоря, план «Экономия энергии» неохотно повышает частоту под сильной нагрузкой и очень быстро ее скидывает при малейшем снижении нагрузки.

Послесловие

Несмотря на название раздела, хочется рассказать, с чего все началось. Есть такая игра, «Borderlands», которой я посвятил много времени. Графика и сюжет обычный, можно сказать 'скучный', но разработчики вложили столько юмора, что очень хочется в нее играть. Можно это назвать 'фанатизмом', но ... жанр юмористических игр класса «Action» крайне ограничен, вспоминается только «MDK» (номер 1 и 2) и всё. «Стрелялок» много, но всякие Doom2 быстро приедаются, не смотря на их высокое качество исполнения. Впрочем, я не собираюсь никого агитировать, гиблое это дело.

После очередного 'upgrade' я запустил игрушку и получил какие-то неочевидные результаты. Нет, 'FPS' выросли, тесты проходят на 'все хорошо', но уровень играбельности мне что-то не понравился. Т.к. я играю в эту игру, гм, довольно давно, то отчетливо ощущаю, как должно прорисовываться окружение. Вначале подумал о проблемах с драйверами и (далее следует долгий список 'призраков', которые могут быть в компьютере). Думаю, все с таким сталкивались, сие называется «пляска с бубном». К слову, это состояние обычно заканчивается тем, что проблема или сама собой рассасывается или решение не обнаруживается и приходится смириться. Но не в этом случае. При игре отмечались случаи падения FPS с довольно медленным восстановлением, а такое поведение не свойственно играм. Обычно скорость прорисовки напрямую зависит от сложности картинки или происходящих действий. Иногда игра выполняет подгрузку уровней или другую 'незапланированную' деятельность, но к таким дефектам быстро привыкаешь и они легко отождествляются. В моем случае снижение FPS было 'странным'. Это очевидно однопоточное приложение, к тому же включена опция Vsync, что приводило к загрузке процессора в районе 60-100% (приведенная к одному ядру). Как вы уже догадываетесь по материалу статьи, это приводило к понижению множителя, ибо план электропитания («Сбалансированный», у всех установлен именно он) считал эту нагрузку низкой и понижал частоту процессора. Как следствие, FPS в игре проваливались ниже 60. Понятно, что при этом план электропитания получал полную загрузку и множитель процессора повышался, чем и сопровождался плавный рост FPS до номинала, но это происходило уже 'после', и провал играбельности был четко заметен. Дело в том, что снижение частоты работы видеокарты сказывается на скорость формирования кадров почти линейно и других последствий не содержит, а вот с процессором всё сложнее - кроме графики он обсчитывает очень много других вещей (положение объектов, их 'жизнь'), поэтому снижение и последующее повышение частоты процессора сказываются на все процессы самым причудливым образом. В принципе, именно это я и наблюдал - игра шла 'странно', очень неприятно.

Для обхода этого дефекта можно заблокировать управление множителем в Windows и управлять им самостоятельно, что было реализовано в одном моем проекте C&Q***, но программа поддерживала только процессоры Core2, что давно уже пенрестало быть актуальным (хотя, я продолжаю ею пользоваться на компьютере на работе). Что же, делать для себя, а потому и время потратить не зазорно. Адаптировал программу под Core i (SB*/IB), получилось что-то работоспособное и удовлетворяло требованиям. Но, хотелось разобраться с проблемой, тем более, что обходной способ (с помощью C&QCPU) у меня уже был. Что же, я 'полез' в планы электропитания "и тут волосы встали дыбом". Жуть. Век какой, а технологии до сих пор расчитаны на одноядерный процессор! План «Экономия энергии» из экономного стал просто "опусти свой компьютер", ибо постоянные 1.6 ГГц для слегка разогнанного до 4.2 ГГц процессора - как это назвать? С планом «Сбалансированный», который установлен активным у всех пользователей Windows, тоже 'всё хорошо'. Скажем так - именно на нем я получил проблемы в игре. Поставить план «Высокая производительность» и понадеяться, что загрузка ядер постоянно будет держаться выше 30% ? Кроме того, «Переопределение ядра приостановки» явно вредная настройка, ее очевидно надо вЫключать. Я понимаю, что Microsoft хотели сделать равномерную распределение нагрузки по ядрам, но - давайте я сам буду распоряжаться своим процессором, хорошо? К слову, я немного посмотрел, как ведет себя операционная система с отключенным переопределением ядра исполнения. Как следует из логики, так и выполняется (что странно) - эта настройка не является догмой, а лишь пожеланием. При занятости целевого ядра операционная система перекинет ядро исполнения на свободное. Это не «Affinity» (маска соответствия) ядер, а лишь критерий - оставлять исполняться на том ядре, что было, или сменить на другое свободное.

Впрочем, план электропитания - это просто и довольно прозрачно, а вот работа «C1E» откровенно разочаровала. Настолько медленно устанавливается, что все «импульсные» нагрузки проходят очень плохо. Фактически, процессор работает на нижней границе VID (множитель 28), что было бы «неплохо» для неразогнанного Core i5 3570. Сколько там, 3.4 ГГц + турборазгон? Но для фиксированных 4.2 ГГц без каких либо ‘турбо-фич’ переход к 2.8 ГГц означает падение производительности в 4.2/2.8=1.5 раза. Гм, а если разогнали больше? «Импульсные» нагрузки не такая уж и редкость. Поиск файла, переписывание, особенно через интерфейс USB - всё это весьма обыденно. Да и, по большей части компьютер не загружен полностью и, практически, находится в простое. Но это не значит, что на нем не выполняются задачи, требующие быстрой реакции, а "разогнанный по самое" процессор работает на сниженной частоте. Помнится, в древние времена для процессоров Athlon на nForce2 существовала проблема с отключением шины EV67 в состоянии простоя (т.н. "Bus Disconnect"), что не позволяла процессору полноценно уйти в состояние простоя «С1». Включение этой опции снижала температуру процессора, но приводила к скоростным проблемам для «импульсной» нагрузки типа USB Flash, в некоторых случаях скорость обмена резко снижалась. Зачем я об этом вспомнил? На отключение-подключение шины требовалось какое-то время, хоть и ничтожное, но это уже сказывалось на быстродействии компьютера в некоторых областях применения. К слову, для «нагруженных» задач включение "BD" никак не влияло. Дело в том, что «C1E» работает схожим образом и потенциально может привести к аналогичным рудиментам. Конечно, можно провести расширенное тестирование и получить примеры резкого падения производительности в определенных и распространенных областях применения, но надо ли? Деструктивность функции «C1E» показана достаточно четко, ее надо выключить и всё. Будет ли при этом понижаться напряжение в простое? Хороший вопрос, ведь без снижения напряжения утечки в процессоре обеспечат весьма значительную мощность тепловыделения, чего крайне желательно избежать. С точки зрения логики, отключение механизмов «C1E» и «EIST» неизбежно должно привести к отсутствию управления напряжением и оно не должно изменяться (всегда максимум). Результат - повышенные обороты системы охлаждения процессора. Предложить вам самим проверить, будет ли при этом меняться напряжение, или ответить самому? Предлагаю тем, кто хочет самостоятельно разбираться с состояниями, заканчивать читать этот раздел и переходить к выводам.

Для остальных я хочу сказать, что вы слишком ленивы. Интересно же попробовать что-то своими руками. Отключение «C1E» и «EIST» должно приводить к отсутствию управления напряжением, ибо таково трактование соответствующих технологий фирмы Intel. Но это не происходит, напряжение в простое снижается. Причина? Попробую предположить, что контроллер энергосбережения процессора работает несколько «ширше» чем это описано в технологиях «C1E» и «EIST». А именно, по переходу в «C1» (т.к. «C1E» заблокирован, то в состояние «C1E» переключиться нельзя) контроллер начинает медленный процесс автоматического перехода в разновидность состояния «C3», возможно и дальше («C6-7»). Это вытекает из того факта, что при отключенном «C1E» напряжение в простое падает для любого плана электропитания, и при этом нет тех негативных моментов падения производительности для «импульсной» нагрузке, что свойственны включенной «C1E». Кроме того, отключение состояний «C3» - «C7» блокирует снижение напряжения в простое.

Как же можно и управлять напряжением и не получать негативных моментов от замедленного установления номинального значения множителя? Дело в том, что состояние ядер и всего процессора - это не одно и то же. Перевод ядер в простой не означает, что надо снижать напряжение на весть процессор, ведь часть ядер может быть активно. Кроме того, политика работы «C1E» может отличаться от правил функционирования внутреннего контроллера энергосбережения процессора. Технология «C1E» требует, чтобы по этому состоянию ядро (весь процессор) немедленно понижало напряжение. Контроллер может поступать более адекватно, например хранить историю предыдущих состояний и не снижать напряжение в некоторых случаях, если это приводит к падению производительности. Если компьютер находится в простое, то большую часть времени процессор «спит». При очень кратковременных «пробуждениях» какая разница, на сколько времени будет повышено напряжение? Фактически, среднее напряжение так и останется низким. Впрочем, всё это лишь предположения, а не конкретные факты.

Знаете, вспоминается один из дорожных знаков в «Borderlands», очень подходит к современным энергосберегающим технологиям:

Выводы

Для полноценной работы процессора следует обязательно выполнить два условия:

  • В BIOS отключить «C1E», оставив включенным поддержку состояний «C3-C7»;
  • Никогда не устанавливать план электропитания «Экономия энергии».

Serj