Coelacanth's Dream

CPUID とマイクロコードバージョンから AMD CPU の Family と Model を知りたい

以前 Intel CPU の CPUID から Family, Model, Stepping を読み取る方法に触れたが、AMD CPU はまだ自分自身理解していない部分があったため、整理も兼ねて書く。
Alder Lake-P を搭載する Chromebookボード 「Brya」、そして Alder Lake-M | Coelacanth’s Dream そして、過去の主張を訂正するための記事。

CPUID

CPUID とひと括りにしているが、CPUID にも色々ある。そもそも CPUID は CPU の各種情報を出力する命令である。
CPUID命令は EAXレジスタに特定の値をセットしてから実行することで、ある情報が取得、出力される。
そうして得られる情報の中で、Family, Model, Stepping の識別情報が、ベンチマーク結果から得られる CPU情報と照らし合わせたりと活用しやすいから注目されやすい、収集されやすいという話。

CPUID から Family, Model, Stepping を読み取る方法に関しては当然 AMD からドキュメントが出されているし1、Coreboot のコードにも分かりやすく記述されている。2
そのため CPUID から読み取ることは難しくない。
例えば Zen+ CPU / Pinacle Ridge の CPUID は 0x00800f82 だが、その文字列を Family, Model, Stepping に対応させると以下の表のようになる。

CPUID (Reserved) Ext.Family Ext.Model (Reserved) Base.Family Base.Model Stepping
Pinaccle Ridge 0x0 0x08 0x0 0x0 0xF 0x8 0x2

それをさらによく見る形式に変換すると、Family: 0x17 (23), Model: 0x8 (8), Stepping: 0x2 のようになる。

Microcode

CPUID については、あまり見掛ける機会は無いが、マイクロコードはそれなりにある。
というのもベンチマーキングプラットフォームである Phoronix Test Suite は、マイクロコードのバージョンを取得し、CPU情報の 1つとして記録するからだ。
今回調べるきっかけとなったのも、Cezanne APU の Model について、Coreboot には Model: 0x51 (81) であるように記述されているが、Geekbench の結果等では Model: 0x50 (80) となっていたことだ。この 1 違いにもっとまともな答えを見出したかった。3

以下はとりあえず OpenBenchmarking.org から集めた Zen系 CPU のマイクロコードバージョンだが、Family: 0x17(23) である Zen+/2 CPU は先頭が同じ 0x8 になっていることから、マイクロコードバージョンは Family, Model, Stepping に対応していると推測できる。

Microcode Patch Level
Zen+ Ryzen 0x800820d
Zen+ APU4 0x8108109
Zen2 EPYC5 0x830101c
Zen2 Ryzen6 0x8701021
Zen3 APU7 0xa500009

そして、それぞれを比較、CPUID の各値と照らし合わせた結果、以下のように対応していると考えられる。
Base と Ext を合わせることで、Family と Model が求められる。

Microcode Ext.Family Ext.Model (Reserved?) Base.Model Stepping Version?
Zen+ Ryzen 0x8 0x0 0x0 0x8 0x2 0x0d
Zen+ APU 0x8 0x1 0x0 0x8 0x1 0x09
Zen2 EPYC 0x8 0x3 0x0 0x1 0x1 0x1c
Zen2 Ryzen 0x8 0x7 0x0 0x1 0x0 0x21
Zen3 APU 0xA 0x5 0x0 0x0 0x0 0x09

ここでも CezanneModel: 0x50 (80) となった。
訂正といのはこのことで、CezanneModel: 0x51 (81) ではなく、Model: 0x50 (80) 可能性のが高く、Coreboot のは誤字かもしれない。あるいは Cezanne とは別の APU に向けたものである可能性もあるが、それは GPU部に Cezanne と同じ DeviceIDを用い 、Model は 1 違いというややこしいものとなる。 8

Stepping 0 であるから Model: 0x51 (81) となっていないのではないか、とも書いたが、Zen 2 EPYC (Rome)Zen 2 Ryzen (Matisse)Stepping 0 であるため根拠にはなり得ず、思い切り外した推測であった。
マイクロコードバージョンの読み方を知っていたら、少しはまともな見方が出来ただろう、という後悔。