Tại sao một số mẫu CPU gia đình Intel 6 (Core 2, Pentium M) không được intel_idle hỗ trợ?


25

Tôi đã điều chỉnh nhân Linux của mình cho bộ xử lý Intel Core 2 Quad (Yorkfield) và tôi nhận thấy các thông báo sau từ 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 chỉ hiển thị các trạng thái C1, C2 và C3 được sử dụng cho gói và các lõi riêng lẻ:

          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

Tò mò, tôi đã hỏi sysfsvà thấy rằng acpi_idletrình điều khiển cũ đang được sử dụng (tôi dự kiến ​​sẽ thấy intel_idletrình điều khiển):

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

acpi_idle

Nhìn vào mã nguồn kernel, trình điều khiển intel_idle hiện tại chứa thông báo gỡ lỗi đặc biệt lưu ý rằng một số kiểu máy Intel Family 6 không được trình điều khiển hỗ trợ:

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

Một ngã ba trước đó (ngày 22 tháng 11 năm 2010) của intel_idle.c cho thấy sự hỗ trợ dự kiến ​​cho bộ xử lý Core 2 (mô hình 23 thực sự bao gồm cả Core 2 Duo và Quad):

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

Các mã trên đã bị xóa vào tháng 12 năm 2010 cam kết .

Thật không may, hầu như không có tài liệu nào trong mã nguồn, vì vậy không có lời giải thích nào về việc thiếu hỗ trợ cho chức năng nhàn rỗi trong các CPU này.

Cấu hình kernel hiện tại của tôi như sau:

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

Câu hỏi của tôi như sau:

  • Có một lý do phần cứng cụ thể nào mà bộ xử lý Core 2 không được hỗ trợ intel_idlekhông?
  • Có cách nào thích hợp hơn để cấu hình kernel để hỗ trợ CPU nhàn rỗi tối ưu cho họ bộ xử lý này (ngoài việc vô hiệu hóa hỗ trợ cho intel_idle) không?

Câu trả lời:


27

Trong khi nghiên cứu các trạng thái sức mạnh của CPU Core 2 (" trạng thái C "), tôi thực sự đã quản lý để triển khai hỗ trợ cho hầu hết các bộ xử lý Intel Core / Core 2 cũ. Việc thực hiện đầy đủ (bản vá Linux) với tất cả các thông tin cơ bản được ghi lại ở đây.

Khi tôi tích lũy thêm thông tin về các bộ xử lý này, nó bắt đầu trở nên rõ ràng rằng các trạng thái C được hỗ trợ trong (các) mô hình Core 2 phức tạp hơn nhiều so với các bộ xử lý trong cả hai bộ xử lý trước và sau này. Chúng được gọi là trạng thái C nâng cao (hoặc " CxE "), liên quan đến gói, lõi riêng và các thành phần khác trên chipset (ví dụ: bộ nhớ). Vào thời điểm intel_idletrình điều khiển được phát hành, mã không đặc biệt trưởng thành và một số bộ xử lý Core 2 đã được phát hành có xung đột hỗ trợ trạng thái C.

Một số thông tin hấp dẫn về hỗ trợ trạng thái Core 2 Solo / Duo C đã được tìm thấy trong bài viết này từ năm 2006 . Điều này liên quan đến hỗ trợ trên Windows, tuy nhiên, nó chỉ ra sự hỗ trợ trạng thái C phần cứng mạnh mẽ trên các bộ xử lý này. Thông tin liên quan đến Kentsfield xung đột với số mô hình thực tế, vì vậy tôi tin rằng họ thực sự đang đề cập đến một Yorkfield dưới đây:

