今まで ARM CPU の浮動小数点演算速度について調べてきましたが、
その計測プログラムをアプリにしてみました。
今までの測定結果のまとめは下記の通り。
・ARM CPU core 毎の浮動小数点演算速度の比較 (VFP/NEON)
VFP Benchmark アプリの表示結果は上記の表と互換性があります。
さらに FLOPS 表示、倍精度浮動小数点演算の計測、マルチスレッド実行に
対応しました。
下記は幾つかの端末の結果(一部)です。
MSN8974 Krait 400 2.2GHz x4 quad --------------------------------------- SingleT SP max : 16.619 GFLOPS MultiT SP max : 67.185 GFLOPS (理論値: 70.4 GFLOPS) = 2(mad) x 4(simd) x 4(core) x 2.2(clock) Tegra4 Cortex-A15 1.8GHz x4 quad --------------------------------------- SingleT SP max: 13.371 GFLOPS MultiT SP max: 51.345 GFLOPS (理論値: 57.6 GFLOPS) = 2(mad) x 2(simd) x 2(unit) x 4(core) x 1.8(clock) APQ8064 Krait 1.5GHz x4 quad --------------------------------------- SingleT SP max: 11.947 GFLOPS MultiT SP max: 47.808 GFLOPS (理論値: 48.0 GFLOPS) = 2(mad) x 4(simd) x 4(core) x 1.5(clock) Exynos5D Cortex-A15 1.7GHz x2 dual --------------------------------------- SingleT SP max: 13.483 GFLOPS MultiT SP max: 26.724 GFLOPS (理論値: 27.2 GFLOPS) = 2(mad) x 2(simd) x 2(unit) x 2(core) x 1.7(clock) Tegra3 Cortex-A9 1.2GHz x4 quad (TB1.3GHz) --------------------------------------- SingleT SP max: 4.783 GFLOPS (理論値: 5.2 GFLOPS MultiT SP max: 18.905 GFLOPS (理論値: 19.2 GFLOPS) = 2(mad) x 2(simd) x 4(core) x 1.2(clock) K3V2 Cortex-A9 1.2GHz x4 quad --------------------------------------- SingleT SP max: 4.694 GFLOPS MultiT SP max: 18.662 GFLOPS (理論値: 19.2 GFLOPS) = 2(mad) x 2(simd) x 4(core) x 1.2(clock) MSN8260 Scorpion 1.2GHz x2 dual --------------------------------------- SingleT SP max: 8.898 GFLOPS MultiT SP max: 16.560 GFLOPS (理論値: 19.2 GFLOPS) = 2(mad) x 4(simd) x 2(core) x 1.2(clock) QSD8250 Scorpion 1.0GHz x1 --------------------------------------- SingleT SP max: 7.098 GFLOPS (理論値: 8.0 GFLOPS) = 2(mad) x 4(simd) x 1.0(clock) Tegra 2 Cortex-A9 1.0GHz x2 dual --------------------------------------- SingleT SP max: 1.973 GFLOPS MultiT SP max: 3.913 GFLOPS (理論値: 4.0 GFLOPS) = 2(mad) x 2(core) x 1.0(clock)
比較的理論値に近い数値が出ています。
各 CPU の理論値は下記にまとめました。
この出力結果はあくまでピーク値による比較なので、
実際のアプリケーションの実行速度とは異なります。
例えばスカラ VFP 演算で n8 と n1 の結果を比べると、
Cortex-A9 では命令の並び順によって 5倍も速度が落ちるケースがあります。
同じ条件でも Krait / Cortex-A15 はほとんど速度が落ちていないので、
パイプラインの実行効率が向上していることがわかります。
よって実際のアプリケーションでは、Cortex-A9 と Krait/Cortex-A15 では
ピーク値よりもさらに差が開くことが予想されます。
multi-thread は同じテストを CPU core の数だけ走らせています。
Tegra 3 のように single thread 時に動作クロックが上がるものがあるので、
single-thread の値を core 数倍しても正しい値にならないためです。
アプリの出力結果を見ると、Cortex-A15 は VFP のスカラ演算よりも
NEON の 64bit (float x2) の方が 2倍速く実行できることがわかります。
// Exynos 5 Dual Cortex-A15 1.7GHz dual (Nexus 10) * VFP/NEON (single fp) sec MFLOPS 最大 ---------------------------------------------------- VFP fmuls (32bit x1) n8 : 2.675 1495.4 1555.9 VFP fadds (32bit x1) n8 : 2.392 1672.1 1672.1 VFP fmacs (32bit x1) n8 : 3.171 2523.2 2523.2 VFP vfma.f32 (32bit x1) n8 : 2.985 2679.9 2679.9 NEON vmul.f32 (32bit x2) n8 : 1.187 6740.5 6740.5 ** NEON vadd.f32 (32bit x2) n8 : 1.187 6740.7 6740.7 ** NEON vmla.f32 (32bit x2) n8 : 1.187 13480.8 13480.8 ** NEON vfma.f32 (32bit x2) n8 : 1.187 13480.3 13480.3 ** NEON vmul.f32 (32bit x4) n8 : 2.373 6741.8 6741.8 NEON vadd.f32 (32bit x4) n8 : 2.374 6740.7 6740.7 NEON vmla.f32 (32bit x4) n8 : 2.373 13482.7 13482.7 NEON vfma.f32 (32bit x4) n8 : 2.373 13482.3 13482.3
以前予想したようにおそらく NEON の演算 unit は 64bit の 2 pipe ですが、
VFP は 1命令しか実行できない可能性があります。
Cortex-A8 で行ったように、VFP 命令を NEON 演算に置換する
Cortex-A15 最適化ができるかもしれません。
関連エントリ
・iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
・iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
・Nexus 10 CPU Cortex-A15 の速度
・Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
・Qualcomm APQ8064 GPU Adreno 320 の速度
・Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力
・iPad 4/iPad mini A6X/A5 の CPU/GPU 速度
・iPhone 5 / A6 の CPU 速度 その 3
・ARM Cortex-A8 の NEON と浮動小数演算最適化
・benchmark 関連