D3D Shader/OpenGL」カテゴリーアーカイブ

3DMark Android 版の結果から

Android 版 3DMark アプリの DEVICE CHANNEL から各機種の結果を見ることができます。
非常に興味深く、見ていて面白いデータです。
まとめてみました。

SoC      CPU       core  GPU              Score        CPU vs GPU
-----------------------------------------------------------------
APQ8064  Krait      x4   Adreno 320       8000-11000   CPU <= GPU*
Exynos5D Cortex-A15 x2   Mali-T604        7800        *CPU >  GPU
MSM8960  Krait      x2   Adreno 225       5000-6500    CPU <= GPU*
MSM8x60  Scorpion   x2   Adreno 220       3700-5000    CPU <= GPU*
Tegra3   Cortex-A9  x4   ULP GeForce(12)  3000-4000   *CPU >> GPU
K3V2     Cortex-A9  x4   Vivante GC4000   3400-3700   *CPU >> GPU
OMAP4470 Cortex-A9  x2   PowerVR SGX544   3600        *CPU >> GPU
Exynos4Q Cortex-A9  x4   Mali-400MP4      2500-3400   *CPU >> GPU
Z2460    Atom       x1   PowerVR SGX540   2400        *CPU >> GPU
Exynos4D Cortex-A9  x2   Mali-400MP4      1600-2100   *CPU >> GPU
OMAP44x0 Cortex-A9  x2   PowerVR SGX540   1300-3400   *CPU >> GPU
MSM8x55  Scorpion   x1   Adreno 205       1750         CPU <  GPU*
RK3066   Cortex-A9  x2   Mali-400MP4      1200-2800   *CPU >> GPU
Tegra2   Cortex-A9  x2   ULP GeForce(8)   1400-2100   *CPU >> GPU

・Score の値が大きい方が速い
・数値は常に変動しているので現時点での目安としてみてください。

一番右端の列は CPU と GPU どちらのスコアが高いかを示しています。

全体的に Adreno22x/320 の数値が高い傾向にあります。
右側の列を見てわかるように、CPU よりも GPU のスコアが高いのは
Qualcomm (Adreno) のプロセッサだけです。

Exynos/OMAP/Tegra 等、Quallcom 以外はすべて CPU の方が高くなっており、
その差も 2倍程度まで広がっています。

なぜこのような結果になっているのか考えてみます。

●CPU

CPU は 2グループあります。

(A) Cortex-A9, Scorpion
(B) Cortex-A15, Krait

(B) は新しい世代の CPU core で、動作クロックの違いもありますが
実行効率そのものが向上しています。
例えば (A) が 2命令 deocde の Out-of-Order 実行だったのに対し、
(B) グループは 3命令に引き上げられています。
同一クロック、同コア数でも Krait, Cortex-A15 の方が高速です。

●Adreno

各社の SoC/GPU は多種多様で得意分野がはっきりしています。
Adreno は ATI の流れをくむモバイル向け GPU で、
最も Desktop 向け GPU に近い機能を持っています。
これは他の GPU にはない大きな特徴です。

例えば頂点テクスチャや Volume Texture (3D Texture) など、
Mobile 向け用途ではあまり必要とされない機能にもしっかり対応しています。
実際に各種 GPU 機能を比較した表は下記のとおりです。

Mobile GPU の比較

Fragment Shader (PixelShder) の演算精度も fp32 の highp 固定で、
描画クオリティも Desktop GPU と同等です。
パフォーマンスを上げるために見た目を犠牲にする必要がありません。

その代わり初期の Adreno 20x/AMD Z430 では頂点キャッシュが無く、
Desktop GPU 同等の描画機能を有する反面、パフォーマンスが思ったように
伸びない傾向がありました。
この点は Adreno 22x 以降改良されており、描画プリミティブに依存せず
大きくスループットが上がっています。

複雑なシェーダーもかなり走るのですが、アプリケーションによっては
あまり速度が出ていないものが存在します。
あくまで想像にすぎませんが、Adreno は OpenGL ES 1.1 の固定パイプを
シミュレーションするのが苦手なのかもしれません。(未確認です)

