Coelacanth's Dream

Linux Kernel に V2 Extended Topology Enumeration の扱いを改善するパッチ

Intel の Zhang Rui 氏により、CPUID [Leaf=0x1F] から取得できるトポロジ情報、V2 Extended Topology Enumeration の扱いを改善するパッチが投稿されている。
パッチには、これまで Alder Lake-S/P/M の最大コア数の取得に関して、存在してはいたが実際に発生することは無かった問題の修正、Alder Lake-N に向けた Module ID のサポートが含まれている。

Extended Topology Enumeration

まず Extended Topology EnumerationCPUID [Leaf=0xB]CPUID [Leaf=0x1F] を実行すると返されるトポロジ情報であり、その情報を基に SMT (Thread), Core の数や ID を取得することができる。
CPUID [Leaf=0xB]SMT, Core の情報を取得できる。Intel CPU は基本的にサポートしており、MAMD CPU も Zen 2 世代からサポートしている。
CPUID [Leaf=0x1F]CPUID [Leaf=0xB] のスーパーセットであり、SMT, Core に加えて Module, Tile, Die レベルの情報が取得できるようになっている。
Intel CPU では少なくとも Alder Lake-S/P/MSapphire RapidsCPUID [Leaf=0x1F] をサポートしているが、取得できる情報は CPUID [Leaf=0xB] と同じ SMT, Core までとなっている。AMD CPU は現状 CPUID [Leaf=0x1F] をサポートしていない。

Linux Kernel では Die レベルのサポートが以前に追加されているため、Alder Lake-S/P/MSapphire Rapids は実際には Die レベルをサポートしている可能性があるが、インターネット上に公開されている情報で CPUID [Leaf=0x1F, SubLeaf=0x4?] を実行した結果を見つけられなかった。

Alder Lake

Linux Kernel では CPUID [Leaf=0xB, 0x1F] の情報を活用しているが、ハイブリッドアーキテクチャを採用する Alder Lake ではトポロジ情報が従来の CPU より複雑であり、問題が起こる可能性があった。
Alder Lake の P-Core (Golden Cove) は SMT をサポートし、1-Core/2-Thread の構成だが、E-Core (Gracemont) は 1-Core/1-Thread の構成となる。
加えて、パッチ以前の Linux Kernel ではコアあたりのスレッド数 smp_num_siblings をグローバル変数で管理しており、すべてのコアあたりのスレッド数が同じであることを前提としていた。
smp_num_siblingsCPU0 の情報を用いており、もしも E-Core が CPU0 となっていた場合、本来より少ない smp_num_siblings、スレッド数として認識されてしまう。
これまですべての Alder Lake-S/P/M プラットフォームで CPU0 に P-Core が配置されていたのはまったくの幸運によるものだと Zhang Rui 氏はコメントしている。

 This inconsistency brings several potential issues:
 1. some kernel configuration like cpu_smt_control, as set in
    start_kernel()->check_bugs()->cpu_smt_check_topology(), depends on
    smp_num_siblings set by cpu0.
    It is pure luck that all the current hybrid platforms use Pcore as cpu0
    and hide this problem.
 2. some per CPU data like cpuinfo_x86.x86_max_cores that depends on
    smp_num_siblings becomes inconsistent and bogus.
 3. the final smp_num_siblings value after boot depends on the last CPU
    enumerated, which could either be Pcore or Ecore CPU.

パッチでは、現在のレベルのプロセッサ数を示す CPUID [Leaf=0xB, 0x1F].EBX の代わりに、次のレベルのトポロジID を取得するために x2APIC ID を右シフトするビット数を示す CPUID [Leaf=0xB, 0x1F].EAX を用いることで対応している。

Alder Lake-N

Alder Lake-N では Alder Lake-S/P/M では欠けていた Module レベルをサポートする。
同時にパッチでは、これまで断片的に公開されてきてはいたが、Alder Lake-N が E-Core のみ、2-Module、Module あたり 4-Core の構成であることが明かされている。

 On Intel AlderLake-N platforms where there are Ecores only, the Ecore
 Module topology is enumerated via CPUID.1F Module level, which has not
 been supported by Linux kernel yet.
 For example, on an AlderLake-N platform, there are 2 Ecore Modules, which
 has 4 atom cores in each module, in a single package.
 Linux does not support Module level and interprets the Module ID bits as
 package ID and erroneously reports a multi module system as a
 multi-package system.

Module レベルのサポートにより、CPUID [Leaf=0x1F] から取得できる情報のみで、全体では 2-Module, 8-Core、Module あたり 4-Core であることが計算できるようになる。
Alder Lake-S/P/M では Module レベルをサポートしていないとされているが、APIC ID と L2キャッシュの対応関係から、2-Module ということは求められる (はず)。