Під час дослідження станів живлення процесорів 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
acpi_idle
і різні губернатори продуктивності. Які станиpowertop
відображаються у вашій системі?