Что такое C-состояние Cx в мониторе cpupower? - PullRequest
0 голосов
/ 30 января 2019

Я профилирую приложение на время выполнения на процессоре x86-64 под управлением Linux.Прежде чем приступить к тестированию приложения, я хочу убедиться, что динамическое масштабирование частоты и состояния простоя отключены.

Проверка масштабирования частоты

$ cat /sys/devices/system/cpu/cpufreq/boost
0

Это говорит мне о том, что масштабирование частоты (Intel Turbo Boost или AMD Turbo Core) отключен.Фактически мы установили его на постоянную частоту 2 ГГц, что видно из следующего упражнения.

Проверка работы процессора на холостом ходу

$ cpupower --cpu 0-63 idle-info
CPUidle driver: none

CPUidle governor: menu
analyzing CPU 0:

CPU 0: No idle states

analyzing CPU 1:

CPU 1: No idle states

analyzing CPU 2:

CPU 2: No idle states
...

Итак, состояния простоя отключены.Теперь, когда я уверен, что обе «функции», которые могут вмешиваться в тестирование производительности, отключены, я продолжаю следить за приложением с помощью cpupower.

Но потом, когда я запускаю свое приложение для мониторинга C-состояний,Я вижу, что более 99% времени проводится в состоянии C0, что должно быть.Тем не менее, я также вижу нечто, называемое Cx-состояние, в котором ядра тратят 0,01 - 0,02% времени.

$ cpupower monitor -c ./my_app
./my_app took 32.28017 seconds and exited with status 0
    |Mperf
CPU | C0   | Cx   | Freq
   0| 99.98|  0.02|  1998
  32| 99.98|  0.02|  1998
   1|100.00|  0.00|  1998
  33| 99.99|  0.01|  1998
   2|100.00|  0.00|  1998
  34| 99.99|  0.01|  1998
   3|100.00|  0.00|  1998
  35| 99.99|  0.01|  1998
  ...

Итак, был бы рад понять следующее.

  1. Что такое состояние Cx?И стоит ли мне меньше беспокоиться, глядя на такие низкие цифры?
  2. Существуют ли какие-либо другие функции, кроме масштабирования частоты и холостого хода процессора, о которых мне следует позаботиться (с точки зрения оценки производительности)?1023 * Бонусный вопрос
  3. Что означает CPUidle driver: none?

Редактировать 1

По второму вопросу о дополнительных проблемах во время бенчмаркинга я недавно выяснил, что местныепрерывания таймера на ядре ЦП для целей планирования могут исказить измерения, поэтому CONFIG_NO_HZ_FULL включено в ядре Linux для включения режима без галочек

1 Ответ

0 голосов
/ 31 января 2019

Прелесть программного обеспечения с открытым исходным кодом в том, что вы всегда можете пойти и проверить:)
cpupower monitor использует разные мониторы, монитор mperf определяет этот массив :

static cstate_t mperf_cstates[MPERF_CSTATE_COUNT] = {
    {
        .name           = "C0",
        .desc           = N_("Processor Core not idle"),
        .id         = C0,
        .range          = RANGE_THREAD,
        .get_count_percent  = mperf_get_count_percent,
    },
    {
        .name           = "Cx",
        .desc           = N_("Processor Core in an idle state"),
        .id         = Cx,
        .range          = RANGE_THREAD,
        .get_count_percent  = mperf_get_count_percent,
    },

    {
        .name           = "Freq",
        .desc           = N_("Average Frequency (including boost) in MHz"),
        .id         = AVG_FREQ,
        .range          = RANGE_THREAD,
        .get_count      = mperf_get_count_freq,
    },
};

Вполне логично, что Cx означает любое C-состояние, отличное от C0, то есть любое незанятое состояние (Обратите внимание, что эти состояния не являются состояниями ACPI, хотя большее число является состоянием более глубокого сна -для ACPI выключен C6).

Обратите внимание, как вычисляется Cx :

if (id == Cx)
    *percent = 100.0 - *percent;

Cx является просто дополнением C0.
Это потому, что IA32_M/APERF используемый счетчик не считает в любом C-состоянии, но C0:

C0 TSC Частота тактового счетчика
Увеличивается с фиксированным интервалом (относительно частоты TSC.), когда логический процессор находится в C0.

Аналогичное определение для IA32_APERF приведено в руководствах .


При тестировании можно учитывать множество факторов, возможно, большечем может быть указан в качестве вторичного ответа.
Как правило, при последующем запуске тестируемого кода в кэшах по крайней мере часть данных будет горячей (то же самое для TLB и любого внутреннего кэширования).

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

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


Драйвер CPUIdle - это компонент ядра, управляющий зависящая от платформы часть входа и выхода из / в незанятое состояние.
Для процессоров Intel (и AMD?) ядро ​​может использовать драйвер ACPI processor_idle (если включен )) или intel_idle (который использует mwait).

...