intel_idle이 일부 Intel 시리즈 6 CPU 모델(Core 2, Pentium M)을 지원하지 않는 이유는 무엇입니까?

intel_idle이 일부 Intel 시리즈 6 CPU 모델(Core 2, Pentium M)을 지원하지 않는 이유는 무엇입니까?

나는 리눅스 커널을 조정해왔습니다.인텔 코어 2 쿼드(Yorkfield) 프로세서에서 다음 메시지를 발견했습니다 dmesg.

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

PowerTop은 패키지 및 개별 코어에 대한 상태 C1, C2 및 C3만 표시합니다.

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

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

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

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

호기심에 문의한 결과 sysfs레거시 acpi_idle드라이버가 사용 중이라는 사실을 발견했습니다(보고 싶습니다 intel_idle).

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

acpi_idle

현재 커널 소스 코드 보기인텔 유휴드라이버에는 드라이버가 특정 Intel 시리즈 6 모델을 지원하지 않는다는 내용의 디버그 메시지가 포함되어 있습니다.

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

이전 포크(2010년 11월 22일)intel_idle.cCore 2 프로세서에 대한 예상 지원을 보여줍니다(모델 23은 실제로 Core 2 Duo 및 Quad를 포함함).

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

위 코드는 2010년 12월에 삭제되었습니다.범죄.

불행하게도 소스 코드에는 문서가 거의 없기 때문에 이러한 CPU에서 유휴 기능에 대한 지원이 부족하다는 설명이 없습니다.

현재 커널 구성은 다음과 같습니다.

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

내 질문은 다음과 같습니다.

  • Core 2 프로세서가 지원되지 않는 특별한 하드웨어 이유가 있습니까 intel_idle?
  • 이 일련의 프로세서에 대한 최적의 CPU 유휴 지원을 위해 커널을 구성하는 더 적절한 방법이 있습니까(쌍에 대한 지원을 비활성화하는 것 제외 intel_idle)?

답변1

Core 2 작업 시CPU 전원 상태("C 상태"), 실제로 대부분의 이전 Intel Core/Core 2 프로세서에 대한 지원을 구현했습니다. 전체 구현(Linux 패치) 및 모든 배경 정보가 여기에 문서화되어 있습니다.

이러한 프로세서에 대한 더 많은 정보를 축적하면서 Core 2 모델에서 지원되는 C 상태가 이전 및 후속 프로세서의 C 상태보다 훨씬 더 복잡하다는 것을 알게 되었습니다. 이들은 호출됩니다향상된 C 상태(또는"CXE”), 여기에는 칩셋의 패키지, 개별 코어 및 기타 구성 요소(예: 메모리)가 포함되어 있습니다. 드라이버 출시 당시 intel_idle코드는 특별히 성숙되지 않았으며 여러 Core 2 프로세서가 충돌하는 C- 국가 지원.

Core 2 Solo/Duo C-state 지원에 대한 몇 가지 유용한 정보는 다음에서 확인할 수 있습니다.이 글은 2006년 글입니다. 이는 Windows 지원과 관련이 있지만 이러한 프로세서에 대한 강력한 하드웨어 C 상태 지원을 보여줍니다. Kentsfield에 대한 정보가 실제 모델 번호와 충돌하므로 실제로는 아래 Yorkfield를 참조하는 것으로 생각됩니다.

...쿼드 코어 Intel Core 2 Extreme(Kentsfield) 프로세서는 Enhanced Intel SpeedStep(EIST), Thermal Monitor 1(TM1) 및 Thermal Monitor 2(TM2), Legacy On-Demand Clock 등 5가지 성능 및 절전 기술을 모두 지원합니다. 변조(ODCM) 및 C-상태 강화(CxE). 이 기능은 향상된 일시 중지(C1) 상태 기능만 갖춘 Intel Pentium 4 및 Pentium D 600, 800 및 900 프로세서와 비교하여 Intel Core 2 프로세서(및 Intel Core Solo/Duo 프로세서)에서 확장되었습니다. Stop Grant(C2), Deep Sleep(C3) 및 Deep Sleep(C4)을 포함한 프로세서의 유휴 상태입니다.

이 글은 2008년 글입니다Core 2 Duo 및 Core 2 Quad를 포함한 멀티 코어 Intel 프로세서의 코어별 C 상태 지원 개요(추가로 유용한 배경 자료는 다음에서 찾을 수 있습니다.)Dell 백서):

