A5 は Cortex-A9 dual ながら NEON 搭載で一安心でした。(前回)
調べていて気がついたのは Snapdragon (Scorpion) が A5 に匹敵するスコアを
出していたことです。
Snapdragon はあまり詳しく検証していなかったのでもう少し調べてみました。
iPad1 A4 Cortex-A8 1GHz vadd.f32 D 4.04sec vmul.f32 D 4.06sec vmla.f32 D 4.57sec vadd.f32 Q 8.12sec vmul.f32 Q 8.11sec vmla.f32 Q 8.13sec
↑まずは Cortex-A8/A9 の場合です。
上記結果は先日の表の抜粋で、40命令× 1億回数 = 4G 命令のおおよその
実行時間となっています。
1GHz 時に約 4秒なのでほぼ 1命令/cycle となっています。
D が付いているものは「vadd.f32 d0, d1, d2」等の 64bit 命令、
Q が付いているものは「vadd.f32 q0, q1, q2」等の 128bit 命令の結果です。
128bit (Q) は実行時間がちょうど 2倍となっているため、x86 の初期の
SSE 同様 64bit 単位で実行が行われていると考えられます。
vmla (積和) を考慮すると 1サイクルあたり float が 4演算なので、
A8/A9 の NEON は 1GHz 時にピークで core あたり約 4GFLOPS。
Desire X06HT Snapdragon QSD8250 Scorpion 1GHz vadd.f32 D 4.35sec vmul.f32 D 4.34sec vmla.f32 D 4.33sec vadd.f32 Q 4.35sec vmul.f32 Q 4.36sec vmla.f32 Q 4.12sec
↑Snapdragon も 1GHz 時におよそ 4秒で 1命令/cycle に近い数字となっています。
注目すべき点は Snapdragon の場合 D(64bit) と Q(128bit) の実行時間に差が
ないことです。
Cortex-A8/A9 比だと 128bit 演算は 2倍近い速度となっており、
32bit float x 4 = 128bit 単位で実行出来るものと考えられます。
これらの結果を検証するために、128bit で演算が行われているかどうか
テストしましたが、当初は想定した結果にならず Cortex-A8 より遅くなる
ケースもありました。
Snapdragon のスループットは 128bit 時に最高で 2倍となりますが、
その代わり全体的に命令のレイテンシが大きいようです。
遅くなったのは、Cortex-A8 向け最適化だとパイプラインが完全に埋まらず
ストールが発生していたためだと思われます。例えばすぐ直後の命令と
競合していた場合は、レイテンシが大きい方が遅く見えます。
ピークで cycle あたり 8 float 演算が可能なので、Snapdragon の
Scorpion core は 1GHz 時に 8GFLOPS 相当となります。
Dual core の Snapdragon が登場したら、浮動小数点演算能力における
最速の座はあっさりと奪われてしまうことになりそうです。
Snapdragon QSD8250 Scorpion 1GHz = 8GFLOPS (NEON 128bit, 8GFLOPS x1) iPad2 A5 Cortex-A9 1GHz x2 = 8GFLOPS (NEON 64bit, 4GFLOPS x2) iPad1 A4 Cortex-A8 1GHz x1 = 4GFLOPS (NEON 64bit, 4GFLOPS x1) Tegra 250 Cortex-A9 1GHz x2 = 4GFLOPS (VFP 32bit, 2GFLOPS x2)
なお実測したとは言え、理論上のピークを求めるものなので演算結果には
意味を持っていません。実際のプログラムではバス帯域等もありここまで
大きく差が出ないものと思われます。
他にもいろいろ実験してみましたが、Snapdragon の NEON のパイプラインを
無駄なく埋めるのはなかなか困難でした。
関連エントリ
・iPad2 A5 と浮動小数演算 VFP/NEON
・Tegra2 Cortex-A9 と浮動小数演算
・Snapdragon と浮動小数演算速度
・ARM Cortex-A8 の NEON と浮動小数演算最適化