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か?)
この連載の記事
-
第798回
PC
日本が開発したAIプロセッサーMN-Core 2 Hot Chips 2024で注目を浴びたオモシロCPU -
第797回
PC
わずか2年で完成させた韓国FuriosaAIのAIアクセラレーターRNGD Hot Chips 2024で注目を浴びたオモシロCPU -
第796回
PC
Metaが自社開発したAI推論用アクセラレーターMTIA v2 Hot Chips 2024で注目を浴びたオモシロCPU -
第795回
デジタル
AI性能を引き上げるInstinct MI325XとPensando Salina 400/Pollara 400がサーバーにインパクトをもたらす AMD CPUロードマップ -
第794回
デジタル
第5世代EPYCはMRDIMMをサポートしている? AMD CPUロードマップ -
第793回
PC
5nmの限界に早くもたどり着いてしまったWSE-3 Hot Chips 2024で注目を浴びたオモシロCPU -
第792回
PC
大型言語モデルに全振りしたSambaNovaのAIプロセッサーSC40L Hot Chips 2024で注目を浴びたオモシロCPU -
第791回
PC
妙に性能のバランスが悪いマイクロソフトのAI特化型チップMaia 100 Hot Chips 2024で注目を浴びたオモシロCPU -
第790回
PC
AI推論用アクセラレーターを搭載するIBMのTelum II Hot Chips 2024で注目を浴びたオモシロCPU -
第789回
PC
切り捨てられた部門が再始動して作り上げたAmpereOne Hot Chips 2024で注目を浴びたオモシロCPU -
第788回
PC
Meteor Lakeを凌駕する性能のQualcomm「Oryon」 Hot Chips 2024で注目を浴びたオモシロCPU - この連載の一覧へ