Shader を使って描画を行う場合、Adreno はモバイルに特化した最適化を
極端に行う必要がなく、シェーダーを移植しても速度が落ちにくい傾向を持っています。
このあたりがベンチマークに有利に働いたのではないでしょうか。
まとめると

・highp 固定なので、演算精度を落とさなくても速度が変わらない。
 ・モバイル向けに mediump/lowp 化するなど特別な最適化を行う必要がない。
 ・PC の描画クオリティから落とす必要がない。
・Uniform 数, Sampler 数も多く Extension も豊富で互換性を取りやすい。
・Unified Shader なので、Vertex 負荷、Pixel 負荷どちらにも対応しやすい。

また Adreno 320 は OpenGL ES 3.0 に対応した新しい設計の GPU core なので
世代的にもかなり高性能です。
使われている API が ES 2.0 なので、まだ眠っている HW 機能があります。
今後さらにスコアが伸びるものと考えられます。

Mobile GPU bench mark

●Mali-400MP4

GPU の「Core 数」は GPU によって数え方が異なっており単位がばらばらです。
端末のスペックに GPU の core 数が書かれている場合がありますが、
性能の指標になるのはあくまで同一 GPU 同士を比べる場合だけです。

PowerVR SGX の MP1~4 は CPU とほぼ同じ概念で、
GPU そのものが複数存在し並列に動作します。

Tegra の core 数は GPU 内の演算ユニットの数を表しています。
G80以降 の Desktop GPU に合わせたもので、Unified Shader の
Stream Processor 相当で何個分なのかを表しています。
Discrete ですが Vertex, Fragment 両方カウントされます。

Mali-400 は下記のページの図 (Mali-400 MP Image) にあるように
Fragment Processor の UNIT 数を選択可能で、MP1~MP4 と呼ばれています。
この数には Vertex Processor が含まれていません。

ARM Mali-400 MP

Tegra2/3 でも 8→12 と core 数は増えていますが頂点 Unit 数は同一です。
もし仮に Mali-400MP 同様 Fragment Processor だけ数えるなら
Tegra2 の ULP GeForce(8) は Vertx 4 + Fragment 4 で MP1、
Tegra3 の ULP GeForce(12) は Vertex 4 + Fragment 8 で MP2 となるでしょう。

つまり Discrete Shader の GPU ではスペック表記上の core 数が増えても、
頂点性能が向上するとは限りません。

Galaxy S2 で Mali-400MP4 登場した時は非常に Pixel パフォーマンスが高く、
他の GPU と比べても良い性能でした。
ですがその後複雑な 3D シーンでは頂点性能がボトルネックになることが
わかっています。

上記のように MP4 でも頂点性能は増えておらず、
10~20万など比較的低いレベルで頭打ちになってしまうようです。

3DMark Ice Storm のポリゴン数はかなりハイポリゴンだと考えられるため、
Mali-400MP4 のパフォーマンスが振るわないのはそのためだと考えられます。

Pixel Shader は mediump なので、厳密には Desktop GPU より演算精度が落ちています。
ただし Tegra や PowerVR SGX のように、最適化で精度を削るほどシビアではありません。
頂点がボトルネックになるだけでピクセル側は mediump 固定なので、
あまり手を加える必要は無いようです。

Mali-T604 以降は Unified Shader なのでまた特性が異なっているはずです。

●Tegra2/3

Mali-400MP と同じ Discrete Shader ですが、特性は正反対です。
頂点に余裕がある代わりに Pixel が足りなくなります。
比較的ハイポリでシンプルなマテリアルの場合に良いパフォーマンスとなるようです。

Mali-400MP 同様 Pixel 精度は mediump までですが、複雑なシェーダーコードでは
lowp を併用して質よりも速度を優先する必要が生じます。
depth の解像度も他の GPU より落ちます。

他の GPU よりも対応 Extension が少なくなっており、ハードウエアの機能も大胆に削られてます。
例えば depth texture が使えないので、ShadowMap はカラーマップに
書き込む必要があります。
depth を圧縮しなければならないので、シェーダーにも追加の演算コードが必要です。
OpenGL ES 2.0 の仕様上 depth texture 対応は必須ではないのですが、
対応していない GPU が Tegra2/3 だけとなっています。

