Intel Kaby Lake 周りの CPU Stepping を整理するパッチ

Update: 2021/04/09 06:10 JST

Linux Kernel には Intel CPU (Family: 0x6) の判別をするため、Model をまとめたヘッダファイル intel-family.h があるが、Intel の Peter Zijlstra 氏により、そこに複雑な Kaby Lake 周りを整理するためのコメントを追加するパッチが投稿された。

Index

Kaby Lake

CPUマイクロアーキテクチャに Sky Lake アーキテクチャ を採用し、Intel 14nmプロセスで製造されるプロセッサにはモバイル向け、デスクトップ向けといった括りを無視すれば、Sky Lake / Kaby Lake / Amber Lake / Whiskey Lake / Coffee Lake / Comet Lake の 6種類が存在する。
Family, Model による CPU の判別において、Sky Lake (_L/X)Comet Lake (_L)Model がそれぞれ違っているため判別することは容易だが、Kaby Lake についてはそうはいかない。
【雑記】CPUID の Family と Model、表示する一部ソフトウェアの問題点 | Coelacanth's Dream

モバイル向け Kaby Lake (KABYLAKE_L)Model: 0x8E (142) が与えられているが、同じ Model が Amber Lake(-Y) / Coffee Lake(-U) / Whiskey Lake(-U) が使われている。
intel-family.h では、末尾 _L がモバイル向け、_X がサーバー向け、_D がマイクロサーバー向け、無印がデスクトップ向けと区別されている。
デスクトップ向け Kaby LakeModel: 0x9E (158) が与えられており、同様に Coffee Lake(-S) が同じ Model となる。モバイル向けよりはマシだが、ややこしいことに変わりはない。
同じ Model を使う Kaby Lake 群は代わりに Stepping で区別され、それをコメントではっきりと示したのが今回のパッチ内容となる。

コメントによれば、Amber Lake(-Y) (AMBERLAKE_L)Stepping: 9Coffee Lake(-U) (COFFEELAKE_L)Stepping: 0xA (10)Whiskey Lake(-U) (WHISKEYLAKE_L)Stepping 0xB/0xC (11/12) を、
Coffee Lake(-S)Stepping: 0xA/0xB/0xC/0xD (10/11/12/13) を用いる。

 +#define INTEL_FAM6_SKYLAKE_L       0x4E    /* Sky Lake             */
 +#define INTEL_FAM6_SKYLAKE     0x5E    /* Sky Lake             */
 +#define INTEL_FAM6_SKYLAKE_X       0x55    /* Sky Lake             */

 -#define INTEL_FAM6_CANNONLAKE_L        0x66
 +#define INTEL_FAM6_KABYLAKE_L      0x8E    /* Sky Lake             */
 +/*                 AMBERLAKE_L     0x8E       Sky Lake -- s: 9     */
 +/*                 COFFEELAKE_L        0x8E       Sky Lake -- s: 10    */
 +/*                 WHISKEYLAKE_L   0x8E       Sky Lake -- s: 11,12 */

 -#define INTEL_FAM6_ICELAKE_X       0x6A
 -#define INTEL_FAM6_ICELAKE_D       0x6C
 -#define INTEL_FAM6_ICELAKE     0x7D
 -#define INTEL_FAM6_ICELAKE_L       0x7E
 -#define INTEL_FAM6_ICELAKE_NNPI        0x9D
 +#define INTEL_FAM6_KABYLAKE        0x9E    /* Sky Lake             */
 +/*                 COFFEELAKE      0x9E       Sky Lake -- s: 10-13 */

 -#define INTEL_FAM6_TIGERLAKE_L     0x8C
 -#define INTEL_FAM6_TIGERLAKE       0x8D
 +#define INTEL_FAM6_COMETLAKE       0xA5    /* Sky Lake             */
 +#define INTEL_FAM6_COMETLAKE_L     0xA6    /* Sky Lake             */

Stepping は基本大きい程進んだものとなっており、以前の Stepping に存在したエラッタの修正や脆弱性への対応が盛り込まれている。
Coffee Lake(-S) の Stepping 数が多いのは脆弱性への対策が理由として大きく、Intel が公開している情報によれば、B0 (0xB) -> P0 (0xC) で、Spectre v2/v4、Meltdown、L1TF、MDS への策がハードウェア側に追加されている。 (Spectre v2/v4 はソフトウェアと合わせての対策) 1

Coffee Lake(-S)2 Stepping
S (U0) 0xA (10)
S (B0) 0xB (11)
S (P0) 0xC (12)
H (U0) 0xA (10)
H (R0) 0xD (13)

