x86 の SSE/AVX 命令に対応しました。
ARM CPU と同じように SSE/AVX の命令速度を計測することができます。
・VFP Benchmark v1.1
・VFP Benchmark Android (Google play)
・VFP Benchmark iOS (AppStore)
上記は Android ですが iOS 版では ARMv8A (arm64) に対応しています。(2014/02/05 iOS 版追加)
下記は手持ちのデバイスでの結果。
Device CPU sp GFLOPS dp GFLOPS --------------------------------------------------------------------- MacBookRetina13 Core i5-3210M Ivy 2.5GHz x2 90.2 45.2 Kindle HDX 7 MSN8974 Krait 400 2.2GHz x4 67.5 16.9 Tegra Note 7 Tegra4 Cortex-A15 1.8GHz x4 51.3 9.8 Nexus 7 (2013) AQP8064 Krait 1.5GHz x4 47.8 11.8 iPhone 5s A7 arm64 Cyclone 1.3GHz x2 40.9 20.5 iPhone 5s A7 arm7s Cyclone 1.3GHz x2 40.9 8.0 Mac mini 2009 Core2 Duo P7350 2.0GHz x2 31.7 12.7 Nexus 10 Exynos5D Cortex-A15 1.7GHz x2 26.7 5.3 iPad 4 A6X Swift 1.4GHz x2 21.5 3.6 iPhone 5 A6 Swift 1.3GHz x2 20.1 3.4 Nexus 7 (2012) Tegra3 Cortex-A9 1.3GHz x4 18.9 4.7 EVO 3D ISW12HT MSM8660 Scorpion 1.2GHz x2 16.6 1.3 VAIO Type P Atom Z540 Bonnell 1.8GHz x1 10.9 1.9 Desire X06HT QSD8250 Scorpion 1.0GHz x1 7.1 0.9 iPad 2 A5 Cortex-A9 1.0GHz x2 7.8 2.0 iPod touch 4 A4 Cortex-A8 0.8GHz x1 3.1 0.1 Raspberry Pi BCM2835 ARM1176JZFS 0.7GHz x1 0.7 0.7 * 数値が大きい方が速い。 * sp= 単精度, dp= 倍精度
ピーク値の測定なので実アプリケーションの速度とは異なります。
詳しくはこちらを参照してください。
下記のページのほぼ理論値通りの傾向が出ています。
倍精度のテストはまだ改良の余地があります。
スカラーで mul+add のペアリングを測定していないので、
一部の CPU でもう少しスコアが伸びると考えられます。
Core i5 Ivy Bridge は想定より高い数値が出ていますが、TurboBoost の効果で
より高いクロックで走っているようです。single-thread 時は 3.0GHz、
mult-thread 時は 2.85GHz 相当の結果となっています。
実際の測定結果は命令単位の数値を出すので、より細かく CPU の動作を
調べることができます。
SSE2/AVX1 には積和命令がありませんが、Intel CPU は加算と乗算命令が
並列に実行できるようです。
↓ 実際に addps/mulps の Interleave は半分の時間で実行しています。
Ivy Bridge Core i5-3210M * SSE/AVX (single fp) sec MFLOPS MFLOPS AVX vmulps (32bit x8) n8 : 1.322 24205.7 24205.7 AVX vaddps (32bit x8) n8 : 1.319 24256.0 24256.0 AVX vmul+addps (32bit x8) n8 : 0.658 48604.4 48604.4
↓ Atom (Bonnell) は場合少々特殊です。
SSE 命令の乗算は加算よりも 2倍時間がかかっています。
動作クロックを考えると SSE の add が 128bit で mul が 64bit 幅で
演算していると考えられます。
Atom Z540 (Bonnell) * SSE/AVX (single fp) sec MFLOPS MFLOPS SSE mulps (32bit x4) n8 : 4.307 3715.2 3715.2 SSE addps (32bit x4) n8 : 2.207 7248.1 7248.1 SSE mul+addps (32bit x4) n8 : 2.155 7424.2 7424.2
ARM NEON の場合は、同じ SIMD でも 64bit 命令があります。
例えば「 vadd.f32 d0,d1,d2 」は単精度 32bit x2 の 64bit 加算を行うので、
Cortex-A8/A9 のように 64bit 幅でも 1cycle で実行します。
128bit 命令「 vadd.f32 q0,q1,q1 」の場合は 2cycle かかります。
SSE は常に 4要素 = 128bit 単位なので Pentium 3 等 64bit 幅の
SIMD Unit では最小でも 2cycle かかることになります。
同様に Atom の乗算も最小値は 2cycle です。
ただし mulps + addps の Interleave でも、addps のみの場合と同じ時間で
完了するため、加算と乗算は非対称ながら Overlap できるようです。
Atom には HT があるので、Multi-thread 時は無駄な隙間を埋められます。
メインスレッドで mulps + addps のペアを実行し、サブスレッドで addps のみ
走らせるとおそらく 128bit + 64bit の非対称なパイプラインが埋まります。
mulps + addps + addps 組み合わせを 2スレッド走らせたのが下記の結果で、
スコアが伸びていることがわかります。
Atom Z540 (Bonnell) * SSE/AVX (single fp) multi-thread sec MFLOPS MFLOPS SSE ml+ad+addps (32bit x4) n6 : 3.075 10926.6 10926.6
これらの測定結果から、CPU の個別の演算能力をまとめたのが下記の表です。
倍精度の値はもう少し変動する可能性があります。
・スカラー
単精度 倍精度 CPU mul add mad fma mul add mad fma ----------------------------------------- ------------------------- ARM1176JZF-S 0.5 0.5 1 -- 0.5 0.5 1 -- Cortex-A8 0.14 0.14 0.18 -- 0.1 0.1 0.1 -- Cortex-A9 1 1 2 -- 0.5 1 1 -- Cortex-A15 1 1 1.4 2 1 1 1.4 1.4 Scorpion 1 1 2 -- 0.5 1 1 -- Krait 400 1 1 2 2 1 1 1.6 2 A6 Swift 1 1 1 1 1 1 1 1 A7 Cyclone arm7s 1 1 2 2 2 3 3 3 A7 Cyclone arm64 2 3 -- 4 2 3 -- 1.6 Atom Bonnell 1 1 -- -- 0.5 1 -- -- Core2 Penryn 1 1 -- -- 1 1 -- -- Core i5 Ivy Bridge 1 1 -- -- 1 1 -- -- * 数値は 1 cycle に実行可能な演算数 * 値が大きい方が高速
ARM11 の mul は 0.5演算/cycle となっています。
つまり単精度の加算や乗算は 2cycle かかります。
mad/fma は命令あたり 2 演算なので、この欄が 2 の場合に 1 cycle で
実行できることを意味しています。
Cortex-A8 のピーク FLOPS は NEON のおかげで ARM11 より高いですが、
上記のように VFP のスカラー演算では ARM11 に負けています。
A7 Cyclone (ARMv8A) は AArch32 (32bit mode) と AArch64 (64bit mode) で
かなり違いがあります。
単精度演算は 64bit mode の方が数倍速く実行できるようです。
おそらく VFP が要求する仕様が NEON と異なっているためだと考えられます。
AArch64 は NEON と統一されたので、NEON と同等の速度で動作できるようです。
VFP が足を引っ張る似たような傾向は、Cortex-A15 など他の ARMv7A CPU にも
見られます。
・SIMD 単精度
SIMD2 (32bit x 2) SIMD4 (32bit x4) CPU mul add mad fma mul add mad fma ---------------------------------------- ---------------------- ARM1176JZF-S -- -- -- -- -- -- -- -- Cortex-A8 2 2 4 -- 2 2 4 -- Cortex-A9 2 2 4 -- 2 2 4 -- Cortex-A15 4 4 8 8 4 4 8 8 Scorpion 2 2 4 -- 4 4 8 -- Krait 400 2 2 4 4 4 4 8 8 A6 Swift 2 2 4 4 4 4 8 8 A7 Cyclone arm7s 4 6 8 8 8 12 16 16 A7 Cyclone arm64 4 6 -- 8 8 12 -- 16 Atom Bonnell -- -- -- -- 2 4 (6) -- Core2 Penryn -- -- -- -- 4 4 (8) -- Core i5 Ivy Bridge -- -- -- -- 4 4 (8) --
Cortex-A8/A9 は 64bit 幅なので、SIMD2 では Scorpion/Krait/Swift と
差がありません。
SIMD4 では 128bit の Scorpion/Krait/Swift の半分であることがわかります。
ユニークなのは Cortex-A15 で、SIMD4 では同じ 128bit の
Scorpion/Krait/Swift と同等ですが SIMD2 では 2倍の数値となっています。
Cortex-A15 は 64bit 幅 2 pipe なので、2命令同時実行できるためです。
スカラーでは単精度でも 1命令/cycle だったので、半分しか使わなくても
NEON の方が速いことになります。
Ivy Bridge は AVX に対応しているので、上の表では省略していますが SIMD8
があります。下記のページに SIMD8 や倍精度 SIMD 含めて表にまとめています。
一番最初の GFLOPS のリストでは、Quad core かつ動作クロックの高い
Snapdragon 800 (MSM8974) が上位でした。
CPU の cycle 単位の命令数を出してみると、唯一の ARMv8 CPU でもある
A7 Cyclone が群を抜いて高性能であることがわかります。
計測結果から、mul, mad/fma で 2命令、add では 3命令を同時に実行できるようです。
NEON の場合は AArch32 と AArch64 特に違いはありませんでした。
A7 Cyclone の設計は DEC Alpha や StrongARM に由来するエンジニアが
関わっているとのこと。(Wikipedia P.A.Semi)
Benchmark はあくまで浮動小数点演算能力のピーク値を実測することが目的なので、
必ずしも総合的な優劣には一致しないことを予めご了承ください。
関連エントリ
・ARM CPU の VFP Benchmark アプリ 浮動小数点演算速度の計測
・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 の浮動小数点演算能力
・ARM Cortex-A8 の NEON と浮動小数演算最適化
・benchmark 関連