... Bộ xử lý lõi tứ Intel Core 2 Extreme (Kentsfield) hỗ trợ tất cả năm công nghệ tiết kiệm năng lượng và hiệu suất - Intel SpeedStep (EIST), Heat Monitor 1 (TM1) và Heat Monitor 2 (TM2), Đồng hồ theo yêu cầu cũ Điều chế (ODCM), cũng như các quốc gia C nâng cao (CxE). So với các bộ xử lý Intel Pentium 4 và Pentium D 600, 800 và 900, chỉ được đặc trưng bởi Trạng thái Halt cải tiến (C1), chức năng này đã được mở rộng trong bộ xử lý Intel Core 2 (cũng như bộ xử lý Intel Core Solo / Duo) cho tất cả các trạng thái nhàn rỗi có thể có của bộ xử lý, bao gồm Dừng cấp (C2), Ngủ sâu (C3) và Ngủ sâu hơn (C4).

Bài viết này từ năm 2008 phác thảo hỗ trợ cho các trạng thái C lõi mỗi trên bộ xử lý Intel đa lõi, bao gồm Core 2 Duo và Core 2 Quad (đọc thêm nền hữu ích đã được tìm thấy trong bài báo trắng này của Dell ):

Trạng thái C cốt lõi là trạng thái C phần cứng. Có một số trạng thái nhàn rỗi cốt lõi, ví dụ CC1 và CC3. Như chúng ta đã biết, một bộ xử lý hiện đại có nhiều lõi, chẳng hạn như bộ xử lý di động Core Duo T5000 / T7000 được phát hành gần đây, được gọi là Penryn trong một số vòng tròn. Những gì chúng ta từng nghĩ là CPU / bộ xử lý, thực sự có nhiều CPU có mục đích chung bên cạnh nó. Intel Core Duo có 2 lõi trong chip xử lý. Intel Core-2 Quad có 4 lõi như vậy trên mỗi chip xử lý. Mỗi lõi này có trạng thái nhàn rỗi riêng. Điều này có ý nghĩa vì một lõi có thể không hoạt động trong khi một lõi khác khó làm việc trên một luồng. Vì vậy, trạng thái C cốt lõi là trạng thái nhàn rỗi của một trong những lõi đó.

Tôi đã tìm thấy một bản trình bày năm 2010 từ Intel cung cấp một số nền tảng bổ sung về intel_idletrình điều khiển, nhưng thật không may không giải thích được sự thiếu hỗ trợ cho Core 2:

Trình điều khiển TRẢI NGHIỆM này thay thế acpi_idle trên Bộ xử lý Intel Atom, Bộ xử lý Intel Core i3 / i5 / i7 và bộ xử lý Intel Xeon liên quan. Nó không hỗ trợ bộ xử lý Intel Core2 hoặc sớm hơn.

Phần trình bày ở trên chỉ ra rằng intel_idletrình điều khiển là một triển khai của trình điều khiển CPU "menu", có ảnh hưởng đến cấu hình nhân Linux (nghĩa là CONFIG_CPU_IDLE_GOV_LADDERso với CONFIG_CPU_IDLE_GOV_MENU). Sự khác biệt giữa các bậc thang và các thống đốc menu được mô tả ngắn gọn trong câu trả lời này .

Dell có một bài viết hữu ích liệt kê khả năng tương thích từ C0 đến C6 của trạng thái C:

Các chế độ từ C1 đến C3 hoạt động bằng cách cơ bản cắt các tín hiệu đồng hồ được sử dụng bên trong CPU, trong khi các chế độ từ C4 đến C6 hoạt động bằng cách giảm điện áp CPU. Chế độ "Nâng cao" có thể làm cả hai cùng một lúc.

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

Từ bảng này (mà sau này tôi thấy là không chính xác trong một số trường hợp), có vẻ như có nhiều sự khác biệt trong hỗ trợ trạng thái C với bộ xử lý Core 2 (Lưu ý rằng gần như tất cả các bộ xử lý Core 2 đều là socket LGA775, ngoại trừ Core 2 Solo SU3500, đó là bộ xử lý Socket BGA956 và Merom / Penryn. Bộ xử lý Solo / Duo của Intel Core là một trong các Ổ cắm PBGA479 hoặc PPGA478).

