Neden bazı Intel ailesi 6 CPU modelleri (Core 2, Pentium M) intel_idle tarafından desteklenmiyor?


25

Linux çekirdeğimi Intel Core 2 Quad (Yorkfield) işlemcileri için ayarlıyorum ve aşağıdaki mesajları gördüm 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, yalnızca paket ve bireysel çekirdekler için kullanılan C1, C2 ve C3 durumlarını gösterir:

          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

Meraklı, sordum sysfsve eski acpi_idlesürücünün kullanımda olduğunu buldum ( intel_idlesürücüyü görmeyi umdum):

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

acpi_idle

Çekirdek kaynak koduna bakıldığında, geçerli intel_idle sürücüsü, bazı Intel ailesi 6 modellerinin sürücü tarafından desteklenmediğini belirten bir hata ayıklama mesajı içeriyor:

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);

Daha önceki bir çatal (22 Kasım 2010) intel_idle.c , Core 2 işlemciler için beklenen desteği gösteriyor (model 23 aslında hem Core 2 Duo hem Quad'i kapsıyor):

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

Yukarıdaki kod Aralık 2010'da silindi işlemek .

Ne yazık ki, kaynak kodunda neredeyse hiçbir dokümantasyon yoktur, bu nedenle bu CPU'larda boşta fonksiyon için destek eksikliği ile ilgili bir açıklama yoktur.

Mevcut çekirdek yapılandırmam aşağıdaki gibidir:

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

Sorum şu:

  • Core 2 işlemciler tarafından desteklenmeyen özel bir donanım nedeni var intel_idlemı?
  • Bu işlemci ailesi için optimal CPU boşta desteği için bir çekirdeği yapılandırmanın daha uygun bir yolu var mı (desteğinin devre dışı bırakılmasının yanı sıra intel_idle)?

Yanıtlar:


28

Core 2 CPU güç durumlarını (" C-devletleri ") araştırırken, eski Intel Core / Core 2 işlemcilerinin çoğunu desteklemeyi başardım. Tüm arka plan bilgilerinin bulunduğu eksiksiz uygulama (Linux yaması) burada belgelenmiştir.

Bu işlemciler hakkında daha fazla bilgi topladığımda, Core 2 modellerinde desteklenen C durumlarının hem önceki hem de sonraki işlemcilerde olduğundan çok daha karmaşık olduğu ortaya çıkmaya başladı. Bunlar , paketi, yonga setindeki ayrı ayrı maçaları ve diğer bileşenleri (örneğin hafıza) içeren Gelişmiş C durumları (veya " CxE ") olarak bilinir . Zamanda intel_idlesürücü serbest bırakıldı, kod özellikle olgun değildi ve birkaç Core 2 işlemciler C durumu desteğini çelişkili olduğunu serbest bırakılmıştı.

Core 2 Solo / Duo C-state desteği hakkında bazı zorlayıcı bilgiler 2006'dan bu makalede bulundu . Bu, Windows desteği ile ilgilidir, ancak bu işlemciler için güçlü donanım C-durumu desteği olduğunu gösterir. Kentsfield'la ilgili bilgiler gerçek model numarasıyla çakışıyor, bu yüzden gerçekten aşağıda bir Yorkfield'a atıfta bulunduklarına inanıyorum:

... dört çekirdekli Intel Core 2 Extreme (Kentsfield) işlemci, beş performans ve güç tasarrufu teknolojisinin tümünü destekliyor - Gelişmiş Intel SpeedStep (EIST), Termal Monitör 1 (TM1) ve Termal Monitör 2 (TM2), eski İsteğe Bağlı Saat Modülasyon (ODCM) ve ayrıca Gelişmiş C Durumları (CxE). Yalnızca Gelişmiş Halt (C1) Devleti ile karakterize edilen Intel Pentium 4 ve Pentium D 600, 800 ve 900 işlemcilerle karşılaştırıldığında, bu işlev Intel Core 2 işlemcilerde (ayrıca Intel Core Solo / Duo işlemcilerde) için genişletildi. Stop Grant (C2), Deep Sleep (C3) ve Deeper Sleep (C4) dahil olmak üzere bir işlemcinin olası tüm boşta durumları.

2008 tarihli bu makalede, Core 2 Duo ve Core 2 Quad dahil olmak üzere çok çekirdekli Intel işlemcilerde çekirdek başına C durumu desteği açıklanmıştır ( Dell'in bu beyaz bülteninde ek yararlı arka plan okuması bulundu ):

Bir çekirdek C durumu bir donanım C durumudur. Birkaç temel rölanti durumu vardır, örneğin CC1 ve CC3. Bildiğimiz gibi, modern bir teknoloji ürünü işlemcinin, bazı çevrelerde Penryn olarak bilinen yakın zamanda piyasaya sürülen Core Duo T5000 / T7000 mobil işlemciler gibi birçok çekirdeği vardır. Bir işlemci / işlemci olarak düşünmek için kullandığımız, aslında onun yanında çok sayıda genel amaçlı işlemci var. Intel Core Duo'nun işlemci yongasında 2 çekirdek var. Intel Core-2 Quad, işlemci çipi başına 4 bu tür çekirdeğe sahip. Bu çekirdeklerin her birinin kendi boşta durumu vardır. Bu bir çekirdekte boş dururken, bir diğeri iş parçacığı üzerinde çalışırken zor olabilir gibi mantıklı. Dolayısıyla, çekirdek bir C durumu, bu çekirdeklerden birinin boşta durumudur.

Intel’den , intel_idlesürücüyle ilgili ek bilgi sağlayan 2010’da bir sunum buldum , ancak ne yazık ki Core 2’de destek eksikliği olduğunu açıklamıyorum:

Bu DENEYSEL sürücü, Intel Atom İşlemcileri, Intel Core i3 / i5 / i7 İşlemcilerinde ve ilgili Intel Xeon işlemcilerinde acpi_idle'ın yerini alır. Intel Core2 işlemcisini veya daha eski bir sürümü desteklemiyor.

Yukarıdaki sunum intel_idlesürücünün Linux çekirdek yapılandırması (yani CONFIG_CPU_IDLE_GOV_LADDERvs. CONFIG_CPU_IDLE_GOV_MENU) üzerinde etkisi olan "menü" CPU regülatörünün bir uygulaması olduğunu göstermektedir . Bu cevapta merdiveni ve menü valileri arasındaki farklar kısaca açıklanmıştır .

Dell, C durumu C0 ila C6 uyumluluğunu listeleyen faydalı bir makaleye sahiptir:

C1 ila C3 modları temel olarak CPU içinde kullanılan saat sinyallerini keserek çalışır, C4 ila C6 modları ise CPU voltajını azaltarak çalışır. "Gelişmiş" modları aynı anda yapabilirsiniz.

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

Bu tablodan (bazı durumlarda daha sonraları yanlış buldum), Core 2 işlemcilerde C durumu desteğinde çeşitli farklılıklar olduğu anlaşılıyor (Core 2 işlemcilerin neredeyse tamamı Core 2 işlemcilerin Soket LGA775 olduğunu unutmayın. 2 Soket BGA956 ve Merom / Penryn işlemcileri olan Solo SU3500. "Intel Core" Solo / Duo işlemcileri Soket PBGA479 veya PPGA478'den biridir).

Bu makalede tabloya ek bir istisna bulundu :

Core 2 Duo E8500, Core 2 Extreme QX9650 modelinde C-C2 ve C4 durumlarını destekliyor.

İlginçtir ki, QX9650 bir Yorkfield işlemcisidir (Intel ailesi 6, model 23, adım 6). Referans için, benim Q9550S'im Intel-aile 6, model 23 (0x17), adım 10, ki bu da C-durumu C4'ü destekliyor (deney yoluyla onaylandı). Ek olarak, Core 2 Solo U3500, Q9550S ​​ile aynı CPUID'ye (aile, model, kademeli) sahiptir, ancak yukarıdaki tablonun yorumlanmasını engelleyen LGA775 olmayan bir sokette bulunur.

Açıkçası, CPUID, bu işlemci modeli için C durumu desteğini belirlemek için en azından adımlamaya kadar kullanılmalıdır ve bazı durumlarda yetersiz olabilir (şu anda belirlenmemiş).

CPU boşta bilgisini atamak için kullanılan yöntem imzası:

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

Nerede modelnumaralandırılan asm / intel-family.h . Bu üstbilgi dosyasını incelerken, Intel CPU'lara Intel ailesi 6 model numaralarıyla eşleşen 8 bitlik tanımlayıcı atandığını görüyorum:

#define INTEL_FAM6_CORE2_PENRYN 0x17

Yukarıdakilerden Intel Family 6, Model 23 (0x17) olarak tanımladık INTEL_FAM6_CORE2_PENRYN. Bu, Model 23 işlemcilerin çoğu için boşta durumları tanımlamak için yeterli olmalıdır, ancak yukarıda belirtildiği gibi QX9650 ile sorunlara neden olabilir.

Dolayısıyla, asgari olarak, ayrı bir C-durumu ayarına sahip her bir işlemci grubunun bu listede tanımlanması gerekecektir.

Zagacki ve Ponnala, Intel Teknoloji Dergisi 12 (3): 219-227, 2008 , Yorkfield işlemcilerinin gerçekten C2 ve C4'ü desteklediğini gösteriyor. Ayrıca, ACPI 3.0a şartnamesinin sadece C0, C1, C2 ve C3 durumları arasındaki geçişleri desteklediğini, Linux acpi_idlesürücüsünün bu sınırlı C durumları arasındaki geçişleri sınırlayabileceğini varsayıyor gibi görünüyorlar. Bununla birlikte, bu makale her zaman böyle olmayabileceğini gösterir:

ACPI C durumu olduğunu, işlemciyi değil, yani ACPI C3'ün HW C6 vb. Olduğunu unutmayın.

Ayrıca not:

İşlemcinin ötesinde, C4 platformdaki başlıca silikon bileşenleri arasında senkronize bir çaba olduğundan, Intel Q45 Express Chipset yüzde 28 güç artışı sağlıyor.

Kullandığım yonga seti aslında bir Intel Q45 Express Yonga Seti.

MWAIT devletler üzerinde Intel dokümantasyon veciz ama onaylar BIOS özgü ACPI davranışını geçerli:

MWAIT uzantılarında tanımlanan işlemciye özgü C durumları, ACPI tanımlı C durum tiplerine (C0, C1, C2, C3) eşlenebilir. Eşleştirme ilişkisi, işlemci uygulaması tarafından C durumunun tanımına bağlıdır ve ACPI tarafından tanımlanan _CST tablosu kullanılarak BIOS tarafından OSPM'ye maruz bırakılır.

Yukarıdaki tabloyu yorumlamam ( Wikipedia , asm / intel-family.h ve yukarıdaki makalelerden oluşan bir masa ile birlikte):

Model 9 0x09 ( Pentium M ve Celeron M ):

  • Banyalar: C0, C1, C2, C3, C4

Model 13 0x0D ( Pentium M ve Celeron M ):

  • Dothan, Stealey: C0, Cı, C2, C3, C4

Model 14 0x0E INTEL_FAM6_CORE_YONAH ( Gelişmiş Pentium M , Gelişmiş Celeron M veya Intel Core ):

  • Yonah ( Core Solo , Core Duo ): C0, C1, C2, C3, C4, C4E / C5

Model 15 0x0F INTEL_FAM6_CORE2_MEROM (bazı Core 2 ve Pentium Dual-Core ):

  • Kentsfield, Merom, Conroe, Allendale ( E2xxx / E4xxx ve Çekirdek 2 Duo E6xxx, T7xxxx / T8xxxx , Çekirdek 2 Aşırı QX6xxx , Çekirdek 2 Quad Q6xxx ): C0, C1, C1E, C2, C2E

Model 23 0x17 INTEL_FAM6_CORE2_PENRYN ( Çekirdek 2 ):

  • Merom-L / Penryn-L:
  • Penryn ( Core 2 Duo 45-nm mobil ): C0, C1, C1E, C2, C2E, C3, C4, C4E / C5, C6
  • Yorkfield ( Core 2 Extreme QX9650 ): C0, C1, C1E, C2EE, C3
  • Wolfdale / Yorkfield ( Çekirdek 2 Dörtlü , C2Q Xeon , Çekirdek 2 Duo E5xxx / E7xxx / E8xxx , Pentium Çift Çekirdekli E6xxx , Celeron Çift Çekirdekli ): C0, C1, C1E, C2, C2E, C3, C4

Sadece Çekirdek 2 işlemciler dizisindeki C durum desteğindeki çeşitlilik miktarından, C durumları için tutarlı bir destek eksikliğinin, intel_idlesürücü ile tam olarak desteklenmeye çalışılmamasının nedeni olabileceği anlaşılmaktadır . Çekirdek 2 hattının tamamı için yukarıdaki listeyi tamamen tamamlamak istiyorum.

Bu gerçekten tatmin edici bir cevap değil, çünkü ne kadar gereksiz gücün kullanıldığını ve bu işlemcilerde güçlü güç tasarrufu sağlayan MWAIT C-durumlarını tam olarak kullanmamaktan dolayı aşırı ısı üretildiğini (ve hala üretildiğini) merak ediyor .

Chattopadhyay ve diğ. 2018, Enerji Verimli Yüksek Performanslı İşlemciler: Yeşil Yüksek Performanslı Tasarım İçin Son Yaklaşımlar Hesaplama , Q45 Express Chipset'te aradığım belirli davranış için dikkat çekicidir:

Paket C durumu (PC0-PC10) - İşlem alanları, Çekirdek ve Grafikler (GPU) boştayken, işlemcinin uncore ve platform seviyelerinde ek güç tasarrufu için, örneğin LLC'yi temizleme ve güç kaynağını açma bellek denetleyicisi ve DRAM IO ve bazı durumlarda, durumu her zaman açık olan etki alanında korunurken tüm işlemci kapatılabilir.

Test olarak aşağıdakileri linux / drivers / idle / intel_idle.c line 127'ye yerleştirdim:

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 }
};

En intel_idle.chat 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,
};