핵심 C 상태는 하드웨어 C 상태입니다. CC1 및 CC3과 같은 몇 가지 핵심 유휴 상태가 있습니다. 최근 출시된 Core Duo T5000/T7000 모바일 프로세서(일부에서는 Penryn이라고도 함)와 같은 최신 최첨단 프로세서에 다중 코어가 있다는 것은 누구나 다 아는 사실입니다. 우리가 CPU/프로세서라고 생각했던 것은 실제로 여러 개의 범용 CPU를 포함하고 있었습니다. Intel Core Duo 프로세서 칩에는 2개의 코어가 있습니다. Intel Core-2 Quad에는 각 프로세서 칩에 이러한 코어가 4개 있습니다. 각 코어에는 고유한 유휴 상태가 있습니다. 한 코어는 유휴 상태일 수 있고 다른 코어는 스레드에서 열심히 작업하고 있기 때문에 이는 의미가 있습니다. 따라서 코어 C 상태는 이러한 코어 중 하나의 유휴 상태입니다.

내가 하나 찾았어인텔 2010 연설드라이버에 대한 몇 가지 추가 배경 정보를 제공 intel_idle하지만 안타깝게도 Core 2 지원 부족에 대해서는 설명하지 않습니다.

이 실험용 드라이버는 Intel Atom 프로세서, Intel Core i3/i5/i7 프로세서 및 관련 Intel Xeon 프로세서의 acpi_idle을 대체합니다. Intel Core2 또는 이전 프로세서는 지원하지 않습니다.

위의 소개는 intel_idle드라이버가 Linux 커널 구성에 영향을 미치는 "메뉴" CPU 관리자의 구현임을 나타냅니다(예 CONFIG_CPU_IDLE_GOV_LADDER: CONFIG_CPU_IDLE_GOV_MENU). 래더 조절기와 메뉴 조절기의 차이점은 다음과 같습니다.이 답변.

Dell에는 하나가 있습니다.유용한 기사나열된 C는 C0부터 C6까지의 호환성을 나타냅니다.

C1~C3 모드는 기본적으로 CPU 내부에서 사용하는 클럭 신호를 차단해 작동하는 반면, C4~C6 모드는 CPU 전압을 줄여 작동한다. "향상된" 모드는 두 가지를 동시에 수행할 수 있습니다.

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

이 표(나중에 어떤 경우에는 잘못된 것으로 확인됨)에서 Core 2 프로세서에 대한 C 상태 지원에 다양한 차이점이 있는 것으로 보입니다(Core 2 프로세서 프로세서를 제외하고 거의 모든 Core 2 프로세서는 소켓 LGA775입니다). ) 2 Solo SU3500은 소켓 BGA956 및 Merom/Penryn 프로세서이며, "Intel Core" Solo/Duo 프로세서는 소켓 PBGA479 또는 PPGA478 중 하나입니다.

이 표의 또 다른 예외는 다음과 같습니다.이 기사:

Intel의 Core 2 Duo E8500은 C-state C2 및 C4를 지원하지만 Core 2 Extreme QX9650은 지원하지 않습니다.