Một ngoại lệ bổ sung cho bảng đã được tìm thấy trong bài viết này :

Core 2 Duo E8500 của Intel hỗ trợ các trạng thái C và C2, trong khi Core 2 Extreme QX9650 thì không.

Điều thú vị là QX9650 là bộ xử lý Yorkfield (Intel 6, model 23, bước 6). Để tham khảo, Q9550S ​​của tôi là Intel 6, model 23 (0x17), bước 10, được cho là hỗ trợ trạng thái C C4 (được xác nhận thông qua thử nghiệm). Ngoài ra, Core 2 Solo U3500 có CPUID (họ, model, bước) giống hệt với Q9550S ​​nhưng có sẵn trong một ổ cắm không phải LGA775, làm hạn chế việc giải thích bảng trên.

Rõ ràng, CPUID phải được sử dụng ít nhất cho đến bước để xác định hỗ trợ trạng thái C cho mô hình bộ xử lý này và trong một số trường hợp có thể không đủ (không xác định tại thời điểm này).

Chữ ký phương thức để gán thông tin nhàn rỗi CPU là:

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

Trường hợp modelđược liệt kê trong asm / intel-family.h . Kiểm tra tệp tiêu đề này, tôi thấy rằng CPU Intel được gán số nhận dạng 8 bit có vẻ khớp với số kiểu máy 6 họ của Intel:

#define INTEL_FAM6_CORE2_PENRYN 0x17

Từ những điều trên, chúng ta có Intel Family 6, Model 23 (0x17) được định nghĩa là INTEL_FAM6_CORE2_PENRYN. Điều này là đủ để xác định trạng thái nhàn rỗi cho hầu hết các bộ xử lý Model 23, nhưng có khả năng gây ra sự cố với QX9650 như đã lưu ý ở trên.

Vì vậy, tối thiểu, mỗi nhóm bộ xử lý có bộ trạng thái C riêng biệt sẽ cần được xác định trong danh sách này.

Zagacki và Ponnala, Tạp chí Công nghệ Intel 12 (3): 219-227, 2008 chỉ ra rằng bộ xử lý Yorkfield thực sự hỗ trợ C2 và C4. Chúng dường như cũng chỉ ra rằng đặc tả ACPI 3.0a chỉ hỗ trợ chuyển đổi giữa các trạng thái C C0, C1, C2 và C3, mà tôi cho rằng cũng có thể giới hạn acpi_idletrình điều khiển Linux chuyển đổi giữa các trạng thái C giới hạn đó. Tuy nhiên, bài viết này chỉ ra rằng có thể không phải lúc nào cũng như vậy:

Hãy nhớ rằng đó là trạng thái ACPI C, không phải là bộ xử lý, vì vậy ACPI C3 có thể là HW C6, v.v.

Cũng cần lưu ý:

Ngoài chính bộ xử lý, vì C4 là một nỗ lực đồng bộ giữa các thành phần silicon chính trong nền tảng, Chipset Intel Q45 Express đạt được sự cải thiện năng lượng 28%.

Chipset tôi đang sử dụng thực sự là Chipset Intel Q45 Express.

Các tài liệu của Intel trên tiểu bang MWAIT là ngắn gọn nhưng khẳng định hành vi ACPI BIOS cụ thể:

Các trạng thái C dành riêng cho bộ xử lý được xác định trong các tiện ích mở rộng MWAIT có thể ánh xạ tới các loại trạng thái C được xác định ACPI (C0, C1, C2, C3). Mối quan hệ ánh xạ phụ thuộc vào định nghĩa trạng thái C khi thực hiện bộ xử lý và được BIOS tiếp xúc với OSPM bằng cách sử dụng bảng _CST do ACPI xác định.

Giải thích của tôi về bảng trên (kết hợp với bảng từ Wikipedia , asm / intel-family.h và các bài viết trên) là:

