HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力

Snapdragon 820 は Qualcomm 独自の 64bit CPU core Kyro を搭載しています。vfpbench で浮動小数点演算速度を計測してみました。

Qualcomm はもともと自社製 CPU core の Scorpion や Krait シリーズを採用していました。早い時期から 1GHz を超える高クロック化、また multi-core 化を実現しており主にハイエンド SoC での差別化を図っています。

ところが 64bit 時代に入ると一転し、フラグシップの Snapdragon 810 も ARM の一般的な Cortex-A57/A53 の big.LITTLE 構成となっていました。Kyro は久々に登場した Qualcomm の独自 CPU でかつ初の 64bit core になります。

2 + 2 の非対称 Multi core なので vfpbench では正しく計測することができませんでした。そのため Single-Thread 時の結果を中心に見ています。

Snapdragon 820 Kyro (2.2GHz x2 + 1.6GHz x2)

ARCH: ARMv8A
CPU core: 4
VFP: AArch64 NEON
FMA: Yes
NEON: Yes
Result
  SingleT SP max: 10.517 GFLOPS
  SingleT DP max:  5.216 GFLOPS

上の値は 1 core あたりの性能です。思ったよりも低い数値が出ています。より詳細なログは下記の通り。

* VFP/NEON (単精度 fp) single-thread
                                   sec       MFLOPS
---------------------------------------------------
FPU fmul (32bit x1) n8        :    0.469     2559.9
FPU fadd (32bit x1) n8        :    0.251     4777.4
FPU fmadd (32bit x1) n8       :    0.571     4205.1
NEON fmul.2s (32bit x2) n8    :    0.456     5257.7
NEON fadd.2s (32bit x2) n8    :    0.252     9510.8
NEON fmla.2s (32bit x2) n8    :    0.456    10516.8
NEON fmul.4s (32bit x4) n8    :    0.913     5258.8
NEON fadd.4s (32bit x4) n8    :    0.489     9825.7
NEON fmla.4s (32bit x4) n8    :    0.924    10387.4
FPU fmul (32bit x1) ns4       :    1.141     1051.6
FPU fadd (32bit x1) ns4       :    0.685     1752.7
FPU fmadd (32bit x1) ns4      :    0.913     2630.1
NEON fmul.2s (32bit x2) ns4   :    1.141     2103.5
NEON fadd.2s (32bit x2) ns4   :    0.685     3504.8
NEON fmla.2s (32bit x2) ns4   :    1.146     4187.6
NEON fmul.4s (32bit x4) ns4   :    1.144     4194.1
NEON fadd.4s (32bit x4) ns4   :    0.728     6595.9
NEON fmla.4s (32bit x4) ns4   :    1.142     8403.3
FPU fmul (32bit x1) n1        :    0.459     2614.5
FPU fadd (32bit x1) n1        :    0.274     4380.9
FPU fmadd (32bit x1) n1       :    4.568      525.5
NEON fmul.2s (32bit x2) n1    :    0.458     5245.7
NEON fadd.2s (32bit x2) n1    :    0.251     9562.2
NEON fmla.2s (32bit x2) n1    :    3.651     1314.6
NEON fmul.4s (32bit x4) n1    :    0.913     5257.8
NEON fadd.4s (32bit x4) n1    :    0.488     9828.5
NEON fmla.4s (32bit x4) n1    :    3.651     2629.5
NEON fmul.4s (32bit x4) n12   :    1.376     5234.2
NEON fadd.4s (32bit x4) n12   :    0.720    10001.3
NEON fmla.4s (32bit x4) n12   :    1.381    10429.9

乗算、加算ともに 64bit 単位で、1 cycle あたり 乗算1, 加算2 の構成になっているように見えます。よって 32bit 単精度の場合は 6 flop/cycle となり、Atom 系 (Silvermont, Airmont) に近い値になると思われます。同時に積和命令だけではピークにならないので、実際の理論値はおそらく 6 flop x 2.2GHz = 13.2 GFLOPS くらいでしょうか。2+2 の 4 core で 45.6 GFLOSP 前後。

上の vfpbench の結果は 4 flop/cycle 時のピーク値なので、4 x 2.2GHz = 8.8 GFLOPS。それよりも数値が伸びているので、2.2GHz よりも高い clock に boost されている可能性があります。もしくは、パイプラインが深いために vfpbench でピーク性能を捉えきれていないだけかもしれません。

どちらにせよ、浮動小数点演算だけに注目すると若干控えめな結果といえます。世代が上がる毎に浮動小数点演算をひたすら強化してきた Apple Aシリーズとは大きく特性が異なります。なにせ Apple A9 Twister に至っては 24 flop/clock で初期の AVX を超えています。

* VFP/NEON (倍精度 fp) single-thread
                                   sec       MFLOPS
---------------------------------------------------
FPU fmul (64bit x1) n8        :    0.465     2578.8
FPU fadd (64bit x1) n8        :    0.251     4781.4
FPU fmadd (64bit x1) n8       :    0.685     3506.0
NEON fmul.2d (64bit x2) n8    :    0.913     2627.7
NEON fadd.2d (64bit x2) n8    :    0.489     4912.0
NEON fmla.2d (64bit x2) n8    :    0.924     5194.1
FPU fmul (64bit x1) ns4       :    1.369      876.4
FPU fadd (64bit x1) ns4       :    0.685     1752.6
FPU fmadd (64bit x1) ns4      :    0.913     2629.6
NEON fmul.2d (64bit x2) ns4   :    1.369     1752.7
NEON fadd.2d (64bit x2) ns4   :    0.727     3303.5
NEON fmla.2d (64bit x2) ns4   :    1.369     3505.0
FPU fmul (64bit x1) n1        :    0.456     2629.0
FPU fadd (64bit x1) n1        :    0.274     4379.8
FPU fmadd (64bit x1) n1       :    5.477      438.2
NEON fmul.2d (64bit x2) n1    :    0.913     2629.1
NEON fadd.2d (64bit x2) n1    :    0.489     4911.5
NEON fmla.2d (64bit x2) n1    :    3.651     1314.6
NEON fmul.2d (64bit x2) n12   :    1.369     2629.6
NEON fadd.2d (64bit x2) n12   :    0.721     4992.3
NEON fmla.2d (64bit x2) n12   :    1.380     5215.8

倍精度の結果からも 64bit 単位のパイプラインになっているようです。余裕があれば、Multi-Thread 時を含めてもう少し詳しく調べてみたいと思っています。

関連エントリ
iPhone SE, Apple A9 の浮動小数点演算速度
Raspberry Pi 3 の速度比較, Cortex-A53 の速度
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
iPad Air 2 (Apple A8X) の浮動小数点演算能力