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

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

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

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

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

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

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

  1. Изменить hwpstate_intel(4), чтобы он соответствовал поддержке CPPC от hwpstate_amd(4) с точки зрения функциональности и поведения по умолчанию. Это включает:

    • Улучшенную обработку ошибок и вывод отладочной информации

    • Предоставление параметров для всех вышеупомянутых элементов управления

    • Изменение шкалы EPP (с процентов на 8-битное значение)

    • Изменение значений по умолчанию

  2. Написать справочную страницу для hwpstate_amd(4) (тем временем объяснений здесь и встроенной документации параметров sysctl(8) должно быть достаточно).

  3. Обучить powerd(8) параметрам управления CPPC и некоторым простым политикам их установки.

  4. Обучить cpufreq(4) абстрактным значениям производительности, чтобы предоставить унифицированный интерфейс для их получения или установки.

  5. Реализовать в cpufreq(4) поддержку настроек на каждый процессор.

  6. Выбирать значения управляющих параметров по умолчанию на основе типа платформы (вероятно, из поля Preferred_PM_Profile ACPI FADT).

  7. Возможно, переместить политики powerd(8) в пространство ядра.

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


Последнее изменение: 22 апреля 2026 г. от Vladlen Popolitov