En intel_idle.chat 1073:

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

PXE düğümlerimi hızlı bir şekilde derleyip yeniden başlattıktan sonra dmesgşimdi şunu gösteriyor:

[    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

Ve şimdi PowerTOP gösteriyor:

          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

Sonunda Gelişmiş Çekirdek 2 C durumlarına eriştim ve güç tüketiminde ölçülebilir bir düşüş var gibi görünüyor - 8 düğümdeki sayacım ortalama olarak en az% 5 daha düşük görünüyor (bir düğüm hala eski çekirdeği çalıştırıyor) , ama çekirdeği bir test olarak tekrar değiştirmeyi deneyeceğim.

C4E desteği ile ilgili ilginç bir not - My Yorktown Q9550S ​​işlemcim, yukarıda da belirtildiği gibi (veya C4'ün başka bir alt durumu) destekliyor! Bu beni şaşırtıyor, çünkü Core 2 Q9000 işlemcisindeki Intel veri sayfası (bölüm 6.2) yalnızca C durumları Normal (C0), HALT (C1 = 0x00), Genişletilmiş HALT (C1E = 0x01), Stop Grant (C2 = 0x10) olarak bahsetmektedir. , Genişletilmiş Durdurma Desteği (C2E = 0x11), Uyku / Derin Uyku (C3 = 0x20) ve Derin Uyku (C4 = 0x30). Bu ek 0x31 durumu nedir? C2 durumunu etkinleştirirsem, C4 yerine C4E kullanılır. C2 durumunu devre dışı bırakırsam (C2E zorla durumu), C4E yerine C4 kullanılır. Bunun MWAIT bayraklarıyla bir ilgisi olabileceğinden şüpheleniyorum, ancak bu davranış için henüz bir dokümantasyon bulamadım.

Bunun ne yapılması gerektiğinden emin değilim: C1E durumu C1 yerine kullanılıyor, C2 yerine C2 kullanılıyor ve C4 yerine C4 kullanılıyor. C1 / C1E, C2 / C2E ve C4 / C4E ile birlikte intel_idleveya fazlalık kullanılıp kullanılamayacaklarından emin değilim . Bu 2010 sunumunda, Intel Labs Pittsburgh tarafından geçişlerin C0 - C1 - C0 - C1E - C0 olduğunu ve başka durumları belirten bir not buldum :

C1E yalnızca tüm çekirdekler C1E'deyken kullanılır

Bunun sadece tüm çekirdekler C1E durumundayken C1E durumu diğer bileşenlere (örneğin hafıza) girildiğinde yorumlanacağına inanıyorum. Bunu C2 / C2E ve C4 / C4E durumlarına eşit olarak uygulamak için de kabul ediyorum (Her ne kadar C4E "C4E / C5" olarak adlandırılsa da, C4E'nin C4'ün bir alt durumu olup olmadığından emin değilim; C4E'nin durumu Test, C4 / C4E'nin doğru olduğunu gösteriyor gibi görünüyor). C2E'yi C2 durumunu yorumlayarak kullanılmaya zorlayabilirim - ancak bu, C4 durumunun C4E yerine kullanılmasına neden olur (burada daha fazla çalışma gerekebilir). Umarım, C2E devleti olmayan herhangi bir model 15 veya model 23 işlemcisi yoktur, çünkü bu işlemciler yukarıdaki kodla C1 / C1E ile sınırlı olacaktır.

Ayrıca, bayraklar, gecikme ve ikamet değerleri muhtemelen iyi ayarlanmış olabilir, ancak sadece Nehalem boşta değerlerine dayanarak eğitimli tahminler almak iyi iş gibi görünüyor. Herhangi bir iyileştirme yapmak için daha fazla okuma gerekecektir.

Bunu Core 2 Duo E2220 ( Allendale ), Çift Çekirdekli Pentium E5300 ( Wolfdale ), Core 2 Duo E7400 , Core 2 Duo E8400 ( Wolfdale ), Core 2 Quad Q9550S ( Yorkfield ) ve Core 2 Extreme QX9650 ve I üzerinde test ettim. C2 / C2E ve C4 / C4E durumları için yukarıda belirtilen tercihlerin ötesinde bir sorun bulamadık.

Bu sürücü değişikliği kapsamında değildir:

  • Orijinal Core Solo / Core Duo ( Yonah , Core 2 olmayan) aile 6, model 14'tür. Bu, C4E / C5 (Gelişmiş Derin Uyku) C durumlarını destekledikleri ancak C1E / C2E durumlarını desteklemedikleri ve ihtiyaç duyduklarına ihtiyaç duyacakları için iyidir. kendi boşta tanımı.

Aklıma gelen tek şey:

  • Core 2 Solo SU3300 / SU3500 (Penryn-L) aile 6, model 23 ve bu sürücü tarafından algılanacak. Ancak, Soket LGA775 değillerdir, bu nedenle C1E Gelişmiş Durma C durumunu desteklemeyebilirler. Benzer şekilde Core 2 Solo ULV U2100 / U2200 ( Merom-L ). Bununla birlikte, intel_idlesürücü, alt durumların donanım desteğine dayalı olarak uygun C1 / C1E'yi seçiyor gibi görünmektedir.
  • Core 2 Extreme QX9650'nin (Yorkfield) bildirildiği gibi C durumu C2 veya C4'ü desteklemiyor. Bunu eBay'de kullanılmış bir Optiplex 780 ve QX9650 Extreme işlemci satın alarak onayladım. İşlemci C-durumları C1 ve C1E'yi destekler. Bu sürücü modifikasyonunda CPU, C1 yerine C1E durumunda boşta kalır, bu nedenle büyük olasılıkla bir miktar güç tasarrufu vardır. C durumu C3'ü görmeyi umuyordum, ancak bu sürücüyü kullanırken mevcut değil, bu yüzden daha fazla araştırmam gerekebilir.

C-devletleri (örneğin, Deep Power Down) arasındaki geçişlerle ilgili 2009 Intel sunumundan bir slayt bulmayı başardım:

Deep Power Down Teknoloji Girişi / Çıkışı

Sonuç olarak, intel_idlesürücüdeki Core 2 desteği eksikliğinin gerçek bir nedeni olmadığı ortaya çıktı . Şimdi “Core 2 Duo” için orijinal saplama kodunun sadece acpi_idleC-durumu C3'ü de işleyen fonksiyondan çok daha az verimli olan C-durumları C1 ve C2'yi kullandığı açıktır . Nereye bakacağımı bildiğimde, desteği uygulamak kolaydı. Yararlı yorumlar ve diğer cevaplar çok takdir edildi ve Amazon dinliyorsa, çekin nereye gönderileceğini biliyorsunuz.

Bu güncelleme github'a adanmıştır . Yakında LKML'ye bir e-posta göndereceğim.

Güncelleme : Ayrıca , aile 6, model 15 olan bir Soket T / LGA775 Allendale ( Conroe ) Çekirdek 2 Duo E2220'yi kazmayı da başardım. Bu model C durumu C4'ü desteklemiyor, ancak C1 / C1E ve C2 / C2E'yi destekliyor. Bu, diğer Conroe tabanlı yongalarda ( E4xxx / E6xxx ) ve muhtemelen tüm Kentsfield ve Merom (Merom-L olmayan) işlemciler için de geçerli olmalıdır.

Güncelleme : Sonunda bazı MWAIT ayarlama kaynaklarını buldum. Bu Power-Performance yazma ve bu Derin C durumlarını ve artan gecikme günlüğü gönderisinin her ikisi de CPU boşta kalma gecikmelerinin tanımlanması konusunda bazı yararlı bilgiler içerir. Ne yazık ki, bu yalnızca çekirdeğe kodlanmış bu çıkış gecikmelerini bildirir (ama ilginç bir şekilde, yalnızca işlemci tarafından desteklenen donanım durumlarını):

# 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
Bu güzel dedektiflik işi! C2D / C2Q C durumlarının ne kadar karmaşık olduğunu unutmuştum. Kullanılmayan güç tasarrufu Re, senin firmware sonra yine C-devletlerin en azından bazılarının yararı elde edilmelidir yeterince iyi olup olmadığını aracılığıyla acpi_idle ve çeşitli performans valiler. powertopSisteminizde hangi durumlar var ?
Stephen Kitt

1
Çok güzel bilgi, yamamanızı upstream Linux çekirdeğine önermeyi düşündünüz mü?
Lekensteyn

1
“C1E durumu C1 yerine kullanılıyor gibi görünüyor ...” Hangi durumun kullanıldığı - powertop tarafından gösterildiği gibi - yalnızca çekirdek tarafından belirlenir, bu nedenle “MWAIT bayraklarıyla bir ilgisi olmayacağına inanıyorum”, yalnızca devletlerin sırasına, exit_latency ve target_residency seçilecektir. Bu, test edildiklerinde alışık olmadıklarında, bu durumların beklendiği gibi çalışmadığı durumlarda ve bu durumun beklendiği gibi çalışmamasına neden olacaksa, masadaki izin durumları hakkında biraz endişe duyacağımı söyledi. bunlar kullanılıyor ve beklenmedik davranışlar oluyor.
sourcejedi,

1
"geçişler C0 - C1 - C0 - C1E - C0" - Bunun slaytın iyi bir açıklaması olduğunu sanmıyorum. Çekirdek / powertopbakış açısından, tüm geçişler C0'dan veya C0'a kadardır. C0'da değilseniz, herhangi bir talimat çalıştırmazsınız, bu nedenle çekirdek bu CPU'daki durumlar arasında gözlemleyemez veya bunlardan herhangi bir geçiş talep edemez :-). Ve dediğiniz gibi, çekirdek "menü" valisi, örneğin, C1’de herhangi bir zaman geçirmeden önce doğrudan C1E’ye atlayabilir.
sourcejedi

1
"Nehalem boşta değerlerine dayanarak sadece eğitimli tahminler almak iyi iş gibi görünüyor" - bu yamanın akıntıya geçmesini sağlamak için iyi bir yol olmadığını unutmayın: - P, çıkış gecikmesinin hafife almaması gerektiğini , aksi takdirde sürücüler (veya kullanıcı alanı?) tarafından ayarlanabilecek PM_QOS_CPU_DMA_LATENCY kurallarını ihlal etmek
sourcejedi

6

Bunun sadece bir fırsat ve maliyet olabileceğinden şüpheleniyorum. Eklendiğinde intel_idle, Core 2 Duo desteğinin planlandığı görülüyor, ancak hiç bir zaman tam olarak uygulanmadı - belki de Intel mühendisleri bu konuya geldiğinde, buna değmezdi. Denklem göreceli olarak karmaşıktır: “gelişmiş” çekirdeği yeterli sayıda görecek olan CPU'larda burada desteklenmeye değer hale getirmek intel_idleiçin yeterli faydalar sağlaması acpi_idlegerekir ...

As sourcejedi ‘ın cevabı diyor, sürücü ailesinin 6. tüm dışlamaz intel_idleiçinde CPU'lar için başlatma kontrol eder işlemci modellerinin listesi temelde Nehalem gelen Kaby Gölü'ne mikromimari kapsayan. Yorkfield bundan daha büyük (ve önemli ölçüde farklı - Nehalem ondan önce gelen mimarilerden çok farklı). Aile 6 testi sadece hata mesajının yazdırılıp yazdırılmadığını etkiler; Bunun etkisi, yalnızca hata mesajının AMD CPU'larda değil, yalnızca Intel CPU'larda görüntüleneceğidir (Intel ailesi 6, Pentium Pro'dan beri tüm NetBurst olmayan Intel işlemcileri içerir).

Konfigürasyon sorunuzu yanıtlamak için tamamen devre dışı bırakabilirsiniz intel_idle, ancak bunu bırakmak da iyidir (uyarıya aldırmadığınız sürece).


pr_debug () mesajı yalnızca bu hata ayıklama iletisini etkinleştirmek için çok özel bir şey yaparsanız göründüğü için, uyarıyı yok saymanız bile gerekmez
sourcejedi

2
@sourcejedi, çünkü OP onu görüyor.
Stephen Kitt

Yakaladım. Yarı ciddi bir yorum yapıyorum: mantıklı bir çekirdek yapılandırması hakkında soru sorduğumuzdan, eğer günlük kullanılıyorsa, belki de tüm hata ayıklama mesajlarını sağlayan seçeneği kullanmayın. Doğru seçenekle, gerektiğinde dinamik ve seçici olarak etkinleştirilebilirler. kernel.org/doc/html/v4.17/admin-guide/dynamic-debug-howto.html Tüm hata ayıklama iletilerini etkinleştirirseniz, muhtemelen yine de görmezden geldiğiniz birçok iletiniz olur :).
sourcejedi

@sourcejedi Çekirdek iletilerini devre dışı bırakma hakkındaki yorumlarınızın alaka düzeyini göremiyorum. Bunu, özellikle intel_idlesürücü için Core 2 desteğine yönelik olan soruya yapıcı olarak görmüyorum .
vallismortis

@vallismortis çok teğetseldir. Bu, Core 2 ve üstü için kullanabileceğiniz , bunu sadece göz ardı edilmesi gereken can sıkıcı bir uyarı mesajı olarak basmayan ve desteklenirse intel_idle kullanacak geçerli bir yapılandırma olduğu anlamına gelir ... ama sonra dinamik olarak yüklüyorsunuz. Yine de modülleri, belki söz değil.
kaynakjedi

6

Bu işlemci ailesi için en uygun CPU boşta desteği için bir çekirdeği yapılandırmanın daha uygun bir yolu var mı (intel_idle için desteğin devre dışı bırakılması dışında)

ACPI'yi etkinleştirdiniz ve acpi_idle'ın kullanımda olduğunu kontrol ettiniz. İçtenlikle, yardımcı bir çekirdek yapılandırma seçeneğini kaçırdığınızı sanmıyorum. powertopOlası önerileri her zaman kontrol edebilirsin , ama muhtemelen bunu zaten biliyordun.


Bu bir cevap değil ama formatlamak istiyorum :-(.

Çekirdek kaynak koduna bakıldığında, geçerli intel_idle sürücüsü, Intel ailesi 6'yı özellikle sürücüden dışlamak için bir test içerir.

Hayır değil :-).

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;
}

Bu ififade Aile 6'yı dışlamaz. Bunun yerine, ififade, hata ayıklamanın etkin olduğu ve bu modern Intel işlemcinin desteklemediğini belirten bir mesaj sağlar intel_idle. Aslında, şimdiki i5-5300U CPU'um Family 6'dır ve kullanır intel_idle.

CPU'nuzu hariç tutan şey, intel_idle_idstabloda eşleşme olmamasıdır .

Masayı uygulayan bu taahhüdü fark ettim. Kaldırdığı kodun switchyerine bir deyim vardı . Bu sayede görmek için erken modeli intel_idle uygulamaya konduğunu da / başarıyla test / 0x1A ne olursa olsun = 26. yapar https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.