흥미롭게도 QX9650은 Yorkfield 프로세서(Intel Series 6, Model 23, Step 6)입니다. 참고로 제 Q9550S는 Intel family 6, model 23(0x17), step 10이며 C state C4를 지원한다고 합니다(실험을 통해 확인). 추가적으로 Core 2 Solo U3500은 Q9550S와 동일한 CPUID(시리즈, 모델, 단계)를 가지고 있지만 LGA775가 아닌 소켓에서 작동하므로 위 표의 해석이 혼란스럽습니다.

분명히 해당 프로세서 모델에 대한 C 상태 지원을 확인하려면 최소한 CPUID를 사용해야 하며 경우에 따라 이것이 충분하지 않을 수도 있습니다(아직 결정되지 않음).

CPU 유휴 정보를 할당하기 위한 메서드 서명은 다음과 같습니다.

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

model나열할 위치asm/intel-family.h. 이 헤더 파일을 조사해 보면 Intel CPU에 Intel Series 6 모델과 일치하는 것으로 보이는 8비트 식별자가 할당되어 있음을 알 수 있습니다.

#define INTEL_FAM6_CORE2_PENRYN 0x17

위에서 우리는 Intel Family 6, Model 23(0x17)을 INTEL_FAM6_CORE2_PENRYN.

따라서 최소한 다른 C 상태 집합을 가진 모든 프로세서 집합을 이 목록에 정의해야 합니다.

자가키와 보나라,인텔 기술 매거진 12(3):219-227, 2008Yorkfield 프로세서가 C2 및 C4를 지원함을 보여줍니다. 또한 ACPI 3.0a 사양은 C 상태 C0, C1, C2 및 C3 간의 전환만 지원한다는 점을 나타내는 것 같습니다. 이는 Linux acpi_idle드라이버가 제한된 C 상태 집합 간에만 전환하도록 제한할 수도 있다고 생각합니다. 하지만,이 기사항상 그런 것은 아닐 수도 있음을 보여주십시오.

이는 프로세서 상태가 아닌 ACPI C 상태이므로 ACPI C3은 HW C6 등일 수 있습니다.

또한 주목할 가치가 있는 것:

프로세서 자체 외에도 Intel Q45 Express 칩셋은 플랫폼의 주요 실리콘 구성 요소 간의 동기화된 작업인 C4로 인해 전력 소비가 28% 향상되었습니다.

제가 사용하고 있는 칩셋은 사실 Intel Q45 Express 칩셋입니다.

이것MWAIT에 대한 인텔 문서매우 간결하지만 BIOS 관련 ACPI 동작을 확인합니다.

MWAIT 확장에 정의된 프로세서별 C 상태는 ACPI에서 정의된 C 상태 유형(C0, C1, C2, C3)에 매핑될 수 있습니다. 매핑은 프로세서 구현의 C 상태 정의에 따라 달라지며 ACPI에서 정의한 _CST 테이블을 사용하여 BIOS에 의해 OSPM에 노출됩니다.

위의 표에 대한 나의 해석(Wikipedia의 표,asm/intel-family.h위 기사)는 다음과 같습니다.

모델 9 0x09(펜티엄M그리고사이영M):

  • 바니야스: C0, C1, C2, C3, C4

모델 13 0x0D(펜티엄M그리고사이영M):

  • 도단 스틸리: C0, C1, C2, C3, C4

모델 14 0x0E INTEL_FAM6_CORE_YONAH(향상된 펜티엄 M,향상된 셀러론 M또는인텔 코어):

  • 요나 (코어 솔로,코어 듀얼 코어): C0, C1, C2, C3, C4, C4E/C5

모델 15 0x0F INTEL_FAM6_CORE2_MEROM(일부코어 2그리고펜티엄 듀얼 코어):

  • 켄츠필드, 메롬, 콘로, 앨런데일(E2xxx/E4xxx그리고코어 2 듀오 E6xxx, T7xxxx/T8xxxx,코어 2 익스트림 QX6xxx,코어 2 쿼드 Q6xxx): C0, C1, C1E, C2, C2E

