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_idle
trì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_idle
trì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_idle
trì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_LADDER
so 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_idle
trì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 M và Celeron M ):
- Banias: C0, C1, C2, C3, C4
Mô hình 13 0x0D ( Pentium M và Celeron 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 2 và Pentium Dual-Core ):
- Kentsfield, Merom, Conroe, Allendale ( E2xxx / E4xxx và Core 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_idle
trì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.c
dò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.c
dò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, dmesg
bâ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_idle
hoặ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_idle
trì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):
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_idle
trì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_idle
chứ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
acpi_idle
và các thống đốc hiệu suất khác nhau. Những trạng thái nàopowertop
hiển thị trên hệ thống của bạn?