日別アーカイブ: 2011年10月12日

OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新

GPU の速度をもう少し詳しく調べてみました。

(1) light 3 + shadow map  (ambient + directional x2 + point)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  38.96   480x800   15.0M    565   24 8  Exynos 4210
Mali-400MP   A2.3  38.96   480x800   15.0M    8888  24 8  Exynos 4210
Adreno 220   A2.3  27.50   540x960   14.3M    565   16 0  MSM8660
Adreno 220   A2.3  25.00   540x960   13.0M    8888  24 8  MSM8660
SGX 543MP2   i4.3  11.83  768x1024    9.3M    8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A2.2   8.00  600x1024    4.9M    565   16 0  Tegra 250
ULP GeForce  A2.2   8.00  600x1024    4.9M    8888  16 8  Tegra 250
ULP GeForce  A3.1   5.80  800x1232    5.7M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.65  800x1232    5.6M    8888  16 8  Tegra 250


(2) light 3  (ambient + directional x2 + point)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  42.30   480x800   16.2M    8888  24 8  Exynos 4210
Adreno 220   A2.3  36.27   540x960   18.8M    8888  24 8  MSM8660
Adreno 220   A2.3  32.50   540x960   16.8M    8888  24 8  MSM8660
SGX 543MP2   i4.3  15.27  768x1024   12.0M    8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A2.2   9.50  600x1024    5.8M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.90  800x1232    5.8M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.74  800x1232    5.7M    8888  16 8  Tegra 250


(3) light 1  (ambient + directional)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  59.95   480x800  算出不可  8888  24 8  Exynos 4210
Adreno 220   A2.3  55.36   540x960   28.7M    565   16 0  MSM8660
Adreno 220   A2.3  48.20   540x960   25.0M    8888  24 8  MSM8660
SGX 543MP2   i4.3  45.49  768x1024   35.8M    8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A2.2  17.10  600x1024   10.5M    565   16 0  Tegra 250
ULP GeForce  A3.1  13.00  800x1232   12.8M    565   16 0  Tegra 250
ULP GeForce  A3.1  12.10  800x1232   11.9M    8888  16 8  Tegra 250


(4) light 0

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  59.94   480x800  算出不可  8888  24 8  Exynos 4210
Adreno 220   A2.3  60.00   540x960  算出不可  565   16 0  MSM8660
Adreno 220   A2.3  60.00   540x960  算出不可  8888  24 8  MSM8660
SGX 543MP2   i4.3  60.00  768x1024  算出不可  8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A3.1  46.85  800x1232   46.2M    565   16 0  Tegra 250
ULP GeForce  A3.1  34.35  800x1232   33.9M    8888  16 8  Tegra 250


OS = A:Android, i:iOS
framebuffer = color depth stencil

(※ 2011/10/12更新 表のデータを追加しました)

それぞれ機種ごとに解像度が違うので、フレームレート(fps)での比較が
できないことに注意してください。

頂点よりもピクセル負荷の方が高いため、秒間の描画ピクセル数に変換しました。
pix/sec の数値を比べてください。

あくまで自作プログラム+自前シーンでの比較なので参考程度にお願いします。

●補足事項など

ARMv7 Cortex-A9 dual core (or Scorpion dual core) 相当の CPU
搭載機のみピックアップしています。CPU の動作クロックはそれぞれ異なります。

Android は OS2.2 ターゲットで NDK + OpenGL ES 2.0 を使っています。
armeabi-v7a の NEON 無しです。

背景込ですべてピクセル単位のライティングを行なっています。
シェーダーに動的分岐はありません。

Tegra2 は depth_texture が使えないため shadow map で同一条件の
比較ができません。(1) では texture_half_float を使っており他の GPU より
負荷が高くなります。

Tegra2 は 16bit depth しか選択することができません。
逆に Mali-400MP 等は 24bit depth + 8bit stencil しか選択できません。

543MP2 はプラットフォーム(OS) が異なりますが、完全に同一コード+
同一シェーダーで走らせています。ただし完全に同一状態とは言い切れない
ので、実際の数値はもう少し変動するかもしれません。

テクスチャはできる限り GPU 専用の圧縮フォーマットに変換しています。
DXT(S3TC), PVR, ATC, ETC1 の 4フォーマット対応です。

(3) で Mali-400MP の pix/sec が算出不可能なのは 60fps の上限に張り付いて
しまっているからです。

ポリゴンの重なりが多少あるので画面サイズから求めた pix/sec は厳密な値では
ありません。が、TBDR の PowerVR のようにポリゴンの重なりで Shader が無駄に
走らないことを特徴としている GPU もあるためそのまま比べます。

●テスト結果について

描画面積で速度が決まっており、ボトルネックは完全にピクセル負荷
(Fragment Shader) となっています。
(1), (2) などシェーダーが複雑になるほどテクスチャサイズの影響が無くなる
ため、純粋に Fragment Shader が複雑すぎるようです。

PowerVR, Tegra2 など precision 宣言が有効な GPU ほど速度が出ていない
のでシェーダー最適化が不十分で能力を発揮できていない可能性があります。

PVR SGX 543MP は (1) を見ると低速に見えますが、Fragment Shader の
複雑さが下がるほど急激に速度が上がっています。
(3) では上位 GPU にほぼ匹敵していることがわかります。
(4) では逆転するかもしれません。
最適化が足りないか、または実行命令ステップ数の影響を受けやすい GPU のようです。

Mobile GPU ではこの面積で (1),(2) のような複雑なシェーダーを走らせる
ことが想定されていなかったのかもしれません。
それでも Mali, Adreno 220 は意外なほどよく動いています。

Tegra2 はあまり良い結果が出ていませんが、1年以上前から製品に載っている
プロセッサなので、GPU 自体は一世代前のグループに属するのだと考えられます。
年内に出る Tegra3 と比べるべきかもしれません。

ゲームで互換性を考えるとおそらく (3)~(4) の範囲で作ることになるかと思います。
しかしながら Mali-400MP や Adreno 220 など新しい世代の GPU は
複雑なシェーダーでも非常によく動いています。
Mobile のゲームも、もう一段階上の表現が十分可能になってきているといえます。

これまでの結果から大体の GPU 速度のグループ分けは下記のとおりです。

Group 1 | Adreno 200
Group 2 | Adreno 205 / PowerVR SGX 535,540 / Tegra 250
Group 3 | Adreno 220 / PowerVR SGX 543MP2 / Mali-400MP

以下 2011/10/12 22:00 追記

iOS 時の計測方法に問題があったため表の数値を変更しました。
PowerVR SGX 543MP2 の数値が大きく増えています。
さらに PVR 向けに shader 最適化の余地があったため修正しました。

その結果、予想通りシェーダー負荷が軽くなるほど SGX543MP2 の数値は
高くなっており (3) で Adreno 220 を超えています。
Group 3 世代の性能を持っているといえます。

表 (2),(3),(4) のテスト結果も追加しました。

関連エントリ
Android HTC EVO 3D GPU Adreno 220 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)