しかし今回追加されたコメントでもややこしいでも Kaby Lake 周りをすべてカバーできているとは言えず、Kaby Lake にはまだ AMD GPU とコラボした Kaby Lake-G 、LGA2066ソケットに対応したエンスージアスト向けの Kaby Lake-X が存在するからだ。それらは Stepping: 9 となっている。

さらには Comet Lake-UWhiskey Lake-U が紛れ込んでいる。
Comet Lake-U の 1つに Core i3-10110U が存在するが、InstLatx64 氏が収集、公開しているデータによれば Family: 0x6, Model: 0x8E, Stepping: 0xC となっており 3、これは Comet Lake-U ではなく Whiskey Lake-U のものと一致する。
しかし ark.intel.com では Comet Lake としており 4、iGPU の DeviceID (0x9B41/0x9BCA/0x9BCC) も Comet Lake とされている。5
マーケティング、GPU的には Comet Lake とされるが、CPUID (Family, Model, Stepping) 的には Whiskey Lake-U という、曖昧で複雑な CPU だ。
Coffee Lake(-S) は脆弱性対策で、Kaby Lake-UAmber Lake-Y / Coffee Lake-U / Whiskey Lake-U は Intel 10nmプロセスの遅延で複雑化した CPU 達とも言えるかもしれない。

Palm Cove

パッチでは Cannon Lake についても触れており、CPUマイクロアーキテクチャ名 Palm Cove をコメントに記している。
Palm Cove というのは以前からネット上では知られていたが、OSS へのパッチ、それも補足コメントという形とはいえ、Intel が公式的に Palm Cove の名を出したのは初めてな気がする。

 +#define INTEL_FAM6_CANNONLAKE_L        0x66    /* Palm Cove */

ただ、パッチ内で Peter Zijlstra 氏は、Cannon Lake (Palm Cove) は Linux Kernel の CPU性能解析ツール perf コマンドのサポートがされていない、とコメントしており、それは intel-family.hCannon Lake のためのマクロを残す必要性が薄いことを意味する。
Palm Cove の名がようやく? Intel より出されたは、将来的には GPUドライバーのように、コードから Cannon Lake のための部分が削除される可能性も出てきた。
Cannon Lake を追う | Coelacanth's Dream

Sapphire Rapids == Golden Cove? / Willow Cove?

パッチでは他に、Tiger LakeSapphire RapidsAlder Lake の CPUマイクロアーキテクチャも補完しているが、Sapphire RapidsAlder Lake と同じ Golden Cove ではなく、Tiger Lake と同じ Willow Cove とされている。
しかし、個人的には Peter Zijlstra 氏の間違いではないかと考えている。

 +#define INTEL_FAM6_TIGERLAKE_L     0x8C    /* Willow Cove */
 +#define INTEL_FAM6_TIGERLAKE       0x8D    /* Willow Cove */
 +#define INTEL_FAM6_SAPPHIRERAPIDS_X    0x8F    /* Willow Cove */
 +
 +#define INTEL_FAM6_ALDERLAKE       0x97    /* Golden Cove / Gracemont */
 +#define INTEL_FAM6_ALDERLAKE_L     0x9A    /* Golden Cove / Gracemont */

まず、Alder Lake は Core (Big) 側に Golden Cove アーキテクチャ を採用することが明言されている。
そして、Alder LakeSapphire Rapids も 128-bit/256-bit幅の AVX_VNNI 命令に対応しており、他にも CLDEMOTE / PTWRITE / Architectural LBRs / HLAT / SERIALIZE 等の最新の命令における対応も共通している。
また、Sapphire Rapids は、用途に 5G基地局等を想定した AVX512_FP16/HFNI 命令に対応しており、それは Golden Cove の特徴として挙げられた Network/5G Perf の文言と一致する。
Intel Sapphire Rapids は AVX512_FP16 をサポート | Coelacanth's Dream さらには、上で少し触れた perf コマンドの対応に関して、Alder Lake (Golden Cove) の PMU (Performance Monitoring Unit) は Sapphire Rapids のそれと近いというコメントがされている。6
そういう訳で Sapphire Rapids の CPUマイクロアーキテクチャは Golden Cove だと考えているが、果たして。


GithubDiscussionSource repoChangelog

関連記事
Intel Sapphire Rapids は AVX512_FP16 をサポート Cannon Lake を追う Intel、GCC に Sapphire Rapids と Alder Lake をサポートするパッチを投稿