모델 23 0x17 INTEL_FAM6_CORE2_PENRYN(코어 2):

  • 메롬-L/Penglin-L:?
  • 펑린(코어 2 듀오 45nm 모바일 프로세서): C0, C1, C1E, C2, C2E, C3, C4, C4E/C5, C6
  • 요크필드(코어 2 익스트림 QX9650): C0, C1, C1E, C2E?, C3
  • 울프데일/요크필드(코어 2 쿼드,C2Q 제온,코어 2 듀얼 코어 E5xxx/E7xxx/E8xxx,펜티엄 듀얼 코어 E6xxx,셀러론 듀얼 코어): C0, C1, C1E, C2, C2E, C3, C4

Core 2 시리즈 프로세서의 C-상태 지원의 다양성으로 판단할 때, C-상태에 대한 일관된 지원이 부족하다는 것은 드라이버를 통해 C-상태를 완전히 지원하려고 시도하지 않는 이유일 수 있습니다 intel_idle. 전체 Core 2 시리즈의 위 목록을 완성하고 싶습니다.

이는 뛰어난 절전 기능을 최대한 활용하지 않음으로써 얼마나 많은 불필요한 전력이 사용되었고(그리고 여전히 발생하고 있는지) 궁금해지기 때문에 실제로 만족스러운 대답은 아닙니다.MWAIT C 상태이 프로세서에서.

차토파디아이외.2018년,에너지 효율적인 고성능 프로세서: 친환경 고성능 컴퓨팅 설계에 대한 최신 접근 방식Q45 Express 칩셋에서 내가 찾고 있는 특정 동작에 주목할 가치가 있습니다.

패키지 C 상태(PC0-PC10) - 컴퓨팅 도메인, 코어 및 그래픽 카드(GPU)가 유휴 상태일 때 프로세서는 LLC 및 전력 새로 고침과 같은 비코어 및 플랫폼 수준에서 추가 전력 절감을 달성할 수 있는 기회를 갖습니다. - 메모리 컨트롤러 및 DRAM IO를 게이팅하고 특정 상태에서는 해당 상태가 항상 켜져 있는 전원 도메인에 유지되는 동안 전체 프로세서가 종료될 수 있습니다.

테스트로 다음을 삽입했습니다.리눅스/드라이버/idle/intel_idle.c127행:

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

983 행 intel_idle.c:

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

라인 1073 intel_idle.c:

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

마침내 Enhanced Core 2 C 상태에 액세스할 수 있게 되었고 전력 소비가 크게 감소한 것 같습니다. 8개 노드의 측정기가 평균 5% 이상 감소한 것 같습니다(노드 중 하나는 여전히 이전 코어를 실행하고 있습니다). , 하지만 테스트로 커널을 다시 전환해 보겠습니다.

C4E 지원에 대한 흥미로운 참고 사항 - 위에 표시된 대로 내 Yorktown Q9550S ​​프로세서가 이를 지원하는 것 같습니다(또는 C4의 다른 하위 상태)! 이것이 나를 혼란스럽게 한다. 왜냐하면Intel Core 2 Q9000 프로세서 데이터시트(섹션 6.2) C 상태 OK(C0), HALT(C1 = 0x00), 확장 HALT(C1E = 0x01), 중지 허용(C2 = 0x10), 확장 중지 허용(C2E = 0x11), 절전/깊은 절전( C3 = 0x20) 및 딥 슬립(C4 = 0x30). 이 추가 0x31 상태는 무엇입니까? 상태 C2를 활성화하면 C4 대신 C4E가 사용됩니다. 상태 C2를 비활성화하면(상태 C2E 강제) C4E 대신 C4가 사용됩니다. 이것이 MWAIT 플래그와 관련이 있을 수 있다고 생각하지만 이 동작에 대한 문서를 찾지 못했습니다.

