Чому деякі моделі процесорних процесорів для сімейства Intel 6 (Core 2, Pentium M) не підтримуються Intel_idle?


25

Я налаштовував своє ядро ​​Linux для процесорів Intel Core 2 Quad (Yorkfield), і я помітив такі повідомлення від dmesg:

[    0.019526] cpuidle: using governor menu
[    0.531691] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.550918] intel_idle: does not run on family 6 model 23
[    0.554415] tsc: Marking TSC unstable due to TSC halts in idle

PowerTop показує лише стани C1, C2 та C3, які використовуються для пакету та окремих ядер:

          Package   |            CPU 0
POLL        0.0%    | POLL        0.0%    0.1 ms
C1          0.0%    | C1          0.0%    0.0 ms
C2          8.2%    | C2          9.9%    0.4 ms
C3         84.9%    | C3         82.5%    0.9 ms

                    |            CPU 1
                    | POLL        0.1%    1.6 ms
                    | C1          0.0%    1.5 ms
                    | C2          9.6%    0.4 ms
                    | C3         82.7%    1.0 ms

                    |            CPU 2
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          7.2%    0.3 ms
                    | C3         86.5%    1.0 ms

                    |            CPU 3
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          5.9%    0.3 ms
                    | C3         87.7%    1.0 ms

Цікаво, я запитав sysfsі виявив, що застарілий acpi_idleдрайвер використовується (я очікував побачити intel_idleдрайвер):

cat /sys/devices/system/cpu/cpuidle/current_driver

acpi_idle

Дивлячись на вихідний код ядра, поточний драйвер intel_idle містить повідомлення про налагодження, зокрема, зазначаючи, що деякі моделі сімейства Intel 6 не підтримуються драйвером:

if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 == 6)
    pr_debug("does not run on family %d model %d\n", boot_cpu_data.x86, boot_cpu_data.x86_model);

Рання вилка (22 листопада 2010 р.) Intel_idle.c демонструє очікувану підтримку процесорів Core 2 (модель 23 насправді охоплює і Core 2 Duo, і Quad):

#ifdef FUTURE_USE
    case 0x17:  /* 23 - Core 2 Duo */
        lapic_timer_reliable_states = (1 << 2) | (1 << 1); /* C2, C1 */
#endif

Наведений вище код був вилучений в грудні 2010 року здійснити .

На жаль, майже немає документації у вихідному коді, тому немає пояснень щодо відсутності підтримки функцій очікування в цих процесорах.

Моя поточна конфігурація ядра така:

CONFIG_SMP=y
CONFIG_MCORE2=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_ACPI_PROCESSOR_IDLE=y
CONFIG_CPU_IDLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
CONFIG_INTEL_IDLE=y

Моє запитання таке:

  • Чи є певна апаратна причина, через яку процесори Core 2 не підтримуються intel_idle?
  • Чи є більш підходящий спосіб налаштувати ядро ​​для оптимальної підтримки процесора в режимі очікування для цього сімейства процесорів (окрім відключення підтримки intel_idle)?

Відповіді:


28

Під час дослідження станів живлення процесорів Core 2 (" C-state ") мені вдалося реалізувати підтримку більшості застарілих процесорів Intel Core / Core 2. Тут задокументовано повну реалізацію (патч Linux) з усією довідковою інформацією.

