APU седьмого поколения в ноутбуке тормозит? Решаем проблему.
Собственно начались мои приключения с покупки нового ноутбука DELL Ispiron 5565. Игрушка не то, чтобы мощная, но поработать на ней можно, в том числе и в танки погонять, или в что-то другое зарубиться. Ну я так думал, когда покупал: по ТТХ выглядело вполне не плохо, отзывы вменяемой картины не дали. В общем, прикупил сего зверя...
Моё разочарование наступило сразу. Первой проблемой был медленный хард (нет, он медленнее вообще всего, что у меня было) - но этот вопрос я решил. Второй проблемой оказалось, что я не могу нормально загрузить графику и процессор одновременно!!! Вот с этим и будем разбираться. Сначала теория, кому не интересно - можно пролистать :)
Итак, проблема проистекает из-за кривой таблицы температур для APU седьмого поголения в AMD AGESA и выравнивания TDP фирмварью ноутбука. Вообще это совершенно нормальное поведение: при перегреве сбрасывать частоты, но в нашем случае преподнесён сюрприз: при Tcase в 60 градусов частоты при определенных условиях процессор мог сбросить до 1.2 ГГц! Меня такой расклад решительно не устраивал и я начал копать.
Первым выяснилось, что при 65 градусах отрубается CoreBoost (собственно, это и понятно). Процессор без нагрузки на видео можно гонять сколько угодно, но если дать нагрузку на дискретное видео - частоты начиная с 70 градусов падают и не восстанавливаются даже при охлаждении камня до 50 градусов. Вот так номер...
Вообще, чтобы было понятно: TDP самого APU составляет 15 ватт. При нагрузке на интегрированное видео процессор выходит за эти пределы и чтобы компенсировать тепловыделение GPU сбрасываются частоты CPU. Вроде бы ничего критичного, это известное и документированное поведение APU, виной этому - BAPM (Balanced Advanced Power Management). Но если дается нагрузка на дискретную графику, такой проблемы быть не должно: по крайней мере, APU 6 поколения так себя не вели. Но, в нашем случае, видимо, AGESA учитывает температуру и дискретного чипа (У меня графика AMD+AMD), и так же начинает сброс частот.
Как вообще работает снижение/повышение частот и Core Boost? Очень просто. У процессора есть несколько P-состояний. В каждом из состояний на процессор подается определенное напряжение и он работает на определенной частоте. Система в повседневной работе в зависимости от нагрузки на процессор переводит его в то или иное состояние - от производительности до энергоэффективтности. Существуют еще и три ступени Core Boost: когда нагружены все ядра и процессор холодный, когда нагружена половина ядер и холодный процессор и когда нагружено только одно ядро. Переход в эти состояния контролируется уже не ОС, а firmware. В случае перегрева, Firmware переводит процессор в более энергоэффективные состояния, чтобы снизить нагрев. Всё в общем-то верно, за исключением того, что радиатор в большинстве не дорогих ноутбуков один и нагревающаяся дискретная графика по прежнему разогревает и процессор. А вот таблица температур для графики отличается: если для процессора критической температура считается в 90-99 градусов, для графики это до 120 градусов. Тепловыделение процесссора составляет 15 ватт, но графика разогревает тот же радиатор еще 30 ваттами тепла.
Меня бы устроило снижение производительности процесссора при приближении к критическим температурам, но как этого добиться? Стандартные утилиты типа AMD OverDrive уже устарели и не поддерживают новые APU, в BIOS там у ноутбука даже покопаться в общем негде. Да, я его распотрошил, посмотрел, какие опции там скрыты и оказалось, что даже не будь BIOS залочен, ничего полезного там для меня не оказалось бы.
Так как таблицу температур я поправить не могу, то все, что мне оставалось сделать - запретить переход процессора в энергоэффективные режимы. Это можно сделать только напрямую редактируя регистры процессора.
Из готового софта мне попался только AMD MSR Tweaker, но эта штука не так удобна для использования. Искомый продукт нашелся в блоге у японского товарища: http://hbkim.blog.so-net.ne.jp/2016-02-12 - утилита изначально была на японском, и стоило определенных трудов найти англицкую версию от того же разработчика.
Для функционирования утилиты требуется драйвер, который в комплект поставки не входит: WinRing0 (этот драйвер для доступа ПО к нулевому кольцу защиты процессора). Найти его можно на GitHub: https://github.com/QCute/WinRing0 . Для не желающих разбираться я сделал уже готовый архив: https://yadi.sk/d/2cJ_wlII3Sih9y
Итак, приступим. Распаковываем архив (я не положил туда 32-битные версии, ибо не считаю актуальным. Так же следует оговориться, что утилита не будет работать на WinXP) и запускаем утилиту.
Вот так выглядит главное окно программы. Теперь мы видим, какие режимы работы процессора зашиты для нашего девайса. Переходим на вкладку P-State.
Собственно говоря, здесь вы можете отключить или включить некоторые функции и отредактировать напряжения/частоты. Следует оговориться, что в некоторых случаях изменение значений приводит к зависаниям/синему экрану. Лично я для себя сохранил конфиг по умолчанию (кнопка Save) и производительный конфиг. После запуска программы выбираем Load, находим наш конфиг и можно закрыть программу.
Теперь несколько советов. P-state upper limit и P-state lower limit - запрет на переход процессора в состояние выше/ниже указанного. Работает для меня весьма не стабильно.
Что я сделал: я отредактировал себе производительный конфиг так:
Теперь система не тормозит в играх и под нагрузками. Если у вас хреновая система охлаждения - может вырубиться от перегрева, ну и вообще подобные эксперименты весьма чреваты. Контролировать же температуры и частоты предлагается с OpenHardware Monitor: http://openhardwaremonitor.org/files/openhardwaremonitor-v0....
Вот такие дела.