=== Совместное управление производительностью процессоров (CPPC)

Контакт: ShengYi Hung <aokblast@FreeBSD.org> +
Контакт: Olivier Certner <olce@FreeBSD.org>

Совместное управление производительностью процессоров (Collaborative Processor Performance Control, CPPC) — это стандарт, представленный ACPI, позволяющий операционной системе управлять производительностью и, соответственно, эффективностью процессоров благодаря абстрактной шкале производительности, в общем случае не коррелирующей с простыми уровнями частоты и обеспечивающей более тонкую настройку, чем они.
Intel и AMD уже несколько лет предоставляют реализации процессоров с поддержкой ACPI CPPC.

FreeBSD поддерживала включение CPPC, но только для процессоров Intel и позволяла управлять полезным, но очень ограниченным подмножеством его функциональности благодаря драйверу man:hwpstate_intel[4], добавленному в 2020 году.
Автономный выбор целевой производительности аппаратным обеспечением в зависимости от рабочей нагрузки принудительно включён, и только основной соответствующий аппаратный параметр, называемый Efficiency/Performance Preference (EPP), доступен администратору через параметр man:sysctl[8].

Мы добавили поддержку реализации CPPC от AMD в существующий драйвер man:hwpstate_amd[4], который, в отличие от man:hwpstate_intel[4], до сих пор управлял только «обычными» P-состояниями.
Драйвер предоставляет 4 параметра man:sysctl[8]: минимальная производительность, максимальная производительность, желаемая производительность и EPP.
Минимальная, максимальная и желаемая производительность — это значения от 0 до 255, но в зависимости от аппаратного обеспечения эффект может иметь только поддиапазон.
Начальные значения минимальной и максимальной производительности устанавливаются равными границам эффективного поддиапазона в соответствии с указаниями платформы (если они доступны).
Управление EPP служит для выражения предпочтения в сторону эффективности или производительности и представляет собой значение от 0 (максимальное предпочтение производительности) до 255 (максимальное предпочтение эффективности).
Желаемая производительность может быть установлена на любое значение между минимальной и максимальной производительностью или на специальное значение 0 для включения аппаратного автономного выбора целевой производительности в зависимости от текущей рабочей нагрузки.
Управление минимальной производительностью, максимальной производительностью и EPP применяется независимо от того, включён ли автономный выбор или указана конкретная желаемая производительность.
Обратите внимание, что эффект каждой комбинации этих значений зависит от модели процессора, и мы уже смогли наблюдать сильно различающееся поведение на нескольких из них.
Поэтому ожидайте, что вам придётся экспериментировать, чтобы найти значения, подходящие для ваших сценариев использования на конкретной машине.

man:hwpstate_amd[4] включён в ядро `GENERIC` (через man:cpufreq[4]) и использует CPPC, если процессоры поддерживают его, если только явно не указано иное (через параметр `machdep.hwpstate_amd_cppc_enable`).
Следовательно, чтобы избежать регрессии производительности, на данный момент мы решили установить вышеупомянутые параметры управления на максимальную производительность, так как это поведение по умолчанию для традиционной поддержки P-состояний, а также для любого другого драйвера man:cpufreq[4], за исключением man:hwpstate_intel[4] (который в настоящее время принудительно включает аппаратный автономный выбор и устанавливает EPP по умолчанию в `0x80` (50%)).
Это может быть пересмотрено позже, в зависимости от того, сможем ли мы надёжно определить, является ли работающий компьютер ноутбуком.

Следующие шаги:

1. Изменить man:hwpstate_intel[4], чтобы он соответствовал поддержке CPPC от man:hwpstate_amd[4] с точки зрения функциональности и поведения по умолчанию.
   Это включает:
   - Улучшенную обработку ошибок и вывод отладочной информации
   - Предоставление параметров для всех вышеупомянутых элементов управления
   - Изменение шкалы EPP (с процентов на 8-битное значение)
   - Изменение значений по умолчанию
2. Написать справочную страницу для man:hwpstate_amd[4] (тем временем объяснений здесь и встроенной документации параметров man:sysctl[8] должно быть достаточно).
3. Обучить man:powerd[8] параметрам управления CPPC и некоторым простым политикам их установки.
4. Обучить man:cpufreq[4] абстрактным значениям производительности, чтобы предоставить унифицированный интерфейс для их получения или установки.
5. Реализовать в man:cpufreq[4] поддержку настроек на каждый процессор.
6. Выбирать значения управляющих параметров по умолчанию на основе типа платформы (вероятно, из поля `Preferred_PM_Profile` ACPI ``FADT``).
7. Возможно, переместить политики man:powerd[8] в пространство ядра.

Спонсор: Фонд FreeBSD

//
// The FreeBSD Russian Documentation Project
//
// Original EN revision (18.04.2026): 0771c0223246c9d535601c99a435a3f7199a6c45
//
