FPU構成はタイプミスでなければ
FP3がボトルネックになる
次に2つ目のFPU構成である。これはFP2がどう動くかという問題である。さすがに長大なのでリストを掲載するのは避ける。GCCでは命令セットの定義に以下のフォーマットで記載を行なう。
(define_insn_reservation insn-name default_latency condition regexp)
例をあげよう。
(define_insn_reservation "znver1_fp_mov_direct_load" 5
(and (eq_attr "cpu" "znver1")
(and (eq_attr "znver1_decode" "direct")
(and (eq_attr "type" "fmov")
(eq_attr "memory" "load"))))
"znver1-direct,znver1-load,znver1-fp3|znver1-fp1")
この場合、znver1_fp_mov_direct_loadで定義される命令セットは処理に5サイクルを要し、実行ユニットとしてはznver1-loadに加えてznver1-fp1とznver1-fp3のどちらかを使うという意味だ。
さて、ここで命令セットと、どの実行ユニットを使うかを一覧でまとめたのが下表である。命令は名前の通り実行されるFPUの命令、Load/StoreはLoad/Storeユニットを利用する場合にこれを表記(なければ使わない)、FPUは実際に使われるFPUのユニットである。
| 命令セットと実行ユニットの関係 | ||
|---|---|---|
| 命令 | Load/Store | FPU |
| fp_mov_direct_load | load | fp3|fp1 |
| fp_mov_direct_store | store | fp2|fp3 |
| fp_mov_double | fp3 | |
| fp_mov_double_load | load | fp3 |
| fp_mov_direct | fp3 | |
| fp_spc_direct | tfp2+fp3 | |
| fp_fsgn | fp3 | |
| fp_fcmp | fp0+fp2 | |
| fp_fcmp_load | load | fp0+fp2 |
| fp_op_mul | fp0 | |
| fp_op_mul_load | load | fp0 |
| fp_op_imul_load | load | fp0 |
| fp_op_div | fp3 | |
| fp_op_div_load | load | fp3 |
| fp_op_idiv_load | load | fp3 |
| fp_insn | fpu | |
| mmx_add | fp0|fp1|fp3 | |
| mmx_add_load | load | fp0|fp1|fp3 |
| mmx_cmp | fp0|fp3 | |
| mmx_cmp_load | load | fp0|fp3 |
| mmx_cvt_pck_shuf | fp1|fp2 | |
| mmx_cvt_pck_shuf_load | load | fp1|fp2 |
| mmx_shift_move | fp2 | |
| mmx_shift_move_load | load | fp2 |
| mmx_move_store | store | fp2 |
| mmx_mul | fp0 | |
| mmx_load | load | fp0 |
| avx256_log | fpu | |
| avx256_log_load | load | fpu |
| sse_log | fpu | |
| sse_log_load | load | fpu |
| avx256_log1 | fp1|fp2 | |
| avx256_log1_load | load | fp1|fp2 |
| sse_log1 | fp1|fp2 | |
| sse_log1_load | load | fp1|fp2 |
| sse_comi | fp0|fp1 | |
| sse_comi_load | load | fp0|fp1 |
| sse_comi_double | fp0|fp1 | |
| sse_comi_double_load | load | fp0|fp1 |
| sse_test | fp1|fp2 | |
| sse_test_load | load | fp1|fp2 |
| sseavx_mov | fpu | |
| sseavx_mov_store | store | fpu |
| sseavx_mov_load | load | fpu |
| avx256_mov | fpu | |
| avx256_mov_store | store | fpu |
| avx256_mov_load | load | fpu |
| sseavx_add | fp2|fp3 | |
| sseavx_add_load | load | fp2|fp3 |
| avx256_add | fp2|fp3 | |
| avx256_add_load | load | fp2|fp3 |
| sseavx_fma | (fp0+fp3)|(fp1+fp3) | |
| sseavx_fma_load | load | (fp0+fp3)|(fp1+fp3) |
| avx256_fma | (fp0+fp3)|(fp1+fp3) | |
| avx256_fma_load | load | (fp0+fp3)|(fp1+fp3) |
| sseavx_iadd | fp0|fp1|fp3 | |
| sseavx_iadd_load | load | fp0|fp1|fp3 |
| avx256_iadd | fp0|fp1|fp3 | |
| avx256_iadd_load | load | fp0|fp1|fp3 |
| ssecvt | fp3 | |
| ssecvt_load | load | fp3 |
| ssediv_ss_ps | fp3 | |
| ssediv_ss_ps_load | load | fp3 |
| ssediv_sd_pd | fp3 | |
| ssediv_sd_pd_load | load | fp3 |
| ssediv_avx256_ps | fp3 | |
| ssediv_avx256_ps_load | load | fp3 |
| ssediv_avx256_pd | fp3 | |
| ssediv_avx256_pd_load | load | fp3 |
| ssemul_ss_ps | fp0|fp1 | |
| ssemul_ss_ps_load | load | fp0|fp1 |
| ssemul_avx256_ps | fp0|fp1 | |
| ssemul_avx256_ps_load | load | fp0|fp1 |
| ssemul_sd_pd | fp0|fp1 | |
| ssemul_sd_pd_load | load | fp0|fp1 |
| ssemul_avx256_pd | fp0|fp1 | |
| ssemul_avx256_pd_load | load | fp0|fp1 |
| sseimul | fp0 | |
| sseimul_avx256 | fp0 | |
| sseimul_load | load | fp0 |
| sseimul_avx256_load | load | fp0 |
| sseimul_di | fp0 | |
| sseimul_load_di | load | fp0 |
| sse_cmp | fp0|fp1 | |
| sse_cmp_load | load | fp0|fp1 |
| sse_cmp_avx256 | fp0|fp1 | |
| sse_cmp_avx256_load | load | fp0|fp1 |
| sse_icmp | fp0|fp3 | |
| sse_icmp_load | load | fp0|fp3 |
| sse_icmp_avx256 | fp0|fp3 | |
| sse_icmp_avx256_load | load | fp0|fp3 |
FPUの意味は以下のとおり。表で太字のところはFP2を利用するという命令ユニットである。
| FPU | FP1/FP2/FP3/FP4のどれか1つ |
|---|---|
| FP0+FP1 | FP1とFP2を同時に利用 |
| FP0|FP1 | FP0とFP2のどちらか片方を利用 |
さて、問題はなにかというと、例えばsseavx_fmaやavx256_iaddなどの命令が、(fp0+fp3)|(fp1+fp3)と表記されているが、これが正しいか否かである。
もしこれが正しいとすれば、FMAを実行する場合にFP2が利用できないので、事実上FP3がボトルネックになることになる。したがって、FMA命令2つの同時発行はできないという制約が付くことになる。ちなみにWaldhauer氏はこれはタイプミスだとしている。さてこれはどっちだろう?
ということで、以下筆者の見解だが、そもそもこのFP0~FP3の4つのFPUが、必ずしも同じ機能を持っているわけではないのは当然として、完全に2セットというわけではないようだ。
例えば、fsgnやfp_moveなどがFP3でしかできない、FPUのShift演算はどうもFP2にしか実装されていないなど、いくらかの偏りはあるようだ。
あるいは、完全に2つのセットだとすれば、普通に考えればFP0とFP2、FP1とFP3でそれぞれセットになるため、FP0とFP1はおおむね同等の機能になるはずだ。
ところが、sseavx_logやavx256_logはFP1/FP2のどちらか、sseavx_addやavx256_addはFP2/FP3のどちらかという構成になっている。もっと端的なのがmmx_addで、FP0/FP1/FP3のみでFP2が対象になっていない。
そもそも命令ユニットを見ると、乗算を行なうユニットはFP0/FP1にのみ搭載されているようだ。では加算は? というと、mmx_addなどではFP2以外にはすべて実装されているように見えるが、よく見るとavx256_addではFP2でも動作することになっている。つまりFP2にも加算が実装されていないと辻褄が合わない。
ということで、全体としてみるとあちこち理屈に合わないことが多すぎる。そのことは間違いないのでタイプミスにしたいところであるが、これが全部タイプミスだとするとFPU周りはほぼ全部とは言わないまでも、かなりの部分が書き直しになる。
もちろん、そこまで盛大に間違えていた可能性は否定できないが、筆者としてはタイプミスではなく本当にFP3がボトルネックになっている可能性が高いと考えている。
もしもznver1_mmx_addが
"znver1-direct,znver1-fp0|znver1-fp1|znver1-fp3"
ではなく
"znver1-direct,znver1-fpu"
と記述されていれば、タイプミス(つまりMAC演算は同時に2命令発行できる)と判断していたのだが。ただそうなると、avx256_addが示唆するFP2に搭載されている加算はなに? という問題が残ることは指摘しておきたい。つまり派手にタイプミスしている可能性もまだ残っているということだ。
→次のページヘ続く (動作周波数は3GHzか4GHzか?)