C1E 상태는 C1 대신에, C2는 C2E 대신에, C4E는 C4 대신에 사용되는 것 같습니다. C1/C1E, C2/C2E, C4/C4E를 함께 사용할 수 있는지 intel_idle, 아니면 중복되는지 잘 모르겠습니다 . 댓글을 찾았어요Intel Pittsburgh Labs 2010의 시연C0 - C1 - C0 - C1E - C0으로의 변환을 나타내며 다음과 같이 자세히 설명합니다.

모든 코어가 C1E에 있는 경우에만 C1E를 사용하십시오.

이는 모든 코어가 C1E 상태가 되어야만 다른 구성 요소(예: 메모리)가 C1E 상태로 진입한다는 사실로 설명할 수 있다고 생각합니다. 나는 또한 C2/C2E 및 C4/C4E 상태에도 동일하게 적용된다고 생각합니다. (C4E는 "C4E/C5"라고 불리기 때문에 C4E가 C4의 하위 상태인지, C5가 C4E의 하위 상태인지는 확실하지 않습니다) . 테스트 결과 C4/C4E가 올바른 것으로 나타났습니다. C2 상태를 주석 처리하여 C2E를 강제로 사용하도록 할 수 있습니다. 그러나 이로 인해 C4E 대신 C4 상태가 사용됩니다(여기서 더 많은 작업이 필요할 수 있음). 상태 C2E가 누락된 모델 15 또는 모델 23 프로세서가 없기를 바랍니다. 해당 프로세서는 위 코드를 사용하여 C1/C1E로 제한되기 때문입니다.

또한 플래그, 지연 및 드웰 값에 대한 미세 조정이 필요할 수 있지만 Nehalem 유휴 값을 기반으로 학습된 추측을 취하는 것만으로도 잘 작동하는 것 같습니다. 개선이 이루어지기 전에 더 많은 독서가 필요합니다.

나는 이것을 테스트했습니다.코어 2 듀오 E2220(앨런데일), ㅏ듀얼 코어 펜티엄 E5300(울프데일),코어 2 듀오 E7400,코어 2 듀오 E8400(울프데일),코어 2 쿼드 Q9550S(요크필드) 그리고코어 2 익스트림 QX9650, 상태 C2/C2E 및 C4/C4E에 대한 위의 기본 설정 이외의 문제는 표시되지 않습니다.

이 드라이버 수정에는 다음이 포함되지 않습니다.

  • 원래의코어 솔로/코어 듀얼 코어(유나, 비코어 2)는 시리즈 6, 모델 14입니다. 이는 C4E/C5(향상된 깊은 절전) C 상태를 지원하지만 C1E/C2E 상태는 지원하지 않으며 자체 유휴 정의가 필요하기 때문에 좋습니다.

내가 생각할 수 있는 유일한 질문은 다음과 같습니다.

  • 코어 2 솔로 SU3300/SU3500(Penryn-L)은 시리즈 6, 모델 23이며 이 드라이버에 의해 감지됩니다. 그러나 LGA775 소켓이 아니므로 C1E 향상된 중지 C 상태를 지원하지 않을 수 있습니다. Core 2 Solo ULV U2100/U2200(메롬-L). 그러나 intel_idle드라이버는 하위 상태의 하드웨어 지원을 기반으로 적절한 C1/C1E를 선택하는 것으로 보입니다.
  • Core 2 Extreme QX9650(Yorkfield)은 C-state C2 또는 C4를 지원하지 않는 것으로 알려졌습니다. eBay에서 중고 Optiplex 780 및 QX9650 Extreme 프로세서를 구입하여 이를 확인했습니다. 프로세서는 C 상태 C1 및 C1E를 지원합니다. 이 드라이버 수정을 통해 CPU는 C1 대신 C1E 상태에서 유휴 상태가 되므로 일부 전력이 절약될 수 있습니다. C 상태 C3이 표시될 것으로 예상했지만 이 드라이버를 사용하면 표시되지 않으므로 더 자세히 조사해야 할 수도 있습니다.

