Zen2のポイントの一つとしては、AVX/AVX2/FMA3などの256bit SIMD命令のスループット改善を挙げることができ、その効果はAVX2が効果的なx264/x265で
実行ファイルは
こちら。 (ソースコードは
こちら)
ざっとまとめるとこんな感じ。
| Zen2 | Zen | Haswell | Skylake |
整数 加減算 | 256bit x3 | 128bit x3 | 256bit x2 | 256bit x3 |
飽和処理付き | 256bit x2 | 128bit x2 | 256bit x2 | 256bit x2 |
整数 積算 | 256bit x1 | 128bit x1 | 256bit x1 | 256bit x2 |
整数 論理演算 | 256bit x4 | 128bit x4 | 256bit x3 | 256bit x3 |
整数 シフト | 256bit x1 | 128bit x1 | 256bit x1 | 256bit x2 |
整数 比較 | 256bit x3 | 128bit x3 | 256bit x2 | 256bit x2 |
整数 最大最小 | 256bit x3 | 128bit x3 | 256bit x2 | 256bit x2 |
整数 平均 | 256bit x2 | 128bit x2 | 256bit x2 | 256bit x2 |
整数 シャッフル | 256bit x2 | 128bit x2 | 256bit x1 | 256bit x1 |
pblendvb | 256bit x1 | 128bit x1 | 256bit x0.5 | 256bit x0.5 128bit x3 (謎) |
pblendd | 256bit x3 | 128bit x3 | 256bit x3 | 256bit x3 |
pblendw | 256bit x3 | 128bit x3 | 256bit x1 | 256bit x1 |
Zen2はほぼZenの構成のまま256bit化を果たしたように見える。これにより、シフトと積算を除き、理論上はSkylakeと同等ないし上回るスループットを得られることになる。
なお、Skylakeはシフトと積算も2基ついている(port0/port1)が、これはSkylake-Xでport0とport1を束ねてAVX512として使用するための準備だと思われる。
生データはこんな感じ。x264/x265では浮動小数はほぼ使わないのであまり関係ないが、AMDからメッセージのあった通り、浮動小数の積算のレイテンシが3となっているのも確認できる。
Zenはpshufbとかのshuffleが2基ついてるの素敵。なんでIntelはHaswellで1基に減らしちゃったんですかね、SandyBridgeまでは2基あったはずなのに。
microbench 0.02 by rigaya
AMD Ryzen 7 3700X 8-Core Processor
core frequency: 4391 MHz
Throughput, Latency
instruction IPC, Cycle
movdqa : T: 4.00, L: 0.25
movdqa(256) : T: 4.00, L: 0.25
por : T: 4.00, L: 1.00
por(256) : T: 4.00, L: 1.00
pand : T: 4.00, L: 1.00
pand(256) : T: 4.00, L: 1.00
pandn : T: 4.00, L: 1.00
pandn(256) : T: 4.00, L: 1.00
pxor : T: 4.00, L: 1.00
pxor(256) : T: 4.00, L: 1.00
psllw : T: 1.00, L: 1.00
psllw(256) : T: 1.00, L: 1.00
pslldq : T: 2.00, L: 1.00
pslldq(256) : T: 2.00, L: 1.00
paddw : T: 3.00, L: 1.00
paddw(256) : T: 3.00, L: 1.00
paddsw : T: 2.00, L: 1.00
paddsw(256) : T: 2.00, L: 1.00
paddd : T: 3.00, L: 1.00
paddd(256) : T: 3.00, L: 1.00
paddq : T: 3.00, L: 1.00
paddq(256) : T: 3.00, L: 1.00
pabsw : T: 2.00, L: 1.00
pabsw(256) : T: 2.00, L: 1.00
pmullw : T: 1.00, L: 3.00
pmullw(256) : T: 1.00, L: 3.00
pmuludq : T: 1.00, L: 3.00
pmuludq(256) : T: 1.00, L: 3.00
pmulld : T: 0.50, L: 4.00
pmulld(256) : T: 0.50, L: 4.00
pmaddwd : T: 1.00, L: 3.00
pmaddwd(256) : T: 1.00, L: 3.00
pmaddubsw : T: 1.00, L: 4.00
pmaddubsw(256) : T: 1.00, L: 4.00
pmaxsw : T: 3.00, L: 1.00
pmaxsw(256) : T: 3.00, L: 1.00
pminsw : T: 3.00, L: 1.00
pminsw(256) : T: 3.00, L: 1.00
pavgw : T: 2.00, L: 1.00
pavgw(256) : T: 2.00, L: 1.00
psadbw : T: 1.00, L: 3.00
psadbw(256) : T: 1.00, L: 3.00
packssdw : T: 2.00, L: 1.00
packssdw(256) : T: 2.00, L: 1.00
pmovsxwd : T: 2.00, L: 1.00
pmovsxwd(256) : T: 0.90, L: 4.00
packsswb : T: 2.00, L: 1.00
packsswb(256) : T: 2.00, L: 1.00
pmovsxbw : T: 2.00, L: 1.00
pmovsxbw(256) : T: 0.90, L: 4.00
pmovsxbd : T: 2.00, L: 1.00
pmovsxbd(256) : T: 0.90, L: 4.00
punpckhwd : T: 2.00, L: 1.00
punpckhwd(256) : T: 2.00, L: 1.00
palignr : T: 2.00, L: 1.00
palignr(256) : T: 2.00, L: 1.00
pshufb : T: 2.00, L: 1.00
pshufb(256) : T: 2.00, L: 1.00
pblendw : T: 3.00, L: 1.00
pblendw(256) : T: 3.00, L: 1.00
pblendvb : T: 1.00, L: 1.00
pblendvb(vex) : T: 1.00, L: 1.00
pblendvb(256) : T: 1.00, L: 1.00
pblendd(vex) : T: 3.00, L: 1.00
pblendd(256) : T: 3.00, L: 1.00
extractf128(256) : T: 1.00, L: 3.00
insertf128(256) : T: 1.00, L: 1.00
perm2f128(256) : T: 1.00, L: 3.00
permd(256) : T: 0.50, L: 8.01
permq(256) : T: 0.78, L: 6.00
pbroadcastw(vex) : T: 2.00, L: 1.00
pbroadcastw(256) : T: 1.00, L: 4.00
pcmpeqw : T: 3.00, L: 1.00
pcmpeqw(256) : T: 3.00, L: 1.00
pcmpgtw : T: 3.00, L: 1.00
pcmpgtw(256) : T: 3.00, L: 1.00
addps : T: 2.00, L: 3.00, 35.1 GFLOPS
addps(256) : T: 2.00, L: 3.00, 70.3 GFLOPS
addpd : T: 2.00, L: 3.00, 17.6 GFLOPS
addpd(256) : T: 2.00, L: 3.00, 35.1 GFLOPS
mulps : T: 2.00, L: 3.00, 35.1 GFLOPS
mulps(256) : T: 2.00, L: 3.00, 70.3 GFLOPS
mulpd : T: 2.00, L: 3.00, 17.6 GFLOPS
mulpd(256) : T: 2.00, L: 3.00, 35.1 GFLOPS
addps_mulps : T: 4.00, L: 6.03, 70.3 GFLOPS
addps_mulps(256) : T: 4.00, L: 6.01, 140.5 GFLOPS
addpd_mulpd : T: 4.00, L: 6.01, 35.1 GFLOPS
addpd_mulpd(256) : T: 4.00, L: 6.00, 70.3 GFLOPS
fmadd132ps(vex) : T: 2.00, L: 5.00, 70.3 GFLOPS
fmadd132ps(256) : T: 2.00, L: 5.00, 140.5 GFLOPS
fmadd132pd(vex) : T: 2.00, L: 5.00, 35.1 GFLOPS
fmadd132pd(256) : T: 2.00, L: 5.00, 70.3 GFLOPS
fmadd132ps_addps(128): T: 2.18, L: 8.01, 57.4 GFLOPS
fmadd132ps_addps(256): T: 2.18, L: 8.02, 114.8 GFLOPS
fmadd132pd_addpd(128): T: 2.18, L: 8.00, 28.7 GFLOPS
fmadd132pd_addpd(256): T: 2.18, L: 8.00, 57.4 GFLOPS
fmadd132ps_mulps(128): T: 2.00, L: 8.00, 52.7 GFLOPS
fmadd132ps_mulps(256): T: 2.00, L: 8.00, 105.4 GFLOPS
fmadd132pd_mulpd(128): T: 2.00, L: 8.00, 26.3 GFLOPS
fmadd132pd_mulpd(256): T: 2.00, L: 8.00, 52.7 GFLOPS
divps : T: 0.29, L: 10.01
divps(256) : T: 0.29, L: 10.01
divpd : T: 0.20, L: 13.05
divpd(256) : T: 0.20, L: 13.04
sqrtps : T: 0.18, L: 5.50
sqrtps(256) : T: 0.18, L: 5.50
sqrtpd : T: 0.12, L: 8.50
sqrtpd(256) : T: 0.12, L: 8.52
rcpps : T: 1.00, L: 5.00
rcpps(256) : T: 1.00, L: 5.01
rsqrtps : T: 1.00, L: 5.00
rsqrtps(256) : T: 1.00, L: 5.00
maxps : T: 2.00, L: 1.00
maxps(256) : T: 2.00, L: 1.00
maxpd : T: 2.00, L: 1.00
maxpd(256) : T: 2.00, L: 1.00
minps : T: 2.00, L: 1.00
minps(256) : T: 2.00, L: 1.00
minpd : T: 2.00, L: 1.00
minpd(256) : T: 2.00, L: 1.00
cvttps2dq : T: 1.00, L: 3.00
cvttps2dq(256) : T: 1.00, L: 3.00
cvttpd2dq : T: 1.00, L: 3.00
cvttpd2dq(256) : T: 1.00, L: 6.00
cvtdq2ps : T: 1.00, L: 3.00
cvtdq2ps(256) : T: 1.00, L: 3.00
cvtdq2pd : T: 1.00, L: 3.00
cvtdq2pd(256) : T: 1.00, L: 4.00
cvtps2pd : T: 1.00, L: 3.00
cvtps2pd(256) : T: 1.00, L: 4.00
cvtpd2ps : T: 1.00, L: 3.00
cvtpd2ps(256) : T: 1.00, L: 6.02