Оскільки я накопичував більше інформації про ці процесори, стало очевидним, що C-стани, підтримувані в моделях (ях) Core 2, є набагато складнішими, ніж ті, як у попередніх, так і пізніших процесорах. Вони відомі як поліпшені C-стани (або " CxE "), які включають пакет, окремі ядра та інші компоненти на чіпсеті (наприклад, пам'ять). На момент intel_idleзвільнення драйвера код не був особливо зрілим, і було випущено кілька процесорів Core 2, які мали суперечливу підтримку C-state.

Деякі переконливі відомості про підтримку Core 2 Solo / Duo C-state знайдені в цій статті з 2006 року . Це стосується підтримки в Windows, однак це вказує на надійну апаратну підтримку C-стану цих процесорів. Інформація про Кентсфілд суперечить фактичному номеру моделі, тому я вважаю, що вони насправді мають на увазі Йоркфілд нижче:

... чотириядерний процесор Intel Core 2 Extreme (Kentsfield) підтримує всі п’ять технологій та енергозбереження - вдосконалений Intel SpeedStep (EIST), термічний монітор 1 (TM1) та тепловий монітор 2 (TM2), старий годинник на замовлення Модуляція (ODCM), а також поліпшені стани C (CxE). Порівняно з процесорами Intel Pentium 4 та Pentium D 600, 800 та 900, які характеризуються лише станом Enhanced Halt (C1), ця функція була розширена в процесорах Intel Core 2 (а також процесорах Intel Core Solo / Duo) для всі можливі непрацюючі стани процесора, включаючи Stop Grant (C2), Deep Sleep (C3) та Deeper Sleep (C4).

У цій статті з 2008 року викладено підтримку одноядерних C-станів для багатоядерних процесорів Intel, включаючи Core 2 Duo та Core 2 Quad (додаткові корисні довідкові відомості були знайдені в цій книжці Dell ):

Основний C-стан - це апаратний C-стан. Існує кілька основних режимів очікування, наприклад CC1 і CC3. Як ми знаємо, сучасний сучасний процесор має декілька ядер, наприклад, нещодавно випущений мобільний процесор Core Duo T5000 / T7000, відомий як Пенрін у деяких колах. Те, що ми звикли вважати процесором / процесором, насправді має декілька загальних процесорів загального призначення. Intel Core Duo має 2 ядра процесорного чіпа. Intel Core-2 Quad має 4 таких ядра на мікросхемі процесора. Кожне з цих ядер має власний режим холостого ходу. Це має сенс, оскільки одне ядро ​​може простоювати, а інше важко працювати над потоком. Отже, основний C-стан - це режим очікування одного з цих ядер.

Я знайшов презентацію 2010 року від Intel, яка надає деяку додаткову інформацію про intel_idleдрайвер, але, на жаль, не пояснює відсутність підтримки для Core 2:

Цей EXPERIMENTAL драйвер замінює acpi_idle на процесорах Intel Atom, процесорах Intel Core i3 / i5 / i7 та пов'язаних з ними процесорах Intel Xeon. Він не підтримує процесор Intel Core2 або раніше.

Вищевказана презентація вказує на те, що intel_idleдрайвер - це реалізація "меню" управління процесора, що впливає на конфігурацію ядра Linux (тобто, CONFIG_CPU_IDLE_GOV_LADDERпроти CONFIG_CPU_IDLE_GOV_MENU). Відмінності між драбинками та керуючими меню коротко описані у цій відповіді .

Dell має корисну статтю, в якій перераховано сумісність C-C6 до C6:

Режими C1 до C3 працюють, в основному, різаючи тактові сигнали, що використовуються всередині процесора, тоді як режими C4 - C6 працюють за рахунок зниження напруги процесора. "Покращені" режими можуть одночасно виконувати обидва.

Mode   Name                   CPUs
C0     Operating State        All CPUs
C1     Halt                   486DX4 and above
C1E    Enhanced Halt          All socket LGA775 CPUs
C1E    —                      Turion 64, 65-nm Athlon X2 and Phenom CPUs
C2     Stop Grant             486DX4 and above
C2     Stop Clock             Only 486DX4, Pentium, Pentium MMX, K5, K6, K6-2, K6-III
C2E    Extended Stop Grant    Core 2 Duo and above (Intel only)
C3     Sleep                  Pentium II, Athlon and above, but not on Core 2 Duo E4000 and E6000
C3     Deep Sleep             Pentium II and above, but not on Core 2 Duo E4000 and E6000; Turion 64
C3     AltVID                 AMD Turion 64
C4     Deeper Sleep           Pentium M and above, but not on Core 2 Duo E4000 and E6000 series; AMD Turion 64
C4E/C5 Enhanced Deeper Sleep  Core Solo, Core Duo and 45-nm mobile Core 2 Duo only
C6     Deep Power Down        45-nm mobile Core 2 Duo only

З цієї таблиці (яку я пізніше виявив неправильною в деяких випадках), випливає, що існували різні відмінності в підтримці C-стану з процесорами Core 2 (зауважте, що майже всі процесори Core 2 є Socket LGA775, за винятком Core 2 Solo SU3500, що є процесорами Socket BGA956 та Merom / Penryn. Процесори Solo / Duo "Intel Core" - один із Socket PBGA479 або PPGA478).

Додатковий виняток із таблиці знайдено в цій статті :

Core 2 Duo E8500 від Intel підтримує C-держави C2 і C4, тоді як Core 2 Extreme QX9650 цього не робить.

Цікаво, що QX9650 - це процесор Yorkfield (сімейство Intel 6, модель 23, крок 6). Для довідки, мій Q9550S ​​- це сімейство Intel 6, модель 23 (0x17), крок 10, який нібито підтримує стан C4 (підтверджений експериментами). Крім того, Core 2 Solo U3500 має ідентичний CPUID (сімейство, модель, кроковий) до Q9550S, але він доступний у не-LGA775 розетці, що заплутує інтерпретацію вищевказаної таблиці.

Зрозуміло, що CPUID повинен використовуватися принаймні до крокового кроку, щоб виявити підтримку C-стану для цієї моделі процесора, а в деяких випадках, яка може бути недостатньою (на даний момент невизначена).

Підпис методу для призначення інформації про процесор в режимі очікування:

#define ICPU(model, cpu) \
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&cpu }

Де modelперераховано в asm / intel-family.h . Розглядаючи цей заголовочний файл, я бачу, що процесорам Intel призначені 8-бітні ідентифікатори, які, як видається, відповідають номерам моделі Intel Family 6:

#define INTEL_FAM6_CORE2_PENRYN 0x17

З усього вищесказаного ми маємо Intel Family 6, модель 23 (0x17) INTEL_FAM6_CORE2_PENRYN. Цього повинно бути достатньо для визначення стану очікування для більшості процесорів Model 23, але це може спричинити проблеми з QX9650, як зазначено вище.

Отже, мінімально, кожну групу процесорів, що мають чіткий набір C-стану, потрібно було б визначити у цьому списку.

Zagacki та Ponnala, Intel Technology Journal 12 (3): 219-227, 2008 вказують на те, що процесори Yorkfield дійсно підтримують C2 та C4. Вони також, схоже, вказують на те, що специфікація ACPI 3.0a підтримує переходи лише між C-станами C0, C1, C2 та C3, і, напевно, може також обмежити acpi_idleдрайвер Linux переходами між цим обмеженим набором С-станів. Однак ця стаття вказує, що це не завжди може бути так:

Майте на увазі, що це стан ACPI C, а не процесор, тому ACPI C3 може бути HW C6 тощо.

Також зверніть увагу:

Окрім самого процесора, оскільки C4 - це синхронізовані зусилля між основними компонентами кремнію в платформі, чіпсет Intel Q45 Express досягає 28-відсоткового підвищення потужності.

Чипсет, який я використовую, дійсно є чіпсет Intel Q45 Express.

Документація Intel про стан MWAIT є короткою , але підтверджує поведінку ACPI, специфічну для BIOS:

Специфічні для процесора C-стани, визначені у розширеннях MWAIT, можуть відображати визначені ACPI типи C-станів (C0, C1, C2, C3). Зв'язок відображення залежить від визначення С-стану за допомогою процесора та піддається впливу OSPM в BIOS за допомогою таблиці _CST, визначеної ACPI.

Моє тлумачення вищевказаної таблиці (у поєднанні з таблицею з Вікіпедії , asm / intel-family.h та вищезазначеними статтями) таке:

Модель 9 0x09 ( Pentium M і Celeron M ):

  • Банії: C0, C1, C2, C3, C4

Модель 13 0x0D ( Pentium M і Celeron M ):

  • Дотан, Стейлі: C0, C1, C2, C3, C4

Модель 14 0x0E INTEL_FAM6_CORE_YONAH ( Enhanced Pentium M , Enhanced Celeron M або Intel Core ):

  • Йона ( Core Solo , Core Duo ): C0, C1, C2, C3, C4, C4E / C5

Модель 15 0x0F INTEL_FAM6_CORE2_MEROM (деякі Core 2 та Pentium Dual-Core ):

  • Kentsfield, Merom, Conroe, Allendale ( E2xxx / E4xxx та Core 2 Duo E6xxx, T7xxxx / T8xxxx , Core 2 Extreme QX6xxx , Core 2 Quad Q6xxx ): C0, C1, C1E, C2, C2E

Модель 23 0x17 INTEL_FAM6_CORE2_PENRYN ( Core 2 ):

  • Мером-Л / Пенрін-Л:?
  • Пенрін ( Core 2 Duo 45-нм мобільний ): C0, C1, C1E, C2, C2E, C3, C4, C4E / C5, C6
  • Йоркфілд ( Core 2 Extreme QX9650 ): C0, C1, C1E, C2E ?, C3
  • Wolfdale / Yorkfield ( Core 2 Quad , C2Q Xeon , Core 2 Duo E5xxx / E7xxx / E8xxx , Pentium Dual-Core E6xxx , Celeron Dual-Core ): C0, C1, C1E, C2, C2E, C3, C4

З огляду на велику різноманітність підтримки C-стану в межах лише процесорів Core 2, видно, що відсутність послідовної підтримки C-станів, можливо, була причиною того, що вони не намагалися повністю підтримувати їх через intel_idleдрайвер. Я хотів би повністю заповнити вищенаведений список для всього рядка Core 2.

Це насправді не задовольняє відповідь, тому що змушує мене замислитись про те, як багато непотрібної енергії використовується і надлишкове тепло було вироблено (і досі є) генерованим, не використовуючи в повній мірі надійних енергозберігаючих MWAIT C-станів на цих процесорах.

Chattopadhyay та ін. 2018, енергоефективні високопродуктивні процесори: останні підходи до розробки зелених високоефективних обчислень , варто відзначити конкретну поведінку, яку я шукаю в чіпсеті Q45 Express:

Пакет C-стану (PC0-PC10) - Коли обчислювальні домени, Core і Graphics (GPU) не працюють, процесор має можливість додаткової економії електроенергії на нестандартному та платформенному рівнях, наприклад, промивання ТОВ та вимкнення живлення контролер пам'яті та DRAM IO, а в деякому стані весь процесор можна вимкнути, тоді як його стан зберігається на постійній доменній потужності.

Як тест, я вставив у рядок 127 linux / drivers / idle / intel_idle.c наступне :

static struct cpuidle_state conroe_cstates[] = {
    {
        .name = "C1",
        .desc = "MWAIT 0x00",
        .flags = MWAIT2flg(0x00),
        .exit_latency = 3,
        .target_residency = 6,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C1E",
        .desc = "MWAIT 0x01",
        .flags = MWAIT2flg(0x01),
        .exit_latency = 10,
        .target_residency = 20,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
//  {
//      .name = "C2",
//      .desc = "MWAIT 0x10",
//      .flags = MWAIT2flg(0x10),
//      .exit_latency = 20,
//      .target_residency = 40,
//      .enter = &intel_idle,
//      .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2E",
        .desc = "MWAIT 0x11",
        .flags = MWAIT2flg(0x11),
        .exit_latency = 40,
        .target_residency = 100,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .enter = NULL }
};

static struct cpuidle_state core2_cstates[] = {
    {
        .name = "C1",
        .desc = "MWAIT 0x00",
        .flags = MWAIT2flg(0x00),
        .exit_latency = 3,
        .target_residency = 6,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C1E",
        .desc = "MWAIT 0x01",
        .flags = MWAIT2flg(0x01),
        .exit_latency = 10,
        .target_residency = 20,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2",
        .desc = "MWAIT 0x10",
        .flags = MWAIT2flg(0x10),
        .exit_latency = 20,
        .target_residency = 40,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2E",
        .desc = "MWAIT 0x11",
        .flags = MWAIT2flg(0x11),
        .exit_latency = 40,
        .target_residency = 100,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C3",
        .desc = "MWAIT 0x20",
        .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 85,
        .target_residency = 200,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C4",
        .desc = "MWAIT 0x30",
        .flags = MWAIT2flg(0x30) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 100,
        .target_residency = 400,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C4E",
        .desc = "MWAIT 0x31",
        .flags = MWAIT2flg(0x31) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 100,
        .target_residency = 400,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C6",
        .desc = "MWAIT 0x40",
        .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 200,
        .target_residency = 800,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .enter = NULL }
};

по intel_idle.cлінії 983:

static const struct idle_cpu idle_cpu_conroe = {
    .state_table = conroe_cstates,
    .disable_promotion_to_c1e = false,
};

static const struct idle_cpu idle_cpu_core2 = {
    .state_table = core2_cstates,
    .disable_promotion_to_c1e = false,
};

у intel_idle.cрядку 1073:

ICPU(INTEL_FAM6_CORE2_MEROM,  idle_cpu_conroe),
ICPU(INTEL_FAM6_CORE2_PENRYN, idle_cpu_core2),

Після швидкого компіляції та перезавантаження моїх PXE-вузлів, dmesgтепер показано:

[    0.019845] cpuidle: using governor menu
[    0.515785] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.543404] intel_idle: MWAIT substates: 0x22220
[    0.543405] intel_idle: v0.4.1 model 0x17
[    0.543413] tsc: Marking TSC unstable due to TSC halts in idle states deeper than C2
[    0.543680] intel_idle: lapic_timer_reliable_states 0x2

А тепер PowerTOP показує:

          Package   |            CPU 0
POLL        2.5%    | POLL        0.0%    0.0 ms
C1E         2.9%    | C1E         5.0%   22.4 ms
C2          0.4%    | C2          0.2%    0.2 ms
C3          2.1%    | C3          1.9%    0.5 ms
C4E        89.9%    | C4E        92.6%   66.5 ms

                    |            CPU 1
                    | POLL       10.0%  400.8 ms
                    | C1E         5.1%    6.4 ms
                    | C2          0.3%    0.1 ms
                    | C3          1.4%    0.6 ms
                    | C4E        76.8%   73.6 ms

                    |            CPU 2
                    | POLL        0.0%    0.2 ms
                    | C1E         1.1%    3.7 ms
                    | C2          0.2%    0.2 ms
                    | C3          3.9%    1.3 ms
                    | C4E        93.1%   26.4 ms

                    |            CPU 3
                    | POLL        0.0%    0.7 ms
                    | C1E         0.3%    0.3 ms
                    | C2          1.1%    0.4 ms
                    | C3          1.1%    0.5 ms
                    | C4E        97.0%   45.2 ms

Нарешті я отримав доступ до C-станів Enhanced Core 2, і, схоже, спостерігається помітне падіння споживання енергії - мій лічильник на 8 вузлів здається в середньому мінімум на 5% нижчим (коли на одному вузлі все ще працює старе ядро) , але я спробую знову замінити ядра як тест.

Цікава примітка щодо підтримки C4E - видається, що процесор My Yorktown Q9550S ​​підтримує його (або якийсь інший підзаряд C4), про що свідчить вище! Це мене бентежить, тому що в таблиці даних Intel на процесорі Core 2 Q9000 (розділ 6.2) згадуються лише C-стани Normal (C0), HALT (C1 = 0x00), Extended HALT (C1E = 0x01), Stop Grant (C2 = 0x10) , Розширений дозвіл зупинки (C2E = 0x11), сон / глибокий сон (C3 = 0x20) і більш глибокий сон (C4 = 0x30). Що це за додатковий стан 0x31? Якщо я ввімкнув стан C2, тоді замість C4 використовується C4E. Якщо я відключу стан C2 (силовий стан C2E), тоді C4 використовується замість C4E. Я підозрюю, що це може мати щось спільне з прапорами MWAIT, але я ще не знайшов документації для такої поведінки.

