頂点性能の比較 その2 (OpenGL ES 2.0 Mobile GPU)

最適な頂点形式を割り出すため strip 変換時のパフォーマンスも調べて
みました。

          Mali-   Adreno  Adreno  AMD     ULP      PVR SGX  PVR
          400MP   220     200     Z430    GeForce  543MP2   SGX535
-------------------------------------------------------------------
List       9.07   29.49*   1.71    2.34   20.96    57.08*   14.51*
NStripC   16.42   25.81    3.09    4.30   24.28*   50.96    12.18
NStripL   18.11*  24.38    4.05    5.52   21.02    56.08    14.20
QStrip    17.20   18.41    4.14*   5.79*  21.18    56.06    14.20

単位は fps (大きい方が速い)

テスト条件は前回と同じです。
50880ポリゴンの球モデルを 22個、画面あたり 1119628ポリゴンの描画を
行なっています。

各 GPU 毎に最も高速だった項目に ‘*’ マークをつけています。

各項目の詳細は下記のとおりです。

format   indices   DrawElements
----------------------------------------------------------------------
List      152640   GL_TRIANGLES        無変換 (v-cache hit率 66% 前後)
NStripC    74766   GL_TRIANGLE_STRIP   NVIDIA NvStrip。Cache 優先
NStripL    52873   GL_TRIANGLE_STRIP   NVIDIA NvStrip。長さ優先に修正
QStrip     51518   GL_TRIANGLE_STRIP   Qualcomm Qstrip 使用。

List よりも Strip の方が速いのは
Mali-400MP, ULP GeForce(Tegra2), Adreno 200 の 3種類です。
(AMD Z430 は Adreno 200 とほぼ同一のものです)

逆に Strip 化で速度が落ちたのは Adreno 220, PowerVR です。
この両者は適量の Vertex Cache が搭載されていると考えて間違い無いでしょう。

Strip の方が速い GPU でも、興味深いことに最適なフォーマットがどれも
ばらばらでした。

Mali-400MP = NStripL
ULP GeForce = NStripC
Adreno200/Z430 = QStrip

以下細かく見ていきます。

● Mali-400MP

頂点性能がぱっとしませんでしたが Strip 化で大きくスコアが伸びました。
実測で 20.3M tri/sec まで出せることが確認できました。
List 比 2倍程度なので V-Cache が全く無いわけではなさそうです。

NStripL は cache を無視して出来るだけ長くつながるよう NvStrip を設定
したものです。
同様に長さ優先と思われる QStrip ではなぜか速度が落ちました。

● ULP GeForce(8) (Tegra2)

さすが NVIDIA 製ツールと相性が良いです。
NvStrip の通常設定で一番スコアが伸びました。

Strip の方が高速ですが速度向上率が 16% と小さいため、V-Cache を搭載
しつつ、さらに Strip も速いハードだと考えられます。

たとえぶつ切りでも Cache 効率を優先して並べ変えた NStripC が速く、
無駄な index が無い NStripL/QStrip はかえって速度が落ちることに
なっています。

● Adreno 200/Adreno 205/AMD Z430

Strip 化でおよそ 2.4倍と大幅に伸びています。
このことから基本的に V-Cache が無く、Strip 化することで約 3倍まで
近づくハードウエアであると考えられます。

当然のように Qualcomm 製ツールで変換した場合が最も良い結果となっています。

ただし同じ Qualcomm でも、新型の Adreno 220 では逆に速度が落ちて
しまうので要注意です。

● PowerVR SGX535/SGX543MP2

List の方が高速です。
ただし今回のデータは List でも 66% と Cache hit 率が strip 相当なので
思ったより差が出ていません。

Cache 最適化された NStripC よりも、無駄な index が無い NStripL/QStrip
の方が速度が出ています。縮退 Triangle の効率が悪いのか、Index 転送量の
問題なのかわかりません。

SGX535 は iPod touch3/4 共に同じ数値でした。
画面解像度が影響せず、実行時間をほとんど頂点が占めていることがわかります。

● Adreno 220

List の方が高速です。
V-Cache 搭載 GPU として最も予想通りの結果で、どうすれば速いのか、
何をすれば遅くなるのか感覚的にも受け入れやすいものとなっています。

またこの結果から、Adreno 200/205 と Adreno 220 との間には
アーキテクチャ的な大きな変更があったことがわかります。

Adreno 200 向け最適化 (Qstrip) を行うと cache 効率が下がって却って
速度が落ちます。

●結論

全てに都合の良い頂点形式はありませんでした。
ぎりぎりの頂点性能を求めるなら各 GPU 毎に変換する必要があります。

最低限の頂点性能で幅広いハードで動作することを優先するなら、
遅い GPU の底上げ(Qstrip)でしょうか。

Adreno のように今後は速いペースで GPU の機能が desktop GPU に追いついて
いく事が考えられます。将来を視野に入れたデータ構造にするなら
Cache 優先の List になるでしょう。

ただ現状は頂点よりも圧倒的に pixel の方が速度を圧迫しているため、
このような頂点構造の違いは大した問題ではないかもしれません。

Mobile GPU 速度比較のまとめ

テスト機材一覧
 Mali-400MP         Exynos 4210   Samsung Galaxy S2 SC-02C
 Adreno 220         MSM8660       HTC EVO 3D ISW12HT
 Adreno 200         QSD8250       HTC Desire X06HT
 AMD Z430           i.MX51        Creative ZenTouch2
 ULP GeForce        Tegra 250     Acer ICONIA TAB A500
 PowerVR SGX543MP2  A5            Apple iPad2
 PowerVR SGX535     A4/S5PC100    Apple iPod touch4/iPod touch3

関連エントリ
OpenGL ES 2.0 Mobile GPU の頂点性能を比較する
A5 PowerVR SGX543MP2 は iOS 5 だと速い
さらに OpenGL ES 2.0 Mobile GPU の速度比較
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
Android HTC EVO 3D GPU Adreno 220 の速度