このページの本文へ

ロードマップでわかる!当世プロセッサー事情第333回

AMD次期プロセッサーZenはFP3がボトルネックになる?

2015年12月07日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/) 編集●北村/ASCII.jp

  • この記事をはてなブックマークに追加
  • 本文印刷

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か?

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン