Snapdragon の本当の浮動小数点演算能力

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 と浮動小数演算最適化