この連載の記事
-
第852回
PC
Google最新TPU「Ironwood」は前世代比4.7倍の性能向上かつ160Wの低消費電力で圧倒的省エネを実現 -
第851回
PC
Instinct MI400/MI500登場でAI/HPC向けGPUはどう変わる? CoWoS-L採用の詳細も判明 AMD GPUロードマップ -
第850回
デジタル
Zen 6+Zen 6c、そしてZen 7へ! EPYCは256コアへ向かう AMD CPUロードマップ -
第849回
PC
d-MatrixのAIプロセッサーCorsairはNVIDIA GB200に匹敵する性能を600Wの消費電力で実現 -
第848回
PC
消えたTofinoの残響 Intel IPU E2200がつなぐイーサネットの未来 -
第847回
PC
国産プロセッサーのPEZY-SC4sが消費電力わずか212Wで高効率99.2%を記録! 次世代省電力チップの決定版に王手 -
第846回
PC
Eコア288基の次世代Xeon「Clearwater Forest」に見る効率設計の極意 インテル CPUロードマップ -
第845回
PC
最大256MB共有キャッシュ対応で大規模処理も快適! Cuzcoが実現する高性能・拡張自在なRISC-Vプロセッサーの秘密 -
第844回
PC
耐量子暗号対応でセキュリティ強化! IBMのPower11が叶えた高信頼性と高速AI推論 -
第843回
PC
NVIDIAとインテルの協業発表によりGB10のCPUをx86に置き換えた新世代AIチップが登場する? -
第842回
PC
双方向8Tbps伝送の次世代光インターコネクト! AyarLabsのTeraPHYがもたらす革新的光通信の詳細 - この連載の一覧へ