Mẫu 9 0x09 ( Pentium MCeleron M ):

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

Mô hình 13 0x0D ( Pentium MCeleron M ):

  • Dothan, Stealey: C0, C1, C2, C3, C4

Mô hình 14 0x0E INTEL_FAM6_CORE_YONAH ( Pentium M nâng cao , Celeron M hoặc Intel Core cải tiến ):

  • Yonah ( Lõi đơn , Bộ đôi lõi ): C0, C1, C2, C3, C4, C4E / C5

Mô hình 15 0x0F INTEL_FAM6_CORE2_MEROM (một số lõi 2Pentium Dual-Core ):

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

Mô hình 23 0x17 INTEL_FAM6_CORE2_PENRYN ( Lõi 2 ):

  • Merom-L / Penryn-L :?
  • Penryn ( Core 2 Duo di động 45nm ): C0, C1, C1E, C2, C2E, C3, C4, C4E / C5, C6
  • Yorkfield ( Lõi 2 Cực 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

Từ mức độ đa dạng trong hỗ trợ trạng thái C chỉ trong dòng bộ xử lý Core 2, có vẻ như việc thiếu hỗ trợ nhất quán cho các trạng thái C có thể là lý do không cố gắng hỗ trợ chúng hoàn toàn thông qua intel_idletrình điều khiển. Tôi muốn hoàn thành đầy đủ danh sách trên cho toàn bộ dòng Core 2.

Đây thực sự không phải là một câu trả lời thỏa mãn, vì nó khiến tôi tự hỏi có bao nhiêu năng lượng không cần thiết được sử dụng và lượng nhiệt dư thừa đã được tạo ra (và vẫn còn) bằng cách không sử dụng đầy đủ các trạng thái C MWAIT tiết kiệm năng lượng mạnh mẽ trên các bộ xử lý này.

Hayopadhyay et al. Năm 2018, Bộ xử lý hiệu suất cao tiết kiệm năng lượng: Các phương pháp gần đây để thiết kế máy tính hiệu năng cao xanh đáng chú ý đối với hành vi cụ thể mà tôi đang tìm kiếm trong Chipset Q45 Express:

Gói trạng thái C (PC0-PC10) - Khi các miền tính toán, Core và Đồ họa (GPU) không hoạt động, bộ xử lý có cơ hội tiết kiệm năng lượng bổ sung ở các mức độ uncore và nền tảng, ví dụ, xóa LLC và cấp nguồn cho bộ điều khiển bộ nhớ và DRAM IO, và ở một số trạng thái, toàn bộ bộ xử lý có thể bị tắt trong khi trạng thái của nó được bảo toàn trên miền nguồn luôn bật.

Để thử nghiệm, tôi đã chèn đoạn sau vào linux / driver / idle / intel_idle.c dòng 127:

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

tại intel_idle.cdòng 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,
};

tại intel_idle.cdòng 1073:

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

Sau khi biên dịch nhanh và khởi động lại các nút PXE của tôi, dmesgbây giờ hiển thị:

[    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

Và bây giờ PowerTOP đang hiển thị:

          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

Cuối cùng tôi đã truy cập vào trạng thái C 2 cải tiến và có vẻ như mức tiêu thụ năng lượng giảm đáng kể - đồng hồ của tôi trên 8 nút dường như trung bình thấp hơn ít nhất 5% (với một nút vẫn chạy kernel cũ) , nhưng tôi sẽ thử trao đổi hạt nhân một lần nữa như một bài kiểm tra.

Một lưu ý thú vị liên quan đến hỗ trợ C4E - Bộ xử lý My Yorktown Q9550S ​​dường như hỗ trợ nó (hoặc một số tiểu bang khác của C4), như đã được chứng minh ở trên! Điều này làm tôi bối rối, bởi vì bảng dữ liệu Intel trên bộ xử lý Core 2 Q9000 (phần 6.2) chỉ đề cập đến các trạng thái C Bình thường (C0), HALT (C1 = 0x00), HALT mở rộng (C1E = 0x01), Dừng cấp (C2 = 0x10) , Cấp dừng mở rộng (C2E = 0x11), Ngủ / Ngủ sâu (C3 = 0x20) và Ngủ sâu hơn (C4 = 0x30). Trạng thái 0x31 bổ sung này là gì? Nếu tôi kích hoạt trạng thái C2, thì C4E được sử dụng thay vì C4. Nếu tôi vô hiệu hóa trạng thái C2 (trạng thái lực lượng C2E) thì C4 được sử dụng thay vì C4E. Tôi nghi ngờ điều này có thể có liên quan đến các cờ MWAIT, nhưng tôi chưa tìm thấy tài liệu cho hành vi này.

Tôi không chắc chắn nên làm gì với điều này: Trạng thái C1E dường như được sử dụng thay cho C1, C2 được sử dụng thay cho C2E và C4E được sử dụng thay cho C4. Tôi không chắc chắn nếu C1 / C1E, C2 / C2E và C4 / C4E có thể được sử dụng cùng với intel_idlehoặc nếu chúng là dự phòng. Tôi đã tìm thấy một ghi chú trong bài trình bày năm 2010 này của Intel Labs Pittsburgh cho biết các chuyển đổi là C0 - C1 - C0 - C1E - C0 và các trạng thái khác:

C1E chỉ được sử dụng khi tất cả các lõi nằm trong C1E

Tôi tin rằng sẽ được hiểu là trạng thái C1E được nhập vào các thành phần khác (ví dụ: bộ nhớ) chỉ khi tất cả các lõi đều ở trạng thái C1E. Tôi cũng lấy điều này để áp dụng tương đương cho các trạng thái C2 / C2E và C4 / C4E (Mặc dù C4E được gọi là "C4E / C5" vì vậy tôi không chắc chắn nếu C4E là trạng thái phụ của C4 hoặc nếu C5 là một tiểu trạng thái của C4E. Thử nghiệm dường như cho thấy C4 / C4E là chính xác). Tôi có thể buộc C2E được sử dụng bằng cách nhận xét trạng thái C2 - tuy nhiên, điều này làm cho trạng thái C4 được sử dụng thay vì C4E (có thể cần nhiều công việc hơn ở đây). Hy vọng rằng không có bất kỳ bộ xử lý mô hình 15 hoặc mô hình 23 nào thiếu trạng thái C2E, bởi vì các bộ xử lý đó sẽ bị giới hạn ở C1 / C1E với mã trên.

Ngoài ra, các giá trị cờ, độ trễ và cư trú có thể có thể được điều chỉnh tốt, nhưng chỉ cần đưa ra các phỏng đoán có giáo dục dựa trên các giá trị nhàn rỗi của Nehalem dường như hoạt động tốt. Đọc thêm sẽ được yêu cầu để thực hiện bất kỳ cải tiến.

Tôi đã thử nghiệm điều này trên Core 2 Duo E2220 ( Allendale ), Dual Core Pentium E5300 ( Wolfdale ), Core 2 Duo E7400 , Core 2 Duo E8400 ( Wolfdale ), Core 2 Quad Q9550S ( Yorkfield ) và Core 2 Extreme QX9650 và I đã không tìm thấy vấn đề nào ngoài các ưu tiên đã đề cập ở trên đối với trạng thái C2 / C2E và C4 / C4E.

Không thuộc phạm vi điều chỉnh của trình điều khiển này:

  • Core Solo / Core Duo ban đầu ( Yonah , không phải Core 2) là gia đình 6, model 14. Điều này tốt vì họ hỗ trợ các trạng thái C C4E / C5 (Ngủ sâu nâng cao) nhưng không phải là trạng thái C1E / C2E và sẽ cần định nghĩa nhàn rỗi của riêng.

Các vấn đề duy nhất mà tôi có thể nghĩ đến là:

  • Core 2 Solo SU3300 / SU3500 (Penryn-L) là gia đình 6, model 23 và sẽ được trình điều khiển này phát hiện. Tuy nhiên, chúng không phải là Ổ cắm LGA775 nên chúng có thể không hỗ trợ trạng thái Halt C tăng cường C1E. Tương tự như vậy đối với Core 2 Solo ULV U2100 / U2200 ( Merom-L ). Tuy nhiên, intel_idletrình điều khiển dường như chọn C1 / C1E thích hợp dựa trên sự hỗ trợ phần cứng của các trạng thái phụ.
  • Core 2 Extreme QX9650 (Yorkfield) được cho là không hỗ trợ trạng thái C hoặc C2. Tôi đã xác nhận điều này bằng cách mua bộ xử lý Optiplex 780 và QX9650 Extreme đã qua sử dụng trên eBay. Bộ xử lý hỗ trợ các trạng thái C và C1E. Với sửa đổi trình điều khiển này, CPU không hoạt động ở trạng thái C1E thay vì C1, do đó có lẽ có một số tiết kiệm năng lượng. Tôi dự kiến ​​sẽ thấy trạng thái C, nhưng nó không xuất hiện khi sử dụng trình điều khiển này vì vậy tôi có thể cần xem xét thêm về điều này.

Tôi đã cố gắng tìm một slide từ bài thuyết trình của Intel năm 2009 về sự chuyển đổi giữa các trạng thái C (nghĩa là Deep Power Down):

Lối vào / Thoát công nghệ Deep Power Down

Tóm lại, hóa ra không có lý do thực sự nào cho việc thiếu hỗ trợ Core 2 trong intel_idletrình điều khiển. Bây giờ rõ ràng mã sơ khai ban đầu cho "Core 2 Duo" chỉ xử lý các trạng thái C C1 và C2, hoạt động kém hiệu quả hơn nhiều so với acpi_idlechức năng xử lý trạng thái C của C3. Một khi tôi biết nơi để tìm, thực hiện hỗ trợ là dễ dàng. Các ý kiến ​​hữu ích và các câu trả lời khác được đánh giá cao và nếu Amazon lắng nghe, bạn sẽ biết nơi gửi séc.

Bản cập nhật này đã được cam kết với github . Tôi sẽ gửi e-mail một bản vá cho LKML sớm.

Cập nhật : Tôi cũng đã quản lý để đào lên một socket T / LGA775 Allendale ( Conroe ) Core 2 Duo E2220, là gia đình 6, model 15, vì vậy tôi cũng đã thêm hỗ trợ cho điều đó. Mô hình này thiếu hỗ trợ cho trạng thái C C4, nhưng hỗ trợ C1 / C1E và C2 / C2E. Điều này cũng sẽ hoạt động đối với các chip dựa trên Conroe khác ( E4xxx / E6xxx ) và có thể là tất cả các bộ xử lý Kentsfield và Merom (không phải Merom-L).

Cập nhật : Cuối cùng tôi đã tìm thấy một số tài nguyên điều chỉnh MWAIT. Đây Hiệu suất so với điện writeup và điều này bang C sâu hơn và tăng độ trễ blog post cả hai đều chứa một số thông tin hữu ích vào việc xác định độ trễ CPU nhàn rỗi. Thật không may, điều này chỉ báo cáo những độ trễ thoát được mã hóa vào kernel (nhưng thật thú vị, chỉ những trạng thái phần cứng được bộ xử lý hỗ trợ):

# 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
Đó là công việc thám tử tốt đẹp! Tôi đã quên các trạng thái C của C2D / C2Q phức tạp như thế nào. Tiết kiệm năng lượng chưa được khai thác, nếu phần sụn của bạn đủ tốt thì bạn vẫn sẽ nhận được lợi ích của ít nhất một số trạng thái C thông qua acpi_idle và các thống đốc hiệu suất khác nhau. Những trạng thái nào powertophiển thị trên hệ thống của bạn?
Stephen Kitt

1
Thông tin rất hay, bạn đã xem xét đề xuất bản vá của mình cho nhân Linux ngược dòng chưa?
Lekensteyn

1
"Trạng thái C1E dường như được sử dụng thay cho C1 ..." Trạng thái được sử dụng - như được hiển thị bởi powertop - chỉ được xác định bởi hạt nhân, do đó tôi tin rằng nó sẽ không "có liên quan gì đến các cờ MWAIT", nó sẽ chỉ được chọn dựa trên thứ tự của các trạng thái và exit_latency và target_residency. Điều đó nói rằng, tôi sẽ hơi lo ngại về các trạng thái nghỉ trong bảng nếu chúng dường như không được sử dụng khi được kiểm tra ... trong trường hợp các trạng thái đó không thực sự hoạt động như mong đợi, và có một số mô hình khối lượng công việc khác dẫn đến chúng đang được sử dụng và các hành vi bất ngờ xảy ra.
nguồn

1
"các hiệu ứng chuyển tiếp là C0 - C1 - C0 - C1E - C0" - Tôi không nghĩ đó là một mô tả hay về slide đó. Từ hạt nhân / powertopquan điểm, tất cả các chuyển đổi đều từ C0 hoặc C0. Nếu bạn không ở C0, bạn không chạy bất kỳ hướng dẫn nào, do đó, hạt nhân không thể quan sát hoặc yêu cầu bất kỳ chuyển đổi nào giữa các trạng thái trên cpu đó :-). Và như bạn nói, thống đốc "menu" kernel có thể, ví dụ như nhảy thẳng vào C1E, mà không mất bất kỳ thời gian nào trong C1 trước.
nguồn

1
"chỉ lấy những phỏng đoán có giáo dục dựa trên các giá trị nhàn rỗi của Nehalem dường như hoạt động tốt" - lưu ý đây không phải là cách tốt để bản vá của bạn được chấp nhận ngược dòng :-P, trong đó độ trễ thoát không phải là đánh giá thấp, nếu không tôi nghĩ bạn sẽ vi phạm PM_QOS_CPU_DMA_LATENCY, có thể được đặt bởi trình điều khiển (hoặc không gian người dùng?)
sourcejedi

6

Tôi nghi ngờ đây có thể chỉ là một trường hợp của cơ hội và chi phí. Khi intel_idleđược thêm vào, có vẻ như hỗ trợ Core 2 Duo đã được lên kế hoạch, nhưng nó chưa bao giờ được thực hiện đầy đủ - có lẽ vào thời điểm các kỹ sư của Intel hoàn thành nó, nó không còn giá trị nữa. Phương trình tương đối phức tạp: intel_idlecần cung cấp đủ lợi ích acpi_idleđể làm cho nó có giá trị hỗ trợ ở đây, trên các CPU sẽ thấy hạt nhân cải tiến của cải tiến với số lượng đủ ...

Như câu trả lời của sourcejedi , người lái xe không loại trừ tất cả gia đình 6. Việc khởi tạo kiểm tra CPU trong danh sách các mô hình CPU , bao gồm cơ bản tất cả các kiến ​​trúc vi mô từ Nehalem đến Kaby Lake. Yorkfield cũ hơn thế (và khác biệt đáng kể - Nehalem rất khác so với các kiến ​​trúc đi trước nó). Kiểm tra gia đình 6 chỉ ảnh hưởng đến việc thông báo lỗi được in hay không; Ảnh hưởng của nó chỉ là thông báo lỗi sẽ chỉ được hiển thị trên CPU Intel, không phải CPU AMD (Intel Family 6 bao gồm tất cả các CPU Intel không phải NetBurst kể từ Pentium Pro).intel_idle