3DMark では比較的ハイポリでも Mali-400MP ほどスコアが落ち込むことはなくなっており、
GPU の能力として妥当な結果だと思います。

NVIDIA らしくない性能の GPU もおそらくこれが最後でしょう。
Tegra4 では機能面でも速度面でも大きく手が加えられており、
かなりスコアが伸びるものと考えられます。

●PowerVR SGX

以前の記事にも書いたように、PowerVR SGX 5xx は 2種類あります。
Android 端末では古い Series 5 (SGX540) が多いため、
GPU の性能的にもベンチマークのスコアがあまりよくないようです。
他にも考えられる原因はあります。

PowerVR SGX はどんな描画でもそつなくこなす傾向があります。
頂点が多いシーンでもピクセルが多いシーンでも柔軟に追従します。

使い方の自由度も高く、画質優先に振っても良いし、速度重視にもできるし、
用途によって使い分けられます。
その反面、決まった解法がなく状況に応じた判断を求められます。

例えば Uniform 数はパフォーマンスを考えるなら 128個以内、
移植性や使いやすさなら 256個使うなど。(過去記事の comment参照)

また Pixel に highp fp32 を使うことができるので、
Desktop GPU と同一の精度で描画することができます。
パフォーマンスがあまり上がらないので、速度を考えるなら
見た目を犠牲にしてでも mediump, lowp へと置き換えることになります。

他の GPU と違い TBDR なので、ALU の利用効率が全体のパフォーマンスに
与える影響が大きくなっています。

通常の GPU はラスタライザから PixelShader (Fragment Shader) が呼ばれるので、
パイプライン待ちのサイクルが存在します。
ラスタライザや depth test など、他のステージが詰まっているときは
Shader を削っても速度が大きく変化しません。

PowerVR SGX は Deffered Rendring なので、Pixel Shader が呼ばれるときは
ラスタライザ等他のステージが完了しています。
Shader の命令を削れば削るほど直接パフォーマンスに響いてくるので
最適化はシビアになりがちです。

ここが最も Adreno と違うポイントで、パフォーマンスを優先するならかなり
手を加える必要があります。高速化出来る余地が残っているともいえます。

なお見た目が変わるとベンチとしての正しい比較とは言えないかもしれないので、
3DMark は比較的高い演算精度でレンダリングしているのではないかと考えられます。
もしそうなら、Tegra/Mali とは違い PowerVR のスコアはまだ上がる余地が
残っていることになります。

iOS 版が出たら、どの程度 PowerVR SGX 向けに最適化されているのか
わかるのではないでしょうか。

・おそらく GPU 毎の Shader 最適化がそれほど強くないので、速度が落ちにくい Adreno が有利
・OpenGL ES 3.0 対応最新 GPU + 新 CPU と、いち早く世代交代した Qualcomm (Krait quad + Adreno 320) がやっぱり速い

関連エントリ
3DMark Android Edition Ice Storm v1.1 の結果
GPU 速度に関連するエントリ

3DMark Android Edition Ice Storm v1.1 の結果

Android 版 3DMark を手持ちのデバイスで試してみました。

Ice Storm (1280x720)

   SoC     GPU            Score Graph Physics GT1   GT2  PhysT Demo  OS
---------------------------------------------------------------------------
1: APQ8064 Adreno 320      9922 10061  9463  43.4  44.1  30.0  47.4  A4.1.1
2: MSM8660 Adreno 220      3167  4218  1692  19.2  17.6   5.4  19.0  A4.0.3
3: Tegra3  ULP GeForce(12) 3559  3143  6638  12.3  15.4  21.1  17.1  A4.2.2
4: Tegra2  ULP GeForce(8)  1448  1268  2878   5.5   5.5   9.1   6.4  A3.1

数値が大きい方が高速

スペック的に最新の Snapdragon APQ8064 (HTC J butterfly HTL21) がトップでした。

次に速いのは Tegra3 (Nexus7) ですが、よく見ると総合スコアは高いものの
Graphics score は MSM8660 の Adreno 220 に負けていることがわかります。