Я не впевнений, що з цього зробити: Стан C1E, здається, використовується замість C1, C2 використовується замість C2E, а C4E використовується замість C4. Я не впевнений, чи можна використовувати C1 / C1E, C2 / C2E та C4 / C4E разом із intel_idleнадлишковими або якщо вони є зайвими. У цій презентації 2010 року від Intel Labs Pittsburgh я знайшов замітку, що вказує, що переходи C0 - C1 - C0 - C1E - C0, і далі зазначено:

C1E використовується лише тоді, коли всі ядра знаходяться в C1E

Я вважаю, що це слід трактувати так, як стан C1E вводиться на інші компоненти (наприклад, пам'ять) лише тоді, коли всі ядра знаходяться в стані C1E. Я також вважаю, що це еквівалентно застосовується до станів C2 / C2E і C4 / C4E (Хоча C4E іменується "C4E / C5", тому я не впевнений, що C4E є підзакладом C4 або якщо C5 є підзаходом стан C4E. Здається, тестування вказує на правильність C4 / C4E). Я можу змусити використовувати C2E, коментуючи стан C2 - однак це спричиняє використання стану C4 замість C4E (тут може знадобитися більше роботи). Сподіваємось, немає жодних процесорів моделі 15 або моделі 23, у яких не вистачає стану C2E, тому що ці процесори обмежуватимуться C1 / C1E вищевказаним кодом.

Крім того, прапори, значення затримки та місця проживання, ймовірно, можуть бути чітко налаштовані, але просто прийняття освічених здогадок на основі величин Негалема в режимі очікування спрацьовує нормально. Для будь-яких удосконалень знадобиться більше читання.

Я перевірив це на Core 2 Duo E2220 ( Allendale ), двоядерному Pentium E5300 ( Wolfdale ), Core 2 Duo E7400 , Core 2 Duo E8400 ( Wolfdale ), Core 2 Quad Q9550S ( Yorkfield ) і Core 2 Extreme QX9650 , і I не виявили жодних проблем, що випадають за вищезазначеною перевагою стану C2 / C2E та C4 / C4E.

Не поширюється на цю модифікацію драйвера:

  • Оригінальний Core Solo / Core Duo ( Yonah , не Core 2) - це сімейство 6, модель 14. Це добре, тому що вони підтримували C4E / C5 (посилений режим глибокого сну), але не стани C1E / C2E і потребували їх власне визначення простою.

Єдині питання, про які я можу придумати:

  • Core 2 Solo SU3300 / SU3500 (Penryn-L) - це сімейство 6, модель 23 і буде виявлено цим драйвером. Однак вони не є Socket LGA775, тому вони, можливо, не підтримують CE-стан посиленого припинення C1E. Так само і для Core 2 Solo ULV U2100 / U2200 ( Merom-L ). Однак, intel_idleсхоже, драйвер вибирає відповідний C1 / C1E на основі апаратної підтримки суб-держав.
  • Як повідомляється, Core 2 Extreme QX9650 (Yorkfield) не підтримує стан C2 або C4. Я підтвердив це, придбавши вживаний процесор Optiplex 780 та QX9650 Extreme на eBay. Процесор підтримує C-стани C1 і C1E. При цій модифікації драйвера процесор простоює в стані C1E замість C1, тому, мабуть, є певна економія енергії. Я очікував, що я побачу С-стан С3, але його немає під час використання цього драйвера, тому мені, можливо, доведеться розглянути це далі.

Мені вдалося знайти слайд із презентації Intel 2009 про переходи між C-станами (тобто Deep Power Down):

Вхід / вихід технологій глибокого відключення живлення

На закінчення виявляється, що не було реальної причини відсутності підтримки Core 2 у intel_idleдрайвері. Тепер зрозуміло, що оригінальний код заглушки для "Core 2 Duo" обробляв лише C-стани C1 і C2, що було б набагато менш ефективно, ніж acpi_idleфункція, яка також обробляє C-стан C3. Колись я знав, де шукати, реалізувати підтримку було легко. Корисні коментарі та інші відповіді були дуже вдячні, і якщо Amazon слухає, ви знаєте, куди відправити чек.

Це оновлення було здійснено для github . Незабаром я надішлю патч на LKML.

Оновлення : мені також вдалося розкопати Socket T / LGA775 Allendale ( Conroe ) Core 2 Duo E2220, який є сімейством 6, модель 15, тому я додав підтримку і для цього. Ця модель не підтримує C-стан C4, але підтримує C1 / C1E та C2 / C2E. Це також повинно працювати для інших мікросхем на базі Conroe ( E4xxx / E6xxx ) і, можливо, для всіх процесорів Kentsfield та Merom (не Merom-L).

Оновлення : я нарешті знайшов деякі ресурси налаштування MWAIT. Це записування потужності та продуктивності та більш глибокий стан C та збільшена затримка публікації блогу містять корисну інформацію про виявлення затримок процесора в режимі очікування. На жаль, це повідомляє лише про ті затримки виходу, які були закодовані в ядро ​​(але, що цікаво, лише ті стани апаратного забезпечення, які підтримує процесор):

# cd /sys/devices/system/cpu/cpu0/cpuidle
# for state in `ls -d state*` ; do echo c-$state `cat $state/name` `cat $state/latency` ; done

c-state0/ POLL 0
c-state1/ C1 3
c-state2/ C1E 10
c-state3/ C2 20
c-state4/ C2E 40
c-state5/ C3 20
c-state6/ C4 60
c-state7/ C4E 100

4
Це приємна детективна робота! Я забув, наскільки складними були C2D / C2Q C-стани. Re незайманих економії енергії, якщо ваша прошивка досить добре , то ви все одно повинні отримувати вигоду , по крайней мере , деякі з C-станів з допомогою acpi_idle і різні губернатори продуктивності. Які стани powertopвідображаються у вашій системі?
Стівен Кітт

1
Дуже приємна інформація, чи пропонували ви запропонувати свій патч до ядра Linux?
Лекенштейн

1
"Стан C1E, здається, використовується замість C1 ..." Який стан використовується - як показано powertop - визначається виключно ядром, тому я вважаю, що це "не матиме нічого спільного з прапорами MWAIT", він буде вибиратися виключно на основі порядку штатів та виходу_латенції та цільового_резиденції. З цього приводу я був би трохи занепокоєний станами відпусток у таблиці, якщо вони, здавалося б, не звикли під час тестування ... на випадок, якщо ці штати насправді не працювали так, як очікувалося, і була якась інша схема навантаження, яка призвела до їх використання та несподівана поведінка, що відбувається.
sourcejedi

1
"переходи C0 - C1 - C0 - C1E - C0" - Я не думаю, що це хороший опис цього слайда. З ядра / powertopточки зору, всі переходи або від C0, або до C0. Якщо ви не в C0, ви не виконуєте жодних інструкцій, тому ядро ​​не може ні спостерігати, ні вимагати переходу між станами на цьому процесорі :-). І як ви кажете, губернатор меню «ядро» може, наприклад, перейти прямо в C1E, не витрачаючи спочатку жодного часу на C1.
sourcejedi

1
"просто взяття освічених здогадок на основі значень простою Nehalem, здається, працює нормально" - зауважте, це не гарний спосіб прийняти ваш патч вгору за течією :-P, оскільки затримка виходу не повинна бути заниженою, інакше я думаю, що ви будете порушують PM_QOS_CPU_DMA_LATENCY, яку можуть встановлювати драйвери (чи користувальний простір?)
sourcejedi

6

Я підозрюю, що це може бути просто можливістю та вартістю. Коли intel_idleбуло додано, здається, що підтримка Core 2 Duo була запланована, але вона так і не була реалізована повністю - можливо, до того часу, як інженери Intel розібралися, це вже не варто. Рівняння відносно складне: intel_idleпотрібно забезпечити достатню перевагу, acpi_idleщоб зробити його вартим підтримкою тут, на процесорах, які побачать «покращене» ядро ​​в достатній кількості ...

Як йдеться у відповіді sourcejedi , драйвер не виключає всіх сімейств 6. intel_idleІніціалізація перевіряє процесори в переліку моделей процесора , що охоплюють в основному всі мікро-архітектури від Nehalem до Kaby Lake. Йоркфілд старший за це (і значно відрізняється - Негалем сильно відрізняється від архітектури, що виходила до цього). Тест сім'ї 6 впливає лише на те, чи друкується повідомлення про помилку; його ефект полягає лише в тому, що повідомлення про помилку відображатиметься лише на процесорах Intel, а не на процесорах AMD (сімейство Intel 6 включає всі не-NetBurst процесори Intel з Pentium Pro).