Để trả lời câu hỏi cấu hình của bạn, bạn hoàn toàn có thể vô hiệu hóa intel_idle, nhưng để nó vào cũng tốt (miễn là bạn không bận tâm đến cảnh báo).


Thông báo pr_debug () sẽ chỉ xuất hiện nếu bạn làm điều gì đó rất cụ thể để bật thông báo gỡ lỗi đó, vì vậy bạn thậm chí không phải bỏ qua cảnh báo
sourcejedi

2
@sourcejedi Tôi đã đề cập đến điều đó bởi vì OP đang nhìn thấy nó.
Stephen Kitt

gotcha. Tôi đưa ra một nhận xét nửa nghiêm túc: vì chúng tôi được hỏi về cấu hình kernel hợp lý, nếu nó được sử dụng hàng ngày, có thể không sử dụng tùy chọn cho phép tất cả các thông báo gỡ lỗi? Với tùy chọn phù hợp, chúng có thể được kích hoạt linh hoạt và chọn lọc khi cần thiết. kernel.org/doc/html/v4.17/admin-guide/dynamic-debug-howto.html Nếu bạn bật tất cả các thông báo gỡ lỗi, dù sao bạn cũng có thể có rất nhiều tin nhắn mà bạn đang bỏ qua :).
nguồn