저는 2009년 Intel 프레젠테이션에서 C 상태 간 전환(즉, 최대 전원 차단)에 관한 슬라이드를 찾았습니다.

딥 파워 다운 기술 진입/종료

전체적으로 intel_idle드라이버에서 Core 2 지원이 부족한 실제 이유는 없는 것으로 나타났습니다. 이제 "Core 2 Duo"의 원래 스텁 코드는 C 상태 C1 및 C2만 처리한다는 것이 분명해졌으며 이는 acpi_idleC 상태 C3도 처리하는 기능보다 훨씬 덜 효율적입니다. 어디를 봐야 할지 알면 지원을 구현하는 것이 쉬웠습니다. 유용한 의견과 기타 답변에 진심으로 감사드립니다. Amazon이 듣고 있다면 수표를 어디로 보낼지 아실 것입니다.

이 업데이트에는github에 커밋됨. 곧 LKML에 패치를 이메일로 보내드리겠습니다.

고쳐 쓰다: 소켓 T/LGA775도 찾았습니다.앨런데일(콘로) Core 2 Duo E2220, 시리즈 6, 모델 15의 일부이므로 이에 대한 지원도 추가했습니다. 이 모델은 C-state C4에 대한 지원이 부족하지만 C1/C1E 및 C2/C2E를 지원합니다. 이는 다른 Conroe 기반 칩에도 적용됩니다(E4xxx/E6xxx) 및 가능하면 모든 Kentsfield 및 Merom(Merom-L이 아닌) 프로세서.

고쳐 쓰다: 드디어 MWAIT 튜닝 리소스를 찾았습니다. 이것힘과 성능쓰고 이거더 깊은 C 상태 및 증가된 대기 시간블로그 게시물에는 모두 CPU 유휴 대기 시간을 식별하는 데 유용한 몇 가지 정보가 포함되어 있습니다. 안타깝게도 이는 커널에 인코딩된 종료 지연만 보고합니다(흥미롭게도 프로세서에서 지원하는 하드웨어 상태만 보고됩니다).

# 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

고쳐 쓰다:최근 인텔 직원이 게시한 글기사intel_idleMWAIT 상태 에 대한 자세한 설명입니다 .

답변2

나는 이것이 단지 기회와 비용의 문제일지도 모른다고 생각합니다. Core 2 Duo에 대한 지원은 추가되었을 때 계획된 것처럼 보였지만 intel_idle완전히 실현되지는 않았습니다. 아마도 Intel 엔지니어가 이를 고려하기 시작했을 때 더 이상 가치가 없었을 것입니다. 방정식은 상대적으로 복잡합니다. 여기에서 지원할 가치가 있으려면 intel_idle충분한 이점이 제공되어야 하며 acpi_idle, 충분한 수의 "향상된" 코어가 CPU에 표시됩니다...

~처럼소스 제다이~의답변해당 드라이버는 모든 시리즈 6을 제외하지 않습니다. intel_idle초기화 확인 CPUCPU 모델 목록, 기본적으로 Nehalem에서 Kaby Lake까지 모든 마이크로 아키텍처를 포괄합니다. Yorkfield는 그보다 오래되었습니다(그리고 상당히 다릅니다. Nehalem은 이전 버전과 매우 다릅니다). 제품군 6 테스트는 오류 메시지가 인쇄되는지 여부에만 영향을 미칩니다. 그 효과는 오류 메시지가 AMD CPU가 아닌 Intel CPU에만 표시된다는 것입니다(Intel 제품군 6에는 Pentium Pro 이후 NetBurst가 아닌 모든 Intel CPU가 포함되어 있습니다).

구성 질문에 답하려면 완전히 비활성화할 수 있지만 intel_idle, 그대로 두어도 괜찮습니다(경고에 신경 쓰지 않는 한).

답변3

