AMDの次期プロセッサーZenの内部構造を推察した前回の記事について、いろいろなご意見を読者の方からいただいた。さらに、Waldhauer氏とも引き続き議論を続けており、これに関してまとめてアップデートをお届けしたい。論点は3ヵ所となる。

デコーダー構成 FPU構成 動作周波数

Vector PathはK7～K10世代と同じ

まず最初はデコーダー構成の話だ。筆者は前回Vector Pathの扱い方について「これまでこうした処理の仕方は見たことがなかった。逆に言えば、こんな処理の仕方を導入すること自体が、K12とZenでかなりの部分を共通化していることの傍証になるのではないかと思う」と書いたが、K7～K10までの世代も同じであるというご指摘をいただいた。

ということで、GitHubのAthlonに関する記述を確認してみる。このファイルはK7/K8/K10を全部ひっくるめて扱っている関係で、非常に読みにくい構成になっている。

こちらを参照されると整形されている分、若干読みやすいのだが、例えばAthlonの場合、整数のVector Pathについては以下の記述があり、間違いなくすべてのデコーダーが同期して動作する。

(exclusion_set "athlon-decodev" "athlon-decode0,athlon-decode1,athlon-decode2")

一方の実行ユニットの方だが、命令スケジューラーに以下の記述があった。

(define_insn_reservation "athlon_ivector_both" 6

(and (eq_attr "cpu" "athlon,k8,generic")

(and (eq_attr "athlon_decode" "vector")

(and (eq_attr "unit" "integer,unknown")

(eq_attr "memory" "both"))))

"athlon-vector,athlon-load,

athlon-ieu,

athlon-ieu,

athlon-store")

(define_insn_reservation "athlon_ivector_both_amdfam10" 6

(and (eq_attr "cpu" "amdfam10")

(and (eq_attr "amdfam10_decode" "vector")

(and (eq_attr "unit" "integer,unknown")

(eq_attr "memory" "both"))))

"athlon-vector,athlon-load,

athlon-ieu,

athlon-ieu,

athlon-store")

K8用とK10用の命令が入り乱れているのでわかりにくいが、ある種の命令は整数演算ユニットのかなりの部分(微妙に数が合わないので実際には全部ではない模様)をまとめてロックした形で実行されるようだ。

一方FPUはもっとシンプルで、3つある実行ユニットが全部ロックされる。

;; Vector operations usually consume many of pipes.

(define_reservation "athlon-fvector" "(athlon-fadd + athlon-fmul + athlon-fstore)")

ということで、前回書いた「こうした処理の仕方は見たことが無かった」のは単に筆者の不見識であった。お詫びして訂正する。

ただ、x86/x64とAArch32/AArch64の違いを吸収して実行ユニットに引き渡すためには、一度中間命令に変換してからになり、その際にバッファを持つだろうという筆者の見解そのものに変化はない。

→次のページヘ続く （FP3がボトルネックになる）