@sourcejedi Tôi không thấy sự liên quan của các bình luận của bạn về việc vô hiệu hóa tin nhắn kernel. Tôi không thấy điều này mang tính xây dựng cho câu hỏi, mà cụ thể là hỗ trợ Core 2 cho người intel_idlelái xe.
vallismortis

@vallismortis nó rất tiếp tuyến. Điều đó có nghĩa là có cấu hình hợp lệ mà bạn có thể sử dụng cho Core 2 trở lên , không in đây là một thông báo cảnh báo gây phiền nhiễu mà đơn giản là phải bỏ qua và sẽ sử dụng intel_idle nếu được hỗ trợ ... nhưng sau đó tôi cho rằng bạn sẽ sử dụng tải động mô-đun nào, vì vậy có lẽ không đáng đề cập.
nguồn

6

Có cách nào thích hợp hơn để định cấu hình kernel để hỗ trợ CPU nhàn rỗi tối ưu cho họ bộ xử lý này không (ngoài việc vô hiệu hóa hỗ trợ cho intel_idle)

Bạn đã bật ACPI và bạn đã kiểm tra xem acpi_idle đang được sử dụng. Tôi thực sự nghi ngờ bạn đã bỏ lỡ bất kỳ tùy chọn cấu hình kernel hữu ích. Bạn luôn có thể kiểm tra powertopcác đề xuất có thể, nhưng có lẽ bạn đã biết điều đó.


Đây không phải là một câu trả lời, nhưng tôi muốn định dạng nó :-(.

Nhìn vào mã nguồn kernel, trình điều khiển intel_idle hiện tại chứa một bài kiểm tra để loại trừ cụ thể Intel Family 6 khỏi trình điều khiển.

Không, nó không :-).

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

Câu iflệnh không loại trừ Family 6. Thay vào đó, ifcâu lệnh cung cấp một thông báo khi bật gỡ lỗi, rằng CPU Intel hiện đại cụ thể này không được hỗ trợ intel_idle. Trên thực tế, CPU i5-5300U hiện tại của tôi là Family 6 và nó sử dụng intel_idle.

Điều không bao gồm CPU của bạn là không có kết quả khớp trong intel_idle_idsbảng.

Tôi nhận thấy cam kết này đã thực hiện bảng. Mã nó loại bỏ đã có một switchtuyên bố thay thế. Điều này giúp dễ dàng nhận thấy rằng mô hình sớm nhất intel_idle đã được triển khai / thử nghiệm thành công / bất cứ điều gì là 0x1A = 26. https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b58a016e5c8739cc18

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.