이 프로세서 제품군에 대한 최적의 CPU 유휴 지원을 위해 커널을 구성하는 더 적절한 방법이 있습니까(intel_idle에 대한 지원을 비활성화하는 것 제외)

ACPI를 활성화하고 acpi_idle이 사용 중인지 확인했습니다. 유용한 커널 구성 옵션이 누락되어 있는지 진심으로 의심됩니다. 언제든지 가능한 제안을 확인할 수 있지만 powertop아마도 이미 알고 있을 것입니다.


이것은 답변이 아니지만 형식을 지정하고 싶습니다 :-(.

커널 소스 코드를 보면 현재 intel_idle 드라이버에는 드라이버에서 Intel 제품군 6을 구체적으로 제외하는 테스트가 포함되어 있습니다.

아니요, 그렇지 않습니다 :-).

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

if진술은 Family 6을 제외하지 않습니다. 대신, 이 if명령문은 디버깅이 활성화되면 이 특정 최신 Intel CPU가 지원되지 않는다는 메시지를 제공합니다 intel_idle. 실제로 현재 i5-5300U CPU는 Family 6이며 intel_idle.

CPU를 제외하는 것은 테이블에 일치하는 항목이 없다는 것입니다 intel_idle_ids.

나는 이것이 테이블 제출을 구현한다는 것을 알았습니다. 삭제하는 코드에는 switch명령문이 있습니다. 이를 통해 초기 모델 intel_idle이 구현/성공적으로 테스트/0x1A = 26인지 쉽게 확인할 수 있습니다. https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

답변4

1년이 지나면 이러한 오래된 시스템은 점점 드물어지지만 여전히 유휴 상태에 대한 커널 지원은 없습니다. 위와 비슷한 방식으로 코어를 사용자 정의하여 코어 온도와 전력 소비를 효과적으로 낮췄습니다. 이전에는 유휴 상태일 때 코어 온도가 약 60°C, intel_idle을 사용자 정의할 때 약 45°C였습니다.

intel_idle.c에서는 약간 다른 구성을 사용하고 있습니다. C1E 승격 비활성화 플래그를 설정했습니다. C1E는 프로세서가 C1에 들어갈 때마다 일반적으로 자동으로 도달하는 상태입니다(BIOS에 구성된 경우). intel_idle은 모든 경우에 이 기능을 비활성화하고 C1E를 별도의 C 상태로 처리합니다. 이는 주로 QoS 문제를 일으킬 수 있는 지연된 상태에 프로세서가 실수로 갇히는 것을 방지하기 위한 것입니다. 이는 max_cstate가 예상보다 1이 높다는 것을 의미합니다. 2는 C1E이기 때문입니다. ). C2E 상태도 비슷하지만 intel_idle에서 비활성화되거나 별도로 처리되지 않으므로 구성에서 완전히 제외했습니다. BIOS에는 일반적으로 이 상태로의 자동 업그레이드를 활성화 또는 비활성화하는 옵션이 있으므로 BIOS에서 비활성화하고 intel_idle에서 활성화하면 아마도 더 나은 결과를 얻을 수 있지만 시도하지는 않았습니다.

이는 E2180에서 수행되었으므로 C2/C2E 이상의 상태는 없지만 주요 이득은 첫 번째 유휴 상태에서 발생한 것으로 보입니다. 나는 구형 Pentium 4를 가지고 있고 Linux는 코어 온도를 10-15C 낮추는 C1만 지원합니다. Core i7을 사용한 실험에서는 C3 또는 C6이 활성화되었을 때 온도가 약간만 추가로 떨어지는 것으로 나타났습니다. 하지만 배터리 절약 효과가 여전히 가치가 있다고 생각할 수도 있습니다. 위에 표시된 대로 구성된 대기 시간과 관련하여 눈에 띄는 성능 문제는 발견하지 못했지만, 결코 하드코어 게임기는 아닙니다.

관련 정보