커널은 물리적 코어에 CPU ID를 어떻게 할당합니까?

커널은 물리적 코어에 CPU ID를 어떻게 할당합니까?

실행 중인 Linux 시스템에서 물리적 코어 레이아웃을 확인하는 방법에 대한 많은 정보를 찾을 수 있지만 먼저 물리적 코어에 CPU ID가 할당되는 방법을 알고 싶습니다.

몇 대의 컴퓨터에서 이를 경험한 후에는 할당이 결정적인 것으로 보입니다(즉, 동일한 하드웨어에서 부팅하면 동일한 CPU ID가 물리적 처리 코어에 할당됩니다). 또한 작업 분배는 인접한 번호가 매겨진 두 개의 코어가 물리적으로 서로 멀리 떨어져 있는 "라운드 로빈" 방식인 것 같습니다. 예를 들어, 내가 작업 중인 한 서버(소켓 2개 x CPU x 2개, 하이퍼스레드 2개, x86_64): cpu0소켓 0, cpu1소켓 1, cpu2다시 소켓 0에 있지만 cpu0; cpu15까지 이와 같이 계속되면 cpu16하이퍼스레딩은 과 동일한 물리적 코어에서 구현됩니다 cpu0.

2소켓 x86_64의 CPU 레이아웃

이것이 의도적인 것으로 보인다면 이 동작에 대한 문서를 어디서 찾을 수 있는지 아십니까? 이것의 근거는 무엇입니까?

특히 문서나 lkml 게시물에 대한 참조를 주시면 감사하겠습니다. 소스 코드의 올바른 위치를 가리키는 포인터라도 도움이 될 수 있습니다.

답변1

거의 문서화되지 않았으며 플랫폼에 크게 의존합니다. x86의 경우 다음으로 사용 가능한 ID가 함수의 CPU에 할당됩니다.generic_processor_info()

따라서 x86의 경우 CPU ID는 함수를 호출하는 순서에 따라 달라집니다. APIC(인터럽트 컨트롤러)가 초기화될 때 호출되며 APIC 설정은 BIOS에서 제공하는 ACPI MADT 테이블에서 가져옵니다.

acpica-toolsACPI 도구(CentOS의 패키지)를 사용하여 직접 디코딩 해 볼 수 있습니다 .

# acpidump > acpi.dat
# acpixtract -a acpi.dat
# iasl -d apic.dat
...
# cat apic.dsl | awk -F: '/Subtable Type/ { st = $2 }
                          /Processor ID/ { id = $2 }
                          /Processor Enabled/ { print id, $2, st } '

관련 정보