MSM8660 の CPU は Dual core 、Tegra3 は Quad core なので
Graphics で負けている分を Physics の CPU 速度で挽回した形になります。
Tegra らしい結果といえるかもしれません。

ここで気になるのは、Physics score で Scorpion 1.2GHz dual core の MSM8660 が
Cortex-A9 1.0GHz dual core の Tegra2 にも負けていることです。

Tegra2 は NEON を搭載していないので、浮動小数点演算のピークパフォーマンスが
1/2 ~ 1/4 と低いはずなのですが、他の CPU と大きな差がついていません。
Tegra2 のスコアを core 数で 2倍、クロック数で 1.2 倍すると
2878 * 2 * 1.2 = 6907

Tegra3 のスコア 6638 に近い数値となります。
演算性能だけ考えると NEON の分だけ差が開いてもよさそうなので、
NEON があまり活用されていないか、またはバス速度や描画など演算速度以外に
ボトルネックが存在している可能性があります。

それでも Scorpion のスコアは少々低すぎる気がします。

APQ8064 の Krait は十分速いですが、世代的にはもう少し数値が伸びても
良いのではないかと思いました。

下記のページでは Nexus 10 のスコアが掲載されています。
興味深いので一部引用させて頂きます。

4gamer: Futuremark,「3DMark」のAndroid版を発表。スマートフォン・タブレット8機種でテストしてみた

        SoC      GPU      Score Graph Physics GT1   GT2  PhysT Demo  OS
---------------------------------------------------------------------------
Nexus10 Exynos5D Mali-T604 5072  4567  8287  18.3  27.4   8.7  20.6  A4.2.2

Graphics 性能自体はあまり高くないですが、Physics のスコアが非常に伸びています。
Cortex-A15 1.7GHz dual core でこの数値なので、同クロックで比べても
Cortex-A9 の倍近くとなり、現行 Krait でも届きません。

Tegra4 や Exynos 5 Octa など、Cortex-A15 の Quad core が出たら
CPU 最速で間違いないでしょう。

もちろん Qualcomm も Krait 400 ではスコアが伸びていると思われます。

以下 Extream の結果

Ice Storm Extream (1920x1080)

   SoC     GPU            Score Graph Physics GT1   GT2  PhysT Demo  OS
---------------------------------------------------------------------------
1: APQ8064 Adreno 320 1.5  6133  5479 10530  26.8  21.4  33.4  23.9  A4.1.1
2: MSM8660 Adreno 220        --    --    --    --    --    --    --  A4.0.3
3: Tegra3  ULP GeForce(12) 1884  1574  6054   7.3   6.4  19.2   7.1  A4.2.2
4: Tegra2  ULP GeForce(8)   722   597  2721   3.1   2.2   8.6   2.6  A3.1

数値が大きい方が高速

HTC EVO 3D ISW12HT (Snapdragon MSM8660) では Ice Storm Extream が動きませんでした。

テストしたデバイスの詳細は下記の通り

   Name                  SoC       CPU       Clock core  GPU
-------------------------------------------------------------------------
1= HTC J butterfly HTL21 APQ8064   Krait     1.5GHz x4   Adreno 320
2= HTC EVO 3D ISW12HT    MSM8660   Scorpion  1.2GHz x2   Adreno 220
3= Nexus 7               Tegra3    Cortex-A9 1.2GHz x4   ULP GeForce(12)
4= OptimusPad L-06C      Tegra2    Cortex-A9 1.0GHz x2   ULP GeForce(8)

関連ページ
Mobile GPU bench mark
CPU benchmark

関連エントリ
Silicon Studio MOBILE GPUMARK のスコア比較

HiSilicon K3V2 の GPU

Huawei の端末に使われている Hisilicon K3V2 の CPU は Cortex-A9 quad ですが、
GPU は詳細不明で 16 core としか書かれていないので少々調べてみました。

GPU は Hisilicon Technologies の Immersion.16 となっています。
GL Extension は下記の通り。

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: Immersion.16
GL_VENDOR: Hisilicon Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