Щоб відповісти на ваше питання конфігурації, ви можете повністю відключити intel_idle, але залишати його також добре (до тих пір, поки ви не заперечуєте проти попередження).


Повідомлення pr_debug () повинно з’являтися лише в тому випадку, якщо ви робите щось дуже специфічне, щоб увімкнути це повідомлення про налагодження, тому вам навіть не доведеться ігнорувати попередження
sourcejedi

2
@sourcejedi Я це згадав, оскільки ОП це бачить.
Стівен Кітт

gotcha. Я представляю напівсерйозний коментар: оскільки нас запитують про розумну конфігурацію ядра, якщо вона використовується щодня, можливо, не використовувати опцію, яка дозволяє всі повідомлення про налагодження? При правильному варіанті вони можуть бути включені динамічно і вибірково, коли це необхідно. kernel.org/doc/html/v4.17/admin-guide/dynamic-debug-howto.html Якщо ви ввімкнули всі повідомлення про налагодження, напевно, у вас є багато повідомлень, які ви все одно ігноруєте :).
sourcejedi

@sourcejedi Я не бачу доречності ваших коментарів щодо відключення повідомлень ядра. Я не вважаю це конструктивним щодо питання, яке конкретно стосується підтримки Core 2 для intel_idleдрайвера.
vallismortis

@vallismortis дуже дотична. Це означає, що для Core 2 і вище є дійсна конфігурація , яка не друкує це як дратівливе попереджувальне повідомлення, яке потрібно просто ігнорувати, а при підтримці буде використовувати Intel_idle ... але тоді я припускаю, що ви використовували б динамічно завантажені модулі все одно, тому, можливо, не варто згадувати.
sourcejedi

6

Чи є більш підходящий спосіб налаштувати ядро ​​для оптимальної підтримки процесора в режимі очікування для цього сімейства процесорів (окрім відключення підтримки Intel_idle)

Увімкнено ACPI і ви перевірили, чи використовується acpi_idle. Я щиро сумніваюся, що ви пропустили будь-який корисний варіант налаштування ядра. Ви завжди можете перевірити powertopможливі пропозиції, але, напевно, ви це вже знали.


Це не відповідь, але я хочу її відформатувати :-(

Дивлячись на вихідний код ядра, поточний драйвер intel_idle містить тест, щоб спеціально виключити сімейство Intel 6 з драйвера.

Ні, це не так :-).

id = x86_match_cpu(intel_idle_ids);
if (!id) {
    if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
        boot_cpu_data.x86 == 6)
        pr_debug(PREFIX "does not run on family %d model %d\n",
            boot_cpu_data.x86, boot_cpu_data.x86_model);
    return -ENODEV;
}

ifЗатвердження не виключає сім'я 6. Замість цього ifоператор надає повідомлення , коли налагодження включена, що це конкретний сучасний процесор Intel не підтримується intel_idle. Насправді, мій поточний процесор i5-5300U - це Family 6 і він використовує intel_idle.

Що виключає ваш процесор - це те, що в intel_idle_idsтаблиці немає відповідності .

Я помітив цю комісію, яка реалізувала таблицю. Код, який він видаляє, switchнатомість мав оператор. Це дозволяє легко побачити, що найбільш рання модель intel_idle була впроваджена / успішно протестована / незалежно від 0x1A = 26. https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.