Extension:
GL_EXT_debug_marker
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_compressed_paletted_texture
GL_OES_EGL_image
GL_OES_depth24
GL_OES_element_index_unit
GL_OES_fbo_render_mipmap
GL_OES_fragment_precision_high
GL_OES_rgb8_rgba8
GL_OES_stencil1
GL_OES_stencil4
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_depth_texture
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_get_program_binary
GL_EXT_texture_format_RGBA8888
GL_IMG_read_format
GL_EXT_blend_minmax
GL_EXT_read_format_bgra
GL_EXT_multi_draw_arrays
GL_APPLE_texture_format_BGRA8888
GL_APPLE_texture_max_level
GL_ARM_rgba8
GL_EXT_frag_depth
GL_VIV_shader_binary
GL_VIV_timestamp
GL_OES_mapbuffer
GL_EXT_discard_framebuffer
GL_OES_vertex_type_10_10_10_2
GL_EXT_texture_type_2_10_10_REV
GL_EXT_texture_filter_anisotropic
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear

初めて見る GPU ですが、GL_OES_fragment_precision_high かつ
GL_EXT_discard_framebuffer なので、おそらく Unified シェーダーで
Tile Base のアーキテクチャであると考えられます。

また GL_VIV_shader_binary があるので、Vivante の GPU core または
何らかの形で Vivante が関与している可能性が高いようです。

GPU Extension は下記に追加しました。

OpenGL ES Extension (Mobile GPU)

Vivante GC860 と比べても、Unified + TBR が同一で、かつ
GL_OES_stencil1, GL_OES_stencil4 と言った特徴的なシンボルが含まれています。
ただし GC860 が持っていた S3TC (DXT) に対応しておらず EXT1 のみとなっています。

追記: K3V2 搭載端末の例 (2013/03/09)
・GT01
・STREAM X GL07S
・Ascend D2 HW-03E
・dtab
端末一覧

関連ページ
SoC spec list
OpenGL ES Extension (Mobile GPU)

Android で WebGL (Chrome)

Android 向けに新しい Chrome がリリースされ、WebGL 対応になったようです。

「膨大な変更」でパフォーマンス向上した「Chrome for Android」最新版

WebGL を有効にする方法 (手順は PC版 Chrome と同じです)

(1) URL に “about:flags” と入力 (または “chrome://flags”)
(2) リスト内の “WebGL を有効にする” を有効にする
(3) ブラウザの再起動

有効になっているかどうか下記の手順で確認できます。
(機能を有効にしても GPU によっては使えない可能性があります。)

(1) URL 欄に “chrome://gpu-internals” と入力
(2013/04/07 追記: 新しい Chrome は gpu-internals ではなく “chrome://gpu” に変更されています)

chrome_webgl.png

Android には様々なブラウザアプリケーションが揃っているので、
これまでも WebGL を使うことができました。

Opera , Firefox はすでに Android 版で WebGL に対応しており
3D 描画ができるようになっています。

Chrome の正式版はこれまで未対応でしたが、
先行配信されていた Chrome Beta ではすでに機能が入っていました。
WebGL の次は NativeClient へと、徐々に対応機能が広がっていくものと考えられます。

OpenGL ES 3.0 と GPU

Khronos Conformant Products に OpenGL ES 3.0 の名前が
登場しています。

Intel HD Graphics 4000/2500
PowerVR Rouge Hood (PowerVR Series 6)
Snapdragon MSM8974 (Adreno 330)
Snapdragon MSM8064 (Adreno 320)

OpenGLES 3.0 API は GL 4.3 の互換モードや Emulator ですでにテスト可能(詳細)
ですが、モバイルデバイスでも HW の対応が進行しています。
ARM Mali はもちろん Vivante もすでに 3.0 に対応しているとのことです。

Vivante

↑の i.MX6 Quad といえば thanko Android SmartTV Quad-core に使われています。

唯一対応が未定で 2.0 のままなのは Tegra シリーズだけとなっています。
NVIDIA には Desktop GPU があるため余裕があるのかもしれません。

関連エントリ
OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
OpenGL ES 3.0 と OpenGL ES 2.0 の互換性
OpenGL ES 3.0 と Shader Model の関係、まとめ wiki の更新
OpenGL ES 2.0/3.0 Emulator
OpenGL 4.3 と GL_ARB_ES3_compatibility