Search Results


追加しました。

Mobile GPU bench mark

OS も開発ツールも画面サイズもバラバラで厳密ではありませんが
いろいろと傾向は見えます。

iPhone 5 は iPad3 に匹敵する速度が出ており解像度の分だけ高速です。

iPod touch 5 は iPhone 5 と比べると半分くらいに落ちますが、
前世代 iPod touch 4 からは 5倍程度の性能が出ていることがわかります。

なおテスト内容は一応ゲームを想定した描画となっています。
ただし完全に FragmentShader (PielShader) 側で演算をこなしており、
非常にピクセル負荷が高くなっています。

一見フレームレートなどパフォーマンス的に低いように見えるかも
しれませんが、実際のゲームではもっと最適化をかけられるため
十分なパフォーマンスを出すことができます。
多くの処理は頂点や CPU 側に移動できますし、
総合的に見ても今のハイエンドスマートフォンの性能は
ゲーム専用機を大きく超えているといえます。


更新しました。

Mobile GPU bench mark

間違いなく PowerVR SGX543MP4 は最強です。
これまでのハイエンドグループのスコアの 2倍程度出ています。
でもそれをもってしても 2048x1536 の解像度は一筋縄では
いかないようです。
速度優先ならレンダリング解像度を下げる必要がありそうです。

またこれだけハイレゾになるとピクセルに負担をかけるのは現実的で
ないので、多くの処理を頂点で行い 3D モデルを適度に
ハイポリ化した方が良いと思われます。
2D も 3D もベクタ化を考えた方が良さそうです。


関連エントリ
頂点性能の比較 その2 (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世代) 更新


CPU の結果も追加しました。
今回から CPU もグループごとに速い順に並び替えています。

CPU benchmark

GPU に iPad mini も追加しました。

Mobile GPU bench mark

CPU/GPU ともに刷新された A6X が最速です。
GPU はより上位のプロセッサに置き換わってますがまだ同世代。
CPU と同じようにそろそろ次のアーキテクチャが出てきても
良いのではないでしょうか。

CPU では iPad mini の方が iPod touch 5 より速いですが
GHz あたりの演算速度ではほぼ同一の値です。
同じ A5 であることがわかります。


関連エントリ
iPad 4 Apple A6X GPU PowerVR SGX554 MP4 の速度
iPhone 5 / iPod touch 5 の GPU 速度
iPad 3 PowerVR SGX543MP4 の速度


iPad 4 のベンチマークスコアを追加しました。
Apple A6X の GPU はこれまでの PowerVR SGX543 とは別のもので、
PowerVR SGX554 でした。
同じ 4 core でも性能的に公称 2倍。
実際のベンチマークでも 2~3 倍の速度が出ています。

Mobile GPU bench mark

Retina で Pixel 数が 4倍もあるにもかかわらず、
実際の動作速度で iPad 2 を超えているケースも少なくありません。
描画だけでなく CPU core 自体も大きく高速化されており、
システム全体として非常にパワフルになった印象です。

特に PowerVR SGX554 はシェーダーの演算能力自体が上がっているようで、
これまで苦手としてきたシェーダー負荷が高いケースでもきちんと速度が
出るようになっています。

間違いなく現時点では最速に分類され、
Retina や Mobile GPU であることを言い訳にできなくなっています。
ただし今のところ Extension に違いはなく、PVRTC2 や OpenGL ES 3.0
に向けた新しいフューチャーに対応しているかどうかは不明です。

今年になって CPU core も GPU core も世代交代が進んでいます。
A6, Krait, Cortex-A15 といった CPU core だけでなく、
Adreno 320, Mali-T604 等 OpenGL ES 3.0 世代の GPU も揃って来ました。
あとは OS や SDK の対応を待つばかりです。

OS の対応が始まれば世代交代はさらに早まるものと考えられます。


関連エントリ
iPhone 5 / iPod touch 5 の GPU 速度
iPad 3 PowerVR SGX543MP4 の速度


oga at 03:27

いろんなプロセッサの端末が揃ったのでベンチマークソフトを走らせてみました。
使用したソフトは下記のとおり。

(1) Benchmark 1.03
(2) CPU Benchmark 1.7.1
(3) GPUBench 1.0.0
(4) Quadrant standard 1.1.5
(5) Linpack 1.1.8

                     Desire   ZenTouch2   ZiiO7     LuvPad   ODROID-S
---------------------------------------------------------------------
Android OS              2.2       2.1       2.1       2.2       2.2
Processor            QSD8250    i.MX51    ZMS-08   Tegra250  S5PC110
CPU Hz                 1GHz     800MHz     1GHz     1GHz x2   1GHz
---------------------------------------------------------------------
(1) Bench Graphcis     28.16    225.21    395.79    293.48    517.90
(1) Bench CPU Float  2049.57    432.77    581.37   2816.16   1675.83
(1) Bench Memory      339.03    183.67    721.17    516.18    680.16
(2) CPU Benchmark     759ms    1207ms    1038ms     436ms     719ms
(3) GPU Absolute     14633     22071       ---       ---       ---
(3) GPU Relative     11587     26300       ---       ---       ---
(4) Quadrant          1259       979      1995      1827      1040
(5) Linpack           32.82      5.66      5.97     36.71      ---
----------------------------------------------------------------------
* (2) のみ値が小さいほうが速い

テスト環境は厳密に合わせたわけではないので結果は参考程度にお願いします。
例えば通信の接続状況とか起動中のサービスなど。

OS の違いを考慮する必要があります。
Android OS 2.2 では JIT が搭載されたため、Java アプリの場合は実行内容に
よっては 2.1 と 2.2 で極端な差が出ます。(1) の CPU や (5) など。
ZEN Touch2 と ZiiO7 で全体的に速度が低いのはそのためです。

GPU Test は OpenGL ES 2.0 ですが、動かないケースが多くあまり比較
できませんでした。

Quadrant は Disk/DB 速度が含まれているのでプロセッサのみの結果では
ないようです。例えば Desire の結果とプリセットされている結果を比べると
OS 2.2 になって 2倍程スコアが上がっていることがわかります。
その分を考慮すると OS 2.1 の ZEN Touch 2 や ZiiO7 はかなり突出した
値が出ているように見えます。原因は不明です。

LuvPad の Tegra は GPU 側をきちんと評価できていませんが、とりあえず
CPU core が高速なことがわかります。おそらく多くのテストは Single Thread
だと思われるので、A9 Dual ならもっと速いのではないでしょうか。

厳密ではなく大雑把な傾向ですがおそらく同クロックの場合

整数: A9 > A8 > Snapdragon1
浮動小数 VFP: A9 > Snapdragon1 > A8
(NEON: A8 ≧ Snapdragon1)

といった印象です。
GPU は残念ながらデータ不足です。
ただ同一と思われた GPU でも違う結果が出ています。
画面サイズやバス速度の差もあるのかもしれません。

結果の詳細はこちら
CPU/GPU Benchmark

ちなみにベンチマーク結果と実際の使用感、体感速度は全くの別物です。
現状だとほぼ Desire X06HT とそれ以外の 2つに分けられます。
ZEN Touch2/ZiiO7 はパネルにさえ慣れれば反応は良好な方です。


テスト端末

・Desire
 HTC Desire X06HT
 Qualcomm Snapdragon QSD8250, Scorpion 1GHz, Adreno 200
 Android 2.2
 800x480
 RAM 576MB

・ZenTouch2
 Creative ZEN Touch 2 (8GB) TN-T28G
 Freescale i.MX51, Cortex-A8 800MHz, AMD Z430
 Android 2.1
 480x320
 RAM 256MB(?)

・ZiiO7
 Creative ZiiO 7 (8GB) ZO-7S
 ZiiLabs ZMS-08 HD, Cortex-A8 1GHz, ZMS-08
 Android 2.1
 800x480
 RAM 512MB

・LuvPad
 MouseComputer LuvPad AD100
 NVIDIA Tegra 250, Cortex-A9 x2 1GHz, Tegra 250
 Android 2.2
 1024x600
 RAM 512MB

・ODROID-S (借り物)
 HardKernel ODROID-S
 Sumsung S5PC110, Cortex-A8 1GHz, PowerVR SGX 540
 Android 2.2
 480x320
 RAM 512MB



今までテストに使用してきたプログラムが安定して動作しないため
Adreno 320 では速度の計測ができていませんでした。
LG Optimus G LGL21 を借りることができたのでもう一度テストしてみました。

Mobile GPU ベンチ OpenGL ES 2.0
CPU benchmark
OpenGL ES Extension (Mobile GPU)

GPU bench の (1) 以外は 60fps に達するため数値が出ていません。
GPU 性能が上がったため、もはやこのテストは計測に向いていないことになります。

また Adreno 320 は OpenGL ES 3.0 世代の GPU ですが、
現在の OS から使う限り API は OpenGL ES 2.0 になります。
GPU 性能をまだ引き出せていない可能性があります。

テストプログラムのエラーの原因は特定のケースでシェーダーのコンパイルが
エラーになるもので、回避方法はわかったもののまだ詳しい条件が
特定できていません。

VFP test では HTC J HTL21 よりも良い結果が出ています。

                 (1)     (2)     (3)      (4)    (5)     (6)
                 iPad3  Touch5   EVO 3D  iPad4 Butterfly OptimusG
                 A5X     A5      8660     A6X    8064    8064
                 C-A9    C-A9   Scorpion Swift   Krait   Krait
----------------------------------------------------------------
a:mat44 neon_AQ  4.784   5.979   2.879   1.204   1.919   1.354
b:mat44 neon_BQ  2.408   3.008   1.146   1.266   1.273   0.930
c:mat44 neon_AD  4.781   5.974   3.079   1.554   2.453   1.862
d:mat44 neon_BD  2.406   3.007   1.440   1.344   2.041   1.521
e:fadds      A   4.010   5.013   3.460   2.882   3.791   2.831
f:fmuls      A   4.010   5.012   4.361   2.953   3.671   2.793
g:fmacs      A   4.012   5.011   4.034   5.763   7.334   5.599
h:vfma.f32   A   -----   -----   -----   5.765   3.725   2.743
i:vadd.f32 D A   4.111   5.136   3.493   2.877   3.706   2.724
j:vmul.f32 D A   4.110   5.136   3.502   2.950   3.667   2.767
k:vmla.f32 D A   4.512   5.650   3.638   2.951   7.557   5.462
l:vadd.f32 Q A   8.023  10.036   3.408   2.878   3.677   2.717
m:vmul.f32 Q A   8.022  10.028   3.427   2.952   3.647   2.741
n:vmla.f32 Q A   8.025  10.028   3.400   2.955   7.362   5.446
o:vfma.f32 D A   -----   -----   -----   2.494   3.676   2.709
p:fadds      B   4.014   5.013   5.972   5.757   4.664   3.388
q:fmuls      B   5.013   6.265   5.960   5.760   4.583   3.384
r:fmacs      B   8.023  10.024   8.573  11.521   8.266   6.246
s:vfma.f32   B   -----   -----   -----  11.519   4.611   3.622
t:vadd.f32 D B   4.113   5.137   5.945   2.881   4.746   3.406
u:vmul.f32 D B   4.118   5.145   5.098   2.951   4.680   3.454
v:vmla.f32 D B   9.027  11.278   8.498   5.757   8.361   6.140
w:vadd.f32 Q B   8.021  10.023   5.950   2.879   4.702   3.481
x:vmul.f32 Q B   8.029  10.023   5.095   2.951   4.595   3.412
y:vmla.f32 Q B   9.026  11.277   8.497   5.762   8.464   6.249
z:vfma.f32 D B   -----   -----   -----   5.759   4.660   3.413
---------------------------------------------------------------
↑数値は実行時間(秒) 数値が小さい方が速い

(1)=Apple iPad 3           A5X      ARM Cortex-A9 x2  1.0GHz
(2)=Apple iPod touch 5     A5       ARM Cortex-A9 x2  0.8GHz
(3)=HTC EVO 3D ISW12HT     MSM8660  Scorpion      x2  1.2GHz
(4)=Apple iPad 4           A6X      A6 (swift)    x2    ?GHz
(5)=HTC J butterfly HTL21  APQ8064  Krait         x4  1.5GHz
(6)=LG Optimus G LGL21     APQ8064  Krait         x4  1.5GHz

Krait の FP 性能は Swift に並ぶ新 core であることがよくわかります。

前回のテスト時はクロックが上限まで上がっていなかった可能性があります。
HTC J butterfly が修理から戻ってきたらもう一度計測してみたいと思っています。


関連エントリ
Adreno 320 Snapdragon S4 Pro APQ8064


oga at 23:59
Amazon Fire TV は Qualcomm Snapdragon 600 APQ8064 搭載。
Kindle Fire HDX の Snapdragon 800 には及ばないものの、
Nexus 7 2013 の Adreno 320 より 1.5 倍高速です。

Amazon Fire TV

Console     SoC            CPU      clock core GPU        GPU性能比予想
-----------------------------------------------------------------------
OUYA        Tegra3 T33     Cortex-A9 1.7GHz 4  ULP GeForce(12)    1
Fire TV     S600 APQ8064T  Krait 300 1.7GHz 4  Adreno 320         6倍
Vita TV                    Cortex-A9   ?GHz 4  PVR SGX543MP4+     ?

Nexus7 2012 Tegra3 T30L    Cortex-A9 1.2GHz 4  ULP GeForce(12)    1 
Nexus7 2013 S4 APQ8064     Krait     1.5GHz 4  Adreno 320         4倍 
Kindle HDX7 S800 MSM8974   Krait 400 2.2GHz 4  Adreno 330         8倍 

より詳細な比較表は下記にまとめました。

Game Console スペック

Google によると Nexus 7 (2012) Tegra3 と Nexus 7 (2013) は CPU で 1.8倍、GPU で 4倍差があるとのこと。(Impress 新型 Nexus 7)
また旧 S4 Pro の Adreno 320 と Snapdragon 800 Adreno 330 は演算能力で2倍の差となっています。(Qualcomm Snapdragon blog)
Snapdragon 600 の Adreno 320 はちょうどこの中間の性能。
さらに Snapdragon 600 Adreno 320 は Adreno 305 の 3倍以上の性能。(Snapdragon 600)

                  GPU         比率  ALU  ALU比
----------------------------------------------
Snapdragon 400    Adreno 305   2    6     1.5
Snapdragon S4 Pro Adreno 320   4    16     4
Snapdragon 600    Adreno 320   6    24     6
Snapdragon 800    Adreno 330   8    32     8

Amazon の新しい世代のデバイスは Snapdragon Adreno 3x0 で統一されています。
FireTV, Kindle HDX 向けアプリは Adreno 3x0 向けに最適化していくことになるでしょう。
ただし Fire OS は Android 4.2 (API Level 17) なので OpenGL ES 3.0 未対応。

Qualcomm New Amazon Fire TV powered by Snapdragon 600 processor


関連ページ
Game Console スペック一覧
Mobile GPU bench mark
CPU FLOPS


ベンチマークの結果を更新しました。

Mobile GPU bench mark

Android 4.1 以降かつ対応しているデバイスでは SwapInterval を 0 に
変更したので 60fps 以上出ています。(関連)

GPU            SoC   CPU clock OS    Screen     fps       pix/sec
---------------------------------------------------------------------
Adreno 330     MSM8974 2.2GHz  A4.2  1920x1200  71.98fps   165.8M
Adreno 320(64) APQ8064 1.5GHz  A4.4  1920x1104  40.97fps    86.8M
Mali-T604     Exynos5D 1.7GHz  A4.4  2560x1504  20.73fps    79.8M
ULP GeForce(72) Tegra4 1.8GHz  A4.3   1126x800  44.58fps    43.4M
ULP GeForce(12) Tegra3 1.2GHz  A4.4   1280x752  15.70fps    15.0M (*1)

*1: Shadow Map 無し, 16bit depth

Adreno 330 は予想以上に速く、Adreno 320 比でもおよそ 2倍の速度が出ています。
ついに一番負荷が高い設定でも Full HD (1920x1200) で 60fps を超えるように
なってしまいました。
2010 年の GPU では 800x480 でもわずか 3fps でした。

対する Tegra 4 はあまり速度が伸びていません。
負荷を下げても速度が上がらないので、SwapInterval 設定が効いていないか
何かしら問題が発生している可能性があります。

その代わり Tegra 3 で省かれていたさまざまな extension をサポートしており
描画結果が他の GPU とほぼ一致するようになりました。

特に GL_EXT_shadow_samplers は単なる Hardware ShadowMap ではなく
PCF にきちんと Bi-linear Filter もかかります。
GL_EXT_shadow_samplers は OpenGL ES 3.0 以降のデバイスはどれも対応
していますが、必ずしも Filter がかかるとは限らないようです。
下記はいくつかテストした結果です。

                               depth-tex sh-samplers PCF Filter
----------------------------------------------------------------
8064 Adreno 320 OpenGL ES 3.0      ◎        ◎      ◎   --
8064 Adreno 320 OpenGL ES 2.0      ◎        --      --   --
Mali-T604       OpenGL ES 3.0      ◎        ◎      ◎   ◎
Tegra 4         OpenGL ES 2.0      ◎        ◎      ◎   ◎
Tegra 3         OpenGL ES 2.0      --        --      --   --
iOS PVR 543MP3  OpenGL ES 2.0      ◎        ◎      ◎   ◎
Vivante GC4000  OpenGL ES 2.0      ◎        --      --   --
Mali-400MP4     OpenGL ES 2.0      ◎        --      --   --
PowerVR SGX540  OpenGL ES 2.0      ◎        --      --   --

この辺りはもう少し詳しく調べたいと思っています。
なお Tegra4 の Extension 詳細は下記のページに追加しました。

CPU/GPU OpenGL ES Extension (Mobile GPU)


関連エントリ
Android OpenGL ES と V-Sync (eglSwapInterval)
Nexus 10 GPU Mali-T604
Qualcomm APQ8064 GPU Adreno 320 の速度
さらに OpenGL ES 2.0 Mobile GPU の速度比較
GPU 速度に関連するエントリ


oga at 03:16
ARM11 搭載機種ということで TouchDiamond S21HT もテストに加えてみました。
昨日の結果

                Desire   ZenTouch2  ZiiO7    LuvPad   ODROID-S     S21HT
--------------------------------------------------------------------------
Android OS       2.2       2.1       2.1       2.2       2.2        2.2
Processor      QSD8250    i.MX51    ZMS-08   Tegra250  S5PC110   MSM7201A
CPU Hz           1GHz     800MHz     1GHz     1GHz x2    1GHz      528MHz
CPU Arch        ARMv7A    ARMv7A    ARMv7A    ARMv7A    ARMv7A   ARMv6TEJ
CPU            Scorpion  CortexA8  CortexA8  CortexA9  CortexA8 ARM1136EJ
FPU           VFP3,NEON VFP3,NEON VFP3,NEON    VFP3   VFP3,NEON      ---
GPU           Adreno200  AMD Z430   ZMS-08   Tegra250 PVRSGX540 Adreno130
OpenGL ES          2.0       2.0       2.0       2.0       2.0       1.1
RAM              576MB     256MB?    512MB     512MB     512MB     192MB
Display        800x480   480x320   800x480  1024x600   480x320   640x480
--------------------------------------------------------------------------
(1) Graphcis     28.16    225.21    395.79    293.48    517.90      9.38
(1) CPU Float  2049.57    432.77    581.37   2816.16   1675.83    128.41
(1) Memory      339.03    183.67    721.17    516.18    680.16    116.95
(2) CPU Bench    759ms    1207ms    1038ms     436ms     719ms    4698ms
(3) GPU Abs      14633     22071       ---       ---       ---       ---
(3) GPU Rel      11587     26300       ---       ---       ---       ---
(4) Quadrant      1259       979      1995      1827      1040       434
(5) Linpack      32.82      5.66      5.97     36.71     14.03      1.98
--------------------------------------------------------------------------
* 値が大きいほうが速い, (2) のみ値が小さいほうが速い

HTC Touch Diamond S21HT の MSM7201A は DirectX7/OpenGL ES 1.1 の GPU を
搭載しているので、低速ながらグラフィック系のテストも通りました。
ただし CPU core は VFP 無しの ARM11 なので Float 演算を行うテストの
スコアは大きく落ちています。

また ARMv6 (ARM11) と ARMv7 世代の性能差は大きく、同クロックで比べても
ARMv7 系はかなり高速に動作します。
NDK のバイナリの違いもありますので、ゲームなど高パフォーマンス用途を
考えると ARM v7 系とそれ以外の違いはますます広がることになります。

ODROID-S の Linpack も追加しました。
同じ A8 の ZenTouch2/ZiiO7 と比べて OS 2.2 になった分大幅に高速化されて
いますが Snapdragon や A9 には届きません。
(2) CPU Bench ではむしろ Snapdragon より速いので、やはり A8 の VFP が
原因だと考えられます。

整数: A9 > A8 > Snapdragon1
浮動小数 VFP: A9 > Snapdragon1 >> A8
浮動小数NEON: A8 ≧ Snapdragon1

詳しい数値
CPU/GPU Benchmark

関連エントリ
各種 Android 端末のベンチマークテスト
Android NDK r5 と armeabi, 浮動小数命令の種類


Cortex-A5 搭載 Android 端末 SXZ-PD10
(SHENZHEN LINK-CREATE TECHNOLOGY PD10 普及版)
を試してみました。
CPU や GPU のデータは下記ページにまとめています

CPU/GPU

以下抜粋です。

Processor       : ARMv7 Processor rev 1 (v7l)
BogoMIPS        : 415.33
Features        : swp half thumb fastmult vfp edsp thumbee neon vfpv3 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc05
CPU revision    : 1

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: Mali-400 MP
GL_VENDOR: ARM
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

Cortex-A5 は vfpv4 ですが cpuinfo の Features では vfpv3。

ARM vfp の種類

上記のように SXZ-PD10 は Cortex-A5 1.2GHz + Mali-400 で
Android 4.0 が搭載されています。
実際にプログラムを走らせた結果は次のページにまとめています。

CPU benchmark

以下は部分的に抜き出したものです。

SoC / CPU                   MB/sec   T/GHz  device
------------------------------------------------------------------
MSM7225 ARM11        600MHz   6.99   11.65  IDEOS
JZ4770 XBurst1       1.0GHz  16.40   16.40  Novo7 Paladin
TCC8923 Cortex-A5    1.2GHz  18.42   15.35  SXZ-PD10
MSM8255 Scorpion     1.0GHz  24.82   24.82  Xperia ray SC-03C  
Tegra2 Cortex-A9     1.0GHz  25.11   25.11  OptimusPad L-06C
Atom Z540            1.86GHz 30.44   16.37  VAIO Type P VGN-P90S
Exynos4210 Cortex-A9 1.2GHz  33.42   27.85  Galaxy S2 SC-02C
Tegra3 Cortex-A9     1.3GHz  36.15   25.82  EeePad TF201
APQ8060 Scorpion     1.5GHz  42.64   28.43  Galaxy Tab SC-01D

MB/sec の数値が大きい方が速い。
整数演算のみ。single thread (single core) のみ。
・MB/sec = 1秒あたりの変換byte数
・T/GHz  = MB/sec を CPU 1GHz あたりの速度に変換したもの

single thread のテストなので Multi core CPU や HT 対応 CPU でも
1 thread 分の速度なので注意してください。

Cortex-A5 は同時に実行できる命令数が半分なので、上位の CPU より
遅くなっています。

ところがこの Cortex-A5 には vfpv4 + neon が搭載されており、
浮動小数点演算ではかなり高速であることがわかりました。

CPU bench FPU

Linpack 1.2.8

Single  Multi
MFLOPS  MFLOPS  Soc/CPU
-------------------------------------------------------------------
18.091          Cortex-A8     1.0GHz  S5PC110    Galaxy S SC-02B
18.684          MIPS XBurst1  1.0GHz  JZ4770     Novo7 Paladin
25.732          Cortex-A5     1.2GHz  TCC8923    SXZ-PD10
35.628          Scorpion      1.0GHz  QSD8250    Desire X06HT
31.142  57.331  Cortex-A9 x2  1.0GHz  Tegra2     OptimusPad L-06C
46.164  74.664  Scorpion  x2  1.2GHz  MSM8660    EVO 3D ISW12HT
56.076  89.860  Scorpion  x2  1.5GHz  APQ8060    Galaxy Tab SC-01D
57.342  92.981  Cortex-A9 x2  1.2GHz  Exynos4210 Galaxy S2 SC-02C
47.071 140.908  Cortex-A9 x4  1.3GHz  Tegra3     EeePad TF201

MFLOPS の数値が大きいほうが速い


                          Render                  NDK    VFP  NEON
CPU                       Script   Java  Java2    C++    asm   asm
--------------------------------------------------------------------
JZ4770   XBurst1 1.0GHz     289     479  11736    158     -      -
TCC8923  Cortex-A5 1.2GHz    67     295   6798     57    35     23
S5PC110  Cortex-A8 1.0GHz     -     698   1012    166   139     20
Tegra 2  Cortex-A9 1.0GHz    50     243   1219     75    46      -
Tegra 3  Cortex-A9 1.3GHz    38     172   3634     42    35     34
APQ8060  Scorpion 1.5GHz      -     279   1758     43    26     26

単位は実行時間(ms)、数値が小さいほうが速い。

Cortex-A8 のように vfp で遅くなることもなく、vfp/neon 共に高速に
実行できています。

GPU の結果は下記ページに追加しています。

Mobile GPU bench mark


関連エントリ
2012/02/15 Android 4.0 MIPS で RenderScript, ainol Novo 7 Paladin の浮動小数点演算速度
2012/01/14 Android 4.0 RenderScript Compute の速度 その2
2011/11/07 Android 3.x RenderScript (7) RenderScript Compute の速度


Transformer Prime, EeePad TF201 手に入れました。
NVIDIA の新しい Mobile プロセッサ Tegra 3 を搭載しています。
CPU は Cortex-A9 の quad core で GPU は ULP GeForce 12 core 版
となります。

CPU は 4 core 認識しています。Tegra2 と違い NEON あります。

Processor	: ARMv7 Processor rev 9 (v7l)
processor	: 0
BogoMIPS	: 1992.29

processor	: 1
BogoMIPS	: 1992.29

processor	: 2
BogoMIPS	: 1992.29

processor	: 3
BogoMIPS	: 1992.29

Features	: swp half thumb fastmult vfp edsp neon vfpv3 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x2
CPU part	: 0xc09
CPU revision	: 9

GPU の方は Tegra2 と比べて特に機能的な違いがありませんでした。
depth は 16bit のままで depth_texture もありません。

Mobile GPU の機能比較

GL_VERSION: OpenGL ES 2.0 12.01014
GL_RENDERER: NVIDIA Tegra 3
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 1.00

Extension は下記のページに追加しました。

OpenGL ES Extension


● GPU 速度

いつもの pixel 負荷の高い描画テストを走らせてみました。
Tegra2 と比べて 3倍弱といった数値になっています。

(2) light 3 (ambient + directional x2 + point )
-----------------------------------------------------
Tegra 3 / ULP GeForce(12)  15.70fps   EeePad TF201
Tegra 2 / ULP GeForce(8)    5.74fps   ICONIA TAB A500


(3) light 1 (ambient + directional )
-----------------------------------------------------
Tegra 3 / ULP GeForce(12)  30.10fps   EeePad TF201
Tegra 2 / ULP GeForce(8)   12.10fps   ICONIA TAB A500

shader core は Pixel が 2倍らしいので、Mali400 と同じ表現を
使えば MP2 相当です。2倍以上の性能差は動作クロックの違いだと
考えられます。

他の GPU との比較は下記のページにまとめました。

Mobile GPU bench mark

pix/sec の欄を見ると、速度的にはほぼ 3世代目グループである
Mali-400MP4/Adreno220/SGX543MP2 に並んでいることがわかります。

NVIDIA といえば GPU のイメージが強いですが Tegra はむしろ逆です。
優先しているのは CPU の方で、半世代先行した設計で Quad 化を
実現しています。
それに対して GPU は決して突出した性能ではなく、やっとライバルに
並んだところです。

Group3 | Adreno 220, PVR SGX543MP2, Mali-400MP4, ULP GeForce(12,Tegra3)
Group2 | Adreno 205, PVR SGX530/535/540, ULP GeForce(8,Tegra250)
Group1 | Adreno 200, AMD Z430


関連エントリ
OpenGL ES 2.0 Mobile GPU の比較、重いテクスチャ
頂点性能の比較 その2 (OpenGL ES 2.0 Mobile GPU)
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世代) 更新


ARM でも x86 でもない、MIPS の CPU を搭載した
Android 端末 ainol Novo 7 Paladin を使ってみました。

Ingenic JZ4770
CPU core: XBurst (MIPS32)
GPU core: Vivante GC860

CPU/GPU (OpenGL ES Extension 等) は下記に追加

CPU/GPU: Novo7 Paladin Android 4.0 JZ4770 MIPS XBurst GC860

以下抜粋

processor		: MIPS-compatible processor JZ4770 
cpu model		: Ingenic Xburst 
ASEs implemented	: mxu
Features		: fpu mxu dsp lowpower 

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: GC860 core
GL_VENDOR: Vivante Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

下記の GPU 機能比較表にも追加しました

Mobile GPU の比較

GPU は Unified Shader で FragmentShader も highp 対応。
テクスチャ圧縮フォーマットは DXT1/3/5 (S3TC)、
24bit depth に対応しており depth_texture もあります。
Vertex の Stream 入力が若干少なめ。
レンダリングは 2048 までですが使えるテクスチャサイズが
8192 と突出しています。

NDK を使って実際にシェーダーを走らせてみました。
下記のベンチマーク結果の表に追加しています。

Mobile GPU bench mark

公式スペックもフィルレートがあまり高くなかったので、
GC800 の世代的には PVR SGX530/535 あたりと同等なのかもしれません。
より高速な GPU として GC1000/GC2000/GC4000 も存在しています。

Vivante Graphics Processor IP

Freescale i.MX5 系の GPU は AMD Z430 ですが、すでに Qualcomm
に売却されており Adreno と名称が変わっています。
i.MX6 では Vivante の新しい GPU core が採用されるようです。


●MIPS 版 NDK

Google の Android NDK には MIPS が含まれていませんが、
下記の MIPS サイトからダウンロードすることができます。

MIPS Developers: Download MIPS Android NDK

既存の NDK (ARM/x86) をすべて含んでいるため、同バージョンの
NDK と置き換えるだけで mips 対応になります。
例えばすでに C:/android/android-ndk-r7 というフォルダがあるなら

1. c:/android/android-ndk-r7 を削除
1. android-ndk-r7m-windows-20120103.zip を展開
2. android-ndk-r7m を android-ndk-r7 にリネームして C:/android に入れる

これだけです。ARM, x86, MIPS すべてに対応します。

MIPS 対応 NDK では新しく3つのアーキテクチャが追加されます。
倍になりました。既存のものと合わせてまとめると下記の通り。

Android NDK  IA         GCC                              fpu simd
---------------------------------------------------------------------------
armeabi      ARMv5TE    -march=armv5te                   --  --
armeabi-v7a  ARMv7A     -march=armv7-a -mfpu=vfp         VFP (NEON)
x86          IA-32      -march=i686 -mfpmath=sse -msse3  SSE SSE3
mips         MIPS32 R1  -mips32  -mhard-float            FPU --
mips-r2      MIPS32 R2  -mips32r2 -mhard-float           FPU (DSP ASE)
mips-r2-sf   MIPS32 R2  -mips32r2 -msoft-float           --  --

XBurst は ase もあり mips-r2 のように見えますが Paladin は mips でした。
(2012/02/14 追記: NDK では mips ですが ROM は mips-r2 で build されているそうです)
NDK の Application.mk 等に下記のように記述すれば全対応になります。

APP_ABI	:= armeabi armeabi-v7a x86 mips mips-r2 mips-r2-sf

バイナリ容量はかなり増えそうです。
RenderScript はまだ試していません。

(2012/02/14 追記: NDK r7 からは 「APP_ABI := all」と記述するだけで全対応になります。)

(2012/04/17 追記: NDK r7bm から mips-r2, mips-r2-sf が無くなりました)



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 のスコア比較


前回は浮動小数点演算のみでした。
Cortex-A15 で他のテストも走らせてみました。

CPU benchmark

前回の浮動小数点演算では Cortex-A15 が最も良い結果となりました。
単体のピーク性能は Swift/Krait と同一ですが、
64bit 2 pipe のおかげか演算効率が高くなっている印象でした。

                                  time(sec)  MB/sec  MBPS/GHz
-------------------------------------------------------------
Exynos 5D  Cortex-A15 1.7GHz  x2   1.49      72.61    42.71
A6X        Swift      1.4GHz? x2   1.75	     61.82    44.16?
APQ8064    Krait      1.5GHz  x4   2.28      47.64    31.82

single thread の core 単体の比較です。

今回のテストには NEON や浮動小数点演算は含まれていません。
この場合同一クロック時の実行性能はだいたい Swift に並ぶようです。
A6X よりも Exynos 5 Dual の方が動作クロックが高いために、
リストの中では Nexus 10 が最も良い成績となっています。

Krait は唯一の 4 core なので絶対的な速度では優っていますが
単体ではあまり伸びていません。
浮動小数点演算では成績が良かったのですが、こちらのテストでは
他の CPU に差を付けられている形となっています。

そのうち Tegra4/Exynos 5 Octa など Cortex-A15 の Quad core が出るので
システム全体のパフォーマンスとしてかなり良い成績となりそうです。
Atom では比較にならないので、Core i はともかく他の CPU と比べたくなるのも
わかる気がします。


関連エントリ
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
iPad 4/iPad mini A6X/A5 の CPU/GPU 速度
benchmark 関連


iPad2 を iOS5 にアップデートしたら 3D の描画性能が大幅に向上しました。
テスト内容は前回までと同じです。

iPad2 ( A5 : PowerVR SGX543MP2 )

(1) light 3 + shadow map
------------------------------------
iOS 5    15.81 fps      13.0Mpix/sec
iOS 4    11.83 fps      12.4Mpix/sec


(2) light 3
------------------------------------
iOS 5    20.67 fps      16.3Mpix/sec
iOS 4    15.27 fps      12.0Mpix/sec


(3) light 1
------------------------------------
iOS 5    57.04 fps      44.9Mpix/sec
iOS 4    45.49 fps      35.8Mpix/sec

iOS5 では 15fps → 20fps 、 45fps → 57fps とスコアが伸びています。

iOS5 ではドライバレベルで大きく手が加えられているようです。

まず OpenGL が返す Extension List が増えています。
Extension の中身は下記のページに追加しました。

Mobile CPU/GPU の詳細 OpenGL Extension など

さらにレンダリング可能な解像度と最大テクスチャサイズも 2048 から 4096 へと
拡張されました。

iOS4 までは互換性重視なのか PowerVR SGX535 と全く同じ値を返していました。
iOS5 でやっと PowerVR SGX543MP 本来の能力を引き出せるようになったのかもしれません。

速度に大きな差があることから、シェーダーコンパイラの最適化がより進んだ
可能性があります。

残念ながら PowerVR SGX535 搭載の iPod tpuch3/4 では iOS5 に更新しても
速度は変わりませんでした。


今までのテスト結果を下記のページにまとめました。

Mobile GPU 速度比較のまとめ

シェーダー負荷が小さいケースではおそらく PowerVR SGX543MP2 の圧勝です。
重いシェーダーでは Mali-400MP, Adreno 220 に届きませんが差は縮まっています。
やはりこの 3 GPU が現段階での最速候補のようです。


関連エントリ
さらに OpenGL ES 2.0 Mobile GPU の速度比較
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
Android HTC EVO 3D GPU Adreno 220 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


下記 CPU ベンチ の結果を更新しました。
この結果だけを見れば iPhone 5 (A6) より約 1.8倍速く、
iPhone 5s は Core2 duo の 1.74GHz 相当となっています。

CPU ベンチ

以下抜粋 (詳細は上記ページを参照してください)

CPU            arch           GHz  time     MB/sec   1GHzあたり
--------------------------------------------------------------
Apple A7 CPU   ARMv8 (arm64)  1.3  1.04s  104.27MB/s   80.21MB
Apple A7 CPU   ARMv8 (armv7s) 1.3  1.16s   93.04MB/s   71.57MB
Cortex-A15     ARMv7A         1.7  1.49s   72.61MB/s   42.71MB
A6 swift       ARMv7A(armv7s) 1.3  1.87s   57.96MB/s   44.58MB
Krait          ARMv7A         1.5  2.28s   47.64MB/s   31.82MB
A5 Cortex-A9   ARMv7A(armv7)  0.8  5.78s   18.76MB/s   23.44MB

Core i7 3930K  x64 (Win+VC)   3.2  0.48s  228.05MB/s   71.26MB
Core i7 3930K  x86 (Win+VC)   3.2  0.50s  216.50MB/s   67.66MB
Core2 duo x64  x64 (Win+VC)   2.4  0.75s  143.56MB/s   59.81MB
Core2 duo x86  x86 (Win+VC)   2.4  0.85s  127.99MB/s   53.33MB
Atom N270      x86 (Win+VC)   1.6  4.21s   25.74MB/s   16.09MB

 ・「MB/sec」が大きいほうが高速
 ・「1GHzあたり」は同一 CPU クロックでの比較

前回のテストと異なり浮動小数点演算を含んでいません。
それでもやはり 32bit (AArch32) よりも 64bit (AArch64) の方が速くなっており、
公称値である "A6 の 2倍" に近い結果が得られました。

クロック差があるにも関わらず Core2 時代の PC と比較できる域に達しており、
少々信じられませんが clock あたりの実行効率は Core i クラスとなっています。

ただしリンク先にも書いていますが、結果にはコンパイラの性能差や実行環境の
違いも含まれている点に注意してください。
x86/x64 は VC より clang の方が高いスコアになっているので、
実際にはもう少し差が広がるものと考えられます。

またこのスコアはベンチマーク用のものです。
ARMv8 には x86/x64 と同じように AES 専用命令が搭載されていますので、
実用レベルではもっと桁違いに高速に実行できます。

ARMv8 の AES 命令を使った場合のベンチマークスコアはまだ計測できておりません。
余裕があればもう少し幅広くテストしてみたいと思います。


関連エントリ
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
iPad 4/iPad mini A6X/A5 の CPU/GPU 速度
iPhone 5 / A6 の CPU 速度 その 3
benchmark 関連
CPU benchmark


HONEY BEE 101K は Renesas SH-Mobile APE5R を搭載した
Android スマートフォンです。
CPU Core は ARM Cortex-A9 1.2GHz の dual、
GPU core は PowerVR SGX543MP2 と意外なほどパワフルです。

KYOCERA HONEY BEE 101K

GPU である PowerVR SGX543MP2 は iPhone 4S/iPad2 に使われており、
4core 版 SGX543MP4 は iPad 3 や PS Vita で有名です。

ところが Android ではほとんど見かけることがありませんでした。
触る機会があったので試してみました。

CPU info/GPU Caps/Extension 等

Android なので PVRTC だけでなく ETC1 もサポートされています。
テクスチャサイズが 4096 になっただけで、Extension 等それ以外の
機能は PowerVR SGX540 とほとんど同じです。
GL_EXT_shadow_samplers も無く iOS 5 になる前の iPad2 に
似ているかもしれません。

GPU ベンチマーク

速度はそこそこですが走らせるにあたりいくつか問題がありました。

(1) GL_OUT_OF_MEMORY が出やすい

glDrawElements() で GL_OUT_OF_MEMORY が発生することがあります。
CPU info/GPU Caps/Extension 等」のページに meminfo の値も追加してみました。
比べてみると GPU に割り当てられていると思われる領域が
101K の場合少ないようです。
ただしこれが本当に GPU memory に影響しているのか、
また GL_OUT_OF_MEMORY の原因なのかどうかはわかりません。

                        OS    RAM     MemTotal  (RAM-MemTotal)
--------------------------------------------------------------
ZEN Touch2              2.1   256MB   185.2MB     70.8MB
ZiiO 7                  2.1   512MB   408.3MB    103.7MB
LuvPad AD100            2.2   512MB   438.3MB     73.7MB
Desire X06HT            2.2   576MB   415.2MB    160.1MB
Galaxy S SC-02B         2.2   512MB   302.1MB    209.9MB
Xperial arc SO-01C      2.3   512MB   335.4MB    176.6MB
Xperial ray SO-03C      2.3   512MB   335.4MB    176.6MB
HONEY BEE 101K          2.3   512MB   478.1MB     33.9MB
Novo7 Paladin           4.0   512MB   334.9MB    177.0MB
SXZ-PD10                4.0   512MB   368.3MB    143.7MB
EVO 3D ISW12HT          2.3  1024MB   808.1MB    215.9MB
Galaxy S2 SC-02C        2.3  1024MB   836.9MB    187.1MB
Galaxy Nexus SC-04D     4.0  1024MB   631.2MB    392.8MB
Optimus Pad L-06C       3.1  1024MB   662.3MB    361.7MB
Galaxy Tab 10.1 SC-01D  3.2  1024MB   756.7MB    267.3MB
EeePad TF201            4.0  1024MB   983.2MB     40.8MB (*1)

*1: DirectMap4k/DirectMap2M

例えば Tegra3 である TF201 も少なくなっています。
その代わり他のデバイスには存在しない DirectMap4k/DirectMap2M という
エントリが存在しており、おそらく他のデバイスとは異なる方法で
GPU メモリを管理していると考えられます。


(2) 3D 描画しているのに CPU clock が低下する

画面を操作している間だけ描画フレームレートが上昇することに
気が付きました。
CPU clock をモニタリングしてみると、ベンチマークの 3D 描画中も
300MHz 程度まで clock が下がっているようです。
画面を連打していると 1.2GHz 近くまで上がるため、ユーザー操作が
ない場合は描画負荷が高くても cpu を寝かせる仕様なのかもしれません。


ハイエンド機ではないので当然かもしれませんが、RAM も少な目で
GPU をあまり活かしきれていないのが少々残念でした。


ARMv8 の AES 命令を使ってみたので下記 CPU ベンチを更新しました。

CPU ベンチ

以下抜粋

CPU            arch           GHz  time      MB/sec   1GHzあたり
---------------------------------------------------------------
Apple A7 CPU   ARMv8 + AES    1.3  0.13s   837.54MB/s  644.26MB
Apple A7 CPU   ARMv8 (arm64)  1.3  1.04s   104.27MB/s   80.21MB
Apple A7 CPU   ARMv7          1.3  1.16s    93.04MB/s   71.57MB
Cortex-A15     ARMv7          1.7  1.49s    72.61MB/s   42.71MB
A6 swift       ARMv7          1.3  1.87s    57.96MB/s   44.58MB
Krait          ARMv7          1.5  2.28s    47.64MB/s   31.82MB
A5 Cortex-A9   ARMv7          0.8  5.78s    18.76MB/s   23.44MB

Core i7 3930K  x64 + AES-NI   3.2  0.05s  2299.54MB/s  718.61MB
Core i7 3930K  x86 + AES-NI   3.2  0.06s  1682.35MB/s  525.74MB
Core i7 2600S  x64 + AES-NI   2.8  0.05s  2113.03MB/s  754.66MB
Core i7 2600S  x86 + AES-NI   2.8  0.06s  1683.66MB/s  601.31MB
Core i7 620M   x64 + AES-NI   2.7  0.08s  1410.61MB/s  528.32MB
Core i7 620M   x86 + AES-NI   2.7  0.10s  1064.06MB/s  398.53MB
Core i7 3930K  x64            3.2  0.48s   228.05MB/s   71.26MB
Core i7 3930K  x86            3.2  0.50s   216.50MB/s   67.66MB
Core2 duo x64  x64            2.4  0.75s   143.56MB/s   59.81MB
Core2 duo x86  x86            2.4  0.85s   127.99MB/s   53.33MB
Atom N270      x86            1.6  4.21s    25.74MB/s   16.09MB

 ・「MB/sec」が大きいほうが高速
 ・「1GHzあたり」は同一 CPU クロックでの比較

A7 ARMv8 + AES を使うことで、命令未使用時のおよそ 8倍、
ARMv7 (32bit) 時の 9倍高速に実行できています。

ただし AES-NI 共にコンパイラの intrinsic (builtin) を並べてるだけなので、
実際にはもっと最適化できる可能性があります。

Intel の AES-NI は非常にシンプルで、1 round 毎に 1命令、
最終 round のみ別命令が割り当てられていました。

ARMv8 の場合は AddRoundKey, SubBytes, ShiftRows と
MixColumns が分かれています。
並べる命令数は増えますが、この組み合わせで最終 round も表現できるので
専用命令が要りません。
また AES-NI とは xor(eor) の位置がちょうど 1つずれる形になります。


関連エントリ
iPhone 5s A7 CPU の速度比較 arm64 (ARMv8 AArch64)
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
iPad 4/iPad mini A6X/A5 の CPU/GPU 速度
iPhone 5 / A6 の CPU 速度 その 3
benchmark 関連


oga at 02:26
Mobile Device はここ数年かなりの速度で向上しており勢いが衰えていません。
GPU, CPU ともに今までテストしてきたとおり、PC や専用機に匹敵する能力を
有するようになって来ました。


●個性が偏るモバイルプロセッサ

PC と同じように端末の性能には大きな開きがあります。

現時点で入手可能な最速の CPU は Snapdragon APQ8064 (Krait Quad core) Snapdragon 600 APQ8064T (Krait 300 Quad core) でしょう。
明日 2013/04/04 には 1.7GHz の Optimus G Pro L-04E が発売予定となっています。

日本で発売されたスマートフォン、Tablet 等の全リスト

今すぐ手に入る端末の GPU では間違いなく iPad4 の A6X が最速です。

Mobile GPU bench mark

PowerVR SGX500~ の型番を持つ GPU は数多く存在しますが、
大きく分けて 2種類あります。

PowerVR Series 5        SGX530, SGX535, SGX540
PowerVR Series 5XT      SGX543MP, SGX544MP, SGX554MP

型番が似ているのでややこしいですが、この両者は PVRTC2, ShadowSampler,
演算精度, MultiCore など機能的な違いもあります。
その中でも最上位 SGX554MP4 を搭載しているのは iPad4 の A6X だけです。


このようにハイエンドの端末といってもそれぞれ何を重視するかによって評価が変わります。
Apple は GPU を最優先しており、その反面 CPU で Quad core の端末はまだ存在していません。

方向性で真逆なのが NVIDIA Tegra です。
率先して Dual core, Quad core の Tegra2/3 を展開してきたものの
トレードオフとして GPU 機能が弱く、描画性能も芳しくありません。

よって、性能差だけでなく性格付けでも特性がバラバラなのがこれまでの
モバイルデバイスの特徴でした。

 ・トレードオフがあるため一部分だけ秀でている
 ・メーカー毎に強化している分野が異なる

ただし次の世代ではこれらのアンバランスさがかなり解消されると考えられます。



●世代交代

他社に先駆けて GPU/CPU ともに世代交代を果たした Qualcomm では、
特別突出した点はないものの平均的に全体の性能が高くなっています。

また今後登場予定の Tegra4 は CPU core が刷新されるだけでなく、
ようやく NVIDIA らしい GPU へと強化が行われるようです。

4gamer: [GDC 2013]タッチパネルは対応しなくていい? Androidの掟破りが連発された「Project SHIELD」向けゲーム開発指南

Tegra2/3 の GPU である ULP GeForce は Shader Unit が discrete で
あることから GeForce6800/7800 世代と言われていましたが、
機能的には大幅に削られたものでした。

例えば GeForce の特徴的な機能だった NVIDIA ShadowMap (PCF) が
Tegra2/3 には搭載されていません。
それどころか今まで試した GPU の中では、Tegra2/3 だけが 24bit depth
や depth_texture に未対応でした。
他社の GPU 、Adreno, PowerVR, Mali, Vivante はみなこれらの Extension
に対応しているにもかかわらずです。

上記サイトのスライド写真を見ると Tegra4 でようやく機能差が解消されており、
かつ Hardware PCF が搭載されるなど、期待した GeForce 6800/7800 クラスの
GPU となるようです。

ざっくりと 4 pixel pipe なので能力的にはおそらく無印 GeForce 6800 くらい
ではないでしょうか。
pixel rate は PS3/Xbox360 世代の半分ですが、メモリ帯域からも納得できる数値です。

Xbox360  22.4GB/s (+32.0GB/s)
PS3      22.4GB/s (+25.6GB/s)
Tegra4   14.9GB/s

もちろん予想に過ぎないので、実際に手に入れてみるまでは本当の性能はわかりません。

CPU/GPU 共に世代交代によって、一点集中型から平均的な性能向上に向かうと
考えられます。極端な個性付けはおそらく減っていくのではないでしょうか。



●コンソールとの比較

Xbox1/GC 時代のコンソールは確実に超えています。
まず CPU の速度が桁違いで、GPU 性能もシェーダーなどはるかに高機能です。
ただしフィルレートに特化した PS2 の特殊なハードウエアは正しく比べることができません。

またモバイルデバイスに要求される解像度はコンソールよりも高いので、
その点も考慮する必要があります。

          mem B/W                CPU          RAM    screen
---------------------------------------------------------------
GC        2.6GB/s (+?)           0.5GHz x1    24MB   SD 480
PS2       3.2GB/s (+48.0GB/s)    0.3GHz x1    32MB   SD 480
Xbox1     6.4GB/s                0.8GHz x1    64MB   SD 480
Xbox360  22.4GB/s (+32.0GB/s)    3.2GHz x3   512MB   HD 720
PS3      22.4GB/s (+25.6GB/s)    3.2GHz x7   512MB   HD 720
PS4     176.0GB/s                ?.?GHz x8     8GB   HD 1080

Tegra3    6.0GB/s                1.7GHz x4  1~2GB
APQ8064   8.5GB/s                1.7GHz x4           HD 1080
A5X      12.8GB/s                1.0GHz x2     1GB   HD 1536
Tegra4   14.9GB/s                1.9GHz x4
A6X      17.0GB/s                1.?GHz x2     1GB   HD 1536

誰が見ても明らかな点としては RAM 容量があります。
スマートフォンもタブレットも 1GB~2GB の RAM 容量が当たり前となっており、
この点では現行コンソールよりも余裕があります。



●実デバイスでの CPU の速度

実在のデバイスでの性能比較
(実測ではなくスペックからの算出値なので注意)

                             CPU           Clock  DMIPS/clock  DMIPS*core
-------------------------------------------------------------------------
Nexus 10            Exynos 5 Cortex-A15 x2  1.7GHz   3.5          11.90
ARROWS X F-02E      Tegra3   Cortex-A9  x4  1.7GHz   2.5          17.00
Optimus G Pro L-04E APQ8064T Krait 300  x4  1.7GHz   3.3          22.44

Xbox360             Xenon    PPC core   x3  3.2GHz   2.0~(3.2)   19.20~(30.72)

・DMIPS*core が総合性能(目安)で数値が大きい方が速い

CPU core が異なっていると比較が難しいためあくまで目安として見てください。
DMIPS/clock は同一 clock で比較した core 単体の能力で、
これを clock*core 倍したものが DMIPS*core となっています。

Xbox360 の DMIPS/clock はWikipedia Instructions per second を元にしています。
ただし同一性能のはずの PS3 PPE が 3.2 なので、Xbox360 の実際のスコアは
もっと高い可能性があります。(括弧内の数値は 3.2 を元にした場合)
PS3 の Cell は特殊で簡単に比較することができません。

CPU core list

今後登場するであろう Exynos 5 Octa (Cortex-A15 x4) や Tegra4 (Cortex-A15 x4)
のスコアを予想すると下記の通りです。

                             CPU           Clock  DMIPS/clock  DMIPS*core
-------------------------------------------------------------------------
Exynos 5 Octa                Cortex-A15 x4  1.6GHz   3.5          22.40
Tegra4                       Cortex-A15 x4  1.9GHz   3.5          26.60

あまり厳密な比較ではないかもしれませんが、CPU 能力で現行コンソールに
匹敵するレベルに達しつつあることは事実です。

ただし、単精度の浮動小数点演算能力では敵いません。

          CPU                fp-op/core   core   clock    GFLOPS
----------------------------------------------------------------
Xbox360   Xenon PPC            12         3      3.2GHz   115.2
PS3       Cell BE              12+8       1+7    3.2GHz   217.6
          Tegra3 Cortex-A9     4          4      1.7GHz    27.2
          APQ8064 Krait        8          4      1.7GHz    54.4
          Tegra4 Cortex-A15    8          4      1.9GHz    60.8

・GFLOPS が大きいほうが速い。
・理論値なのでこの通りの性能が出るわけではありません。

特に Cell は圧倒的で、フィルレートの怪物だった PS2 と同じように、
一部分(浮動小数点演算能力)において突出した能力を持っています。

予想では多分 PS4 でも CPU 単体の浮動小数点演算能力においては Cell に
届かないのではないかと思います。
その代わり GPU にストリーム処理を任せられるので、
GPU を補っていた Cell とは逆の立場になります。



●GPU の速度

・Mobile Device は非常に解像度が高い
・GPU の構造が異なっている
・Tegra は演算精度が違う
・機能面は同等

Smartphone でも Full HD、Tablet だと 2048x1536 や 2560x1600 など
かなりの高解像度になりつつあります。
メモリ帯域も Shader サイクルも多くがピクセルに費やされます。
そのためたとえ GPU 性能が高くなっても相対的にはパワー不足に陥ります。


大半の GPU が TileBased となっており、Desktop GPU と構造が異なっています。
特に PowerVR は何もしなくても HW で Deferred Rendering を行うので、
ソフトウエアであまり凝ったことをすると逆効果となる可能性があります。

例えば Early Z Culling を効果的に使うには手前から描画しますが、
ピクセル単位でフラグメントが除去される TBDR では不要です。
またポストエフェクトのようにフレームバッファを再利用すると追加コストが
発生する可能性があります。
この辺りを意識して作られていない場合、ただ移植しただけでは
Mobile GPU ではあまり性能が出ないかもしれません。

その点 Tegra は Immediate Mode なので Desktop GPU と同じ考え方が通用します。
実際にテストしたわけではないので憶測ですが、上にも書いたとおり
およそ Tegra4 で現行 console の半分くらいではないかと思われます。

ただし Tegra シリーズの PixelShader は演算精度が mediump です。
精度が必要なシェーダーは動かない可能性がありますし、
HW Shadow Sampler の対応は必然だったのかもしれません。
また mediump を基準とするなら PowerVR もパフォーマンスが上がるので、
fp32 の GPU との単純な FLOPS 比較は無理があるように思います。


なお Qualcomm の Adreno は PixelShader の演算精度も GPU 機能も
コンソールと比べて遜色ありません。

・シェーダーや Extension 等、GPU 機能は現行コンソールと完全に同等
・描画速度では根拠となるデータが乏しい (が、おそらく負けてる)



●まとめ

結論としては、内部構造を熟知しているわけでも実測したわけでもないので根拠が
無いですが、GPU 性能やゲームで重要な単精度の浮動小数点演算性能でも
Xbox360/PS3 の方が上でしょう。
さらに高解像度であることやバス帯域の限界もあり、実アプリケーションでは
GPU 性能以上に隔たりが生じているのが現状ではないかと思います。
ただし性能の上昇は急激で、時間の問題であることは確かです。
特に RAM 容量では勝り、CPU の実行性能も差が無くなりつつあります。



関連ページ
SoC list
Mobile GPU/CPU 関連の情報まとめ

関連エントリ
PlayStation 4


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 速度に関連するエントリ


ARM Cortex-A7 は big.LITTLE で用いられる場合、省電力側の CPU core に相当します。
消費電力が少ない代わりに、高性能側の CPU core より性能は劣ります。
VFP Benchmark の結果を送ってもらいました。

結果を見ると、Cortex-A7 の NEON は 32bit 単位で実行していることがわかります。
演算速度は NEON 無しの CPU と変わらないのですが、Cortex-A15 のペアとして
機能できるよう NEON 命令セットに対応しているものと考えられます。

SIMD (Vector)         SIMD4 single fp (32bit x4)
CPU                   mul    add     mad     fma
------------------------------------------------------
ARM Cortex-A7         1      1       2       2
ARM Cortex-A8         2      2       4       –
ARM Cortex-A9         2      2       4       –
ARM Cortex-A15        4      4       8       8
Qualcomm Scorpion     4      4       8       –
Qualcomm Krait 400    4      4       8       8
Apple A6 Swift        4      4       8       8
Apple A7 Cyclone 32   8      12      16      16
Apple A7 Cyclone 64   8      12      –       16

  * 数値は 1 cycle あたりの演算数、大きい方が速い

FPU の演算能力 (上記以外の結果はこちら)

big.LITTLE で用いる場合は、この手の演算は Cortex-A15 の担当なので
おそらく表に出ることは無いでしょう。
単独で用いられている場合は、同じ Quad core CPU と書かれていても
かなり性能差が開いていることを考慮した方が良いかもしれません。
浮動小数点演算速度だけ見てもピーク演算速度で Cortex-A9 の半分、
Krait/Cortex-A15 の 1/4 (同一クロック時) となっています。

以下詳細

Lenovo YOGA TABLET 8 (3G)
MediaTek MT8389 1.2GHz Cortex-A7 Quad core

SingleT SP max: 2.374 GFLOPS
SingleT DP max: 1.165 GFLOPS
MultiT  SP max: 9.474 GFLOPS
MultiT  DP max: 4.653 GFLOPS

* VFP/NEON (single fp)
VFP fmuls (32bit x1) n8       :    3.634     1100.7     1100.7
VFP fadds (32bit x1) n8       :    3.450     1159.3     1159.3
VFP fmacs (32bit x1) n8       :    3.451     2318.1     2318.1
VFP vfma.f32 (32bit x1) n8    :    3.448     2319.9     2319.9
NEON vmul.f32 (32bit x2) n8   :    6.795     1177.3     1177.3
NEON vadd.f32 (32bit x2) n8   :    6.828     1171.7     1171.7
NEON vmla.f32 (32bit x2) n8   :    6.810     2349.6     2349.6
NEON vfma.f32 (32bit x2) n8   :    6.797     2354.1     2354.1
NEON vmul.f32 (32bit x4) n8   :   13.529     1182.7     1182.7
NEON vadd.f32 (32bit x4) n8   :   13.511     1184.2     1184.2
NEON vmla.f32 (32bit x4) n8   :   13.498     2370.7     2370.7
NEON vfma.f32 (32bit x4) n8   :   13.549     2361.8     2361.8

倍精度の場合はさらに差が広がっており、加算は 1 cycle で実行できますが乗算は 4 倍低速です。
さらに fmacd (積和) は乗算と同等の速度で演算しているものの、
vfma (FMA) は並列化されておらず 5倍 (1 add + 4 mul cycle) かかっているようです。

* VFP/NEON (double fp)
VFP fmuld (64bit x1) n8       :   13.628      293.5      293.5
VFP faddd (64bit x1) n8       :    3.439     1163.0     1163.0
VFP fmacd (64bit x1) n8       :   13.508      592.2      592.2
VFP vfma.f64 (64bit x1) n8    :   16.895      473.5      473.5
VFP fmuld (64bit x1) ns4      :   13.434      297.8      297.8
VFP faddd (64bit x1) ns4      :    3.435     1164.6     1164.6
VFP fmacd (64bit x1) ns4      :   13.430      595.7      595.7
VFP vfma.f64 (64bit x1) ns4   :   16.823      475.5      475.5
VFP fmuld (64bit x1) n1       :   13.439      297.6      297.6
VFP faddd (64bit x1) n1       :    3.447     1160.6     1160.6
VFP fmacd (64bit x1) n1       :   26.856      297.9      297.9
VFP vfma.f64 (64bit x1) n1    :   26.860      297.8      297.8


関連エントリ
VFP Benchmark v1.1 浮動小数点演算命令の速度 (NEON/SSE/AVX)
ARM CPU の VFP Benchmark アプリ 浮動小数点演算速度の計測
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
Qualcomm APQ8064 GPU Adreno 320 の速度
benchmark 関連


iPad Air 2 (A8X) の浮動小数点演算能力を調べてみました。
より詳細なログは下記ページに乗せています。

VFP Benchmark Log

// iPad 2 Air (Apple A8X)

ARCH: ARMv8A
VFP: AArch64 NEON
SingleT SP max:  23.568 GFLOPS
SingleT DP max:  11.751 GFLOPS
MultiT  SP max:  68.591 GFLOPS
MultiT  DP max:  33.968 GFLOPS
CPU core: 3
FMA: Yes
NEON: Yes

↑本当に CPU が 3 core でした。
モバイルデバイスではあまり見かけませんが Xbox360 や Wii U など
ゲーム機に多い印象です。

もともと Cyclone は Apple A7 でも浮動小数点演算能力が突出していた CPU
でしたが、A8X でもほぼ同様の傾向が出ています。
浮動小数点演算命令はスカラーベクター共に 2 命令同時に実行可能で、
NEON の 128bit 積和も並列に走ります。
動作クロックは低いものの、3 core になったことで他の ARM Core の
4 core に匹敵する数値となってます。(下記表の (*1) )

	      Apple A8X   Snapdragon 800   Tegra K1    Atom Z3745
               Cyclone      Krait 400     Cortex-A15   Silvermont
	      1.5GHz x3     2.2GHz x4     2.2GHz x4    1.83GHz x4
------------------------------------------------------------------
SingleT SP      23.568       17.128        17.136        8.946
SingleT DP      11.751        4.289         3.431        2.797
MultiT  SP(*1)  68.591       67.539        70.174       35.473
MultiT  DP      33.968       16.874        14.036       11.060

 * 数値は GFLOPS 、値が大きい方が速い
 * 倍精度 (DP) で大きく差が付いているのは ARMv7A (32bit) に NEON が無いため
 * ピーク値なので実際のアプリケーション動作速度とは異なります

さらに命令毎のログを詳しく見ていくと、A7 で何故か遅かった
倍精度演算のスカラー積和が改善されていることがわかります。

// iPhone 5s (Apple A7)
倍精度演算
                             実行時間 演算数   演算数
---------------------------------------------------------------
FPU fmul (64bit x1) n8      :  1.642   2436.1   2436.1
FPU fadd (64bit x1) n8      :  1.045   3827.0   3827.0
FPU fmadd (64bit x1) n8     :  3.915   2043.6   2043.6 --- (A-7)
NEON fmul.2d (64bit x2) n8  :  1.567   5105.1   5105.1
NEON fadd.2d (64bit x2) n8  :  1.034   7736.5   7736.5
NEON fmla.2d (64bit x2) n8  :  1.958   8172.1   8172.1 --- (B-7)

↑ Apple A7 では、FPU fmadd の積和 (A-7) だけ 3.915 と実行時間が
余計にかかっていました。
同じ積和でも NEON fmla はそこまでの落ち込みはなく、
(B-7) 見てわかるようにむしろスカラーよりも高速に実行できています。

// iPad Air 2 (Apple A8X)
倍精度演算
                             実行時間 演算数   演算数
---------------------------------------------------------------
VFP fmul (64bit x1) n8      :  1.442   2773.8   2773.8
VFP fadd (64bit x1) n8      :  0.926   4321.2   4321.2
VFP fmadd (64bit x1) n8     :  1.772   4513.6   4513.6 --- (A-8)
NEON fmul.2d (64bit x2) n8  :  1.408   5681.0   5681.0
NEON fadd.2d (64bit x2) n8  :  0.922   8680.2   8680.2
NEON fmla.2d (64bit x2) n8  :  1.744   9175.5   9175.5 --- (B-8)

↑ Apple A8X ではスカラーの倍精度積和 (A-8) も NEON (B-8) と変わらない
速度で実行できており、Apple A7 の弱点が克服されていることになります。

この辺りの演算能力の違いをまとめたのが下記ページの表です。

CPU の浮動小数点演算能力の詳細


関連エントリ
Android x86 Binary Translator を試してみる
Atom Bay Trail の浮動小数点演算能力
VFP Benchmark v1.1 浮動小数点演算命令の速度 (NEON/SSE/AVX)
ARM CPU の VFP Benchmark アプリ 浮動小数点演算速度の計測
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
Qualcomm APQ8064 GPU Adreno 320 の速度
Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力
ARM Cortex-A8 の NEON と浮動小数演算最適化
benchmark 関連


前回までのテストはピクセル性能に左右されていたため、ほぼ頂点だけの
描画を行ってみました。

GPU           Processor    Sh Unit   OS    display    fps   tri/sec
--------------------------------------------------------------------------
Mali-400MP    Exynos 4210  discrete  A2.3  480x800    9.21  10.3M (1031万)
Adreno 220    MSM8660      unified   A2.3  540x960   29.50  33.0M (3303万)
ULP GeForce   Tegra 250    discrete  A3.1  800x1232  20.85  23.3M (2334万)
PVR SGX543MP2 A5           unified   i5.0  768x1024  56.10  62.8M (6281万)

50880 ポリゴン(25919頂点) の球のモデルを 22個表示しています。
シーン内合計 1119360ポリゴン。

Fragment Shader はライティングなし、テクスチャなし、描画面積を減らすため
中央に小さく表示。
頂点フォーマットは float x 3 の座標値のみ。(stride = 12byte)
Vertex Shader は vec4 * mat4 だけの単純なものです。

球のモデルデータなので共有頂点が多く、Vertex Cache が有効な GPU にとっては
理想的なデータです。
頂点数は 25919 なので、もし仮に V-Cache が完全に hit したと考えると
1ポリゴンあたり 1頂点未満で描画できる計算になります。
実際にシミュレートしてみると 66% hit、つまり strip 変換相当でした。

ただしテストした GPU にどれだけ V-Cache が搭載されているか判明していません。
Strip 変換していないため、もし V-Cache 無しの GPU の場合は本来の能力を
発揮できていないことになります。
この場合はおそらくピーク性能の 1/3 程度の結果になっていると考えられます。

また GPU の Shader Unit の構造に注意してください。
GPU が Unified Shader の場合はおそらく突出した数値が出ていますが現実的
ではありません。
本来 Fragment Shader として機能する分の演算能力の多くが頂点に割り振られて
いると考えられるからです。
一般的な描画のシーンではピクセルの面積分だけ頂点性能が削られます。


● Mali-400MP

描画面積の多いシーンでは最強だった Mali-400MP の意外な弱点が判明しました。
Mali-400MP の構成を見ると、
Vertex Processor x 1 + Fragment Processor x 1~4
という構造になっているようです。MP4 なら Fragment Processor x4 です。
頂点 Unit 自体の個数は変化しません。

頂点性能をそこまで求めない代わりにピクセル性能が高く、比較的長い
Fragment Shader を走らせても動作効率が落ちませんでした。
このことから、ピクセル性能重視型 GPU として設計してあるようです。

おそらく Fragment Shader で様々なテクニックを駆使して絵作りを行うべき
GPU だと言えるでしょう。(ただし mediump のみ)

スマートフォンやタブレットなど、GPU 性能の向上よりも速いペースで解像度が
増加したため、用途として非常にバランスが良かったのだと思われます。

こちらによればピーク値 30M tri/s だそうです。


● Tegra 250

Mali とは逆に予想以上の数値を出したのが Tegra2 です。
Mali 同様 discrete タイプで「後藤弘茂のWeekly海外ニュース」によると
Shader の core は Vertex 4unit、Pixel 4unit とのこと。

おそらく Fragment Shader のシェーディングで工夫するよりもハイポリゴンに
した方が綺麗な絵が出せる GPU だといえます。

次の Kal-El (Tegra3) は Vertex unit そのままで Pixel Unit が 2倍になる
らしいので、弱点を補う意味でも理にかなった拡張です。


● Adreno 220

Unified Shader なのでこの値は控えめに見積もってください。
他の GPU が比較的一点集中型で、得意な項目と苦手な点がはっきりしている
のに対して、どのテストでもそつなく高い数値を出す傾向があります。

ピークが突出していない代わりに速度が落ちにくいバランスとなっているようです。
唯一 Vertex Texture が使えたり、Pixel 演算も highp で高精度だったりと
機能面でも手を抜いておらず、たいへん扱いやすい GPU です。


● PVR SGX543MP2

ピクセル負荷が減ると極端に速度が向上する特性を示していましたが、
頂点数が増えてもその傾向は変わらないようです。
Unified Shader なので通常利用時の性能ではありませんが、潜在能力が
高いのは間違いありません。

ピーキーな特性で、特に Fragment Shader の最適化は僅かな修正でも大きな
違いとなって現れます。
頂点とピクセルのバランス取りなど、使いこなしはまさに利用者の腕次第と言った
感じです。


今回のテスト結果を下記のページに追加しました。

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 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


最適な頂点形式を割り出すため 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 の速度


今まで ARM CPU の浮動小数点演算速度について調べてきましたが、
その計測プログラムをアプリにしてみました。

VFP Benchmark (Android)

今までの測定結果のまとめは下記の通り。

ARM CPU core 毎の浮動小数点演算速度の比較 (VFP/NEON)

VFP Benchmark アプリの表示結果は上記の表と互換性があります。
さらに FLOPS 表示、倍精度浮動小数点演算の計測、マルチスレッド実行に
対応しました。
下記は幾つかの端末の結果(一部)です。

MSN8974 Krait 400 2.2GHz x4 quad
---------------------------------------
SingleT SP max : 16.619 GFLOPS
MultiT  SP max : 67.185 GFLOPS (理論値: 70.4 GFLOPS)
                               = 2(mad) x 4(simd) x 4(core) x 2.2(clock)


Tegra4 Cortex-A15 1.8GHz x4 quad
---------------------------------------
SingleT SP max: 13.371 GFLOPS
MultiT  SP max: 51.345 GFLOPS  (理論値: 57.6 GFLOPS)
                        = 2(mad) x 2(simd) x 2(unit) x 4(core) x 1.8(clock)


APQ8064 Krait 1.5GHz x4 quad
---------------------------------------
SingleT SP max: 11.947 GFLOPS
MultiT  SP max: 47.808 GFLOPS  (理論値: 48.0 GFLOPS)
                               = 2(mad) x 4(simd) x 4(core) x 1.5(clock)

Exynos5D Cortex-A15 1.7GHz x2 dual
---------------------------------------
SingleT SP max: 13.483 GFLOPS
MultiT  SP max: 26.724 GFLOPS  (理論値: 27.2 GFLOPS)
                        = 2(mad) x 2(simd) x 2(unit) x 2(core) x 1.7(clock)


Tegra3 Cortex-A9 1.2GHz x4 quad (TB1.3GHz)
---------------------------------------
SingleT SP max:  4.783 GFLOPS  (理論値:  5.2 GFLOPS
MultiT  SP max: 18.905 GFLOPS  (理論値: 19.2 GFLOPS)
                               = 2(mad) x 2(simd) x 4(core) x 1.2(clock)

K3V2 Cortex-A9 1.2GHz x4 quad
---------------------------------------
SingleT SP max:  4.694 GFLOPS
MultiT  SP max: 18.662 GFLOPS  (理論値: 19.2 GFLOPS)
                               = 2(mad) x 2(simd) x 4(core) x 1.2(clock)


MSN8260 Scorpion 1.2GHz x2 dual
---------------------------------------
SingleT SP max:  8.898 GFLOPS
MultiT  SP max: 16.560 GFLOPS  (理論値: 19.2 GFLOPS)
                               = 2(mad) x 4(simd) x 2(core) x 1.2(clock)


QSD8250 Scorpion 1.0GHz x1
---------------------------------------
SingleT SP max:  7.098 GFLOPS  (理論値:  8.0 GFLOPS)
                               = 2(mad) x 4(simd) x 1.0(clock)

Tegra 2 Cortex-A9 1.0GHz x2 dual
---------------------------------------
SingleT SP max:  1.973 GFLOPS
MultiT  SP max:  3.913 GFLOPS  (理論値:  4.0 GFLOPS)
                               = 2(mad) x 2(core) x 1.0(clock)

比較的理論値に近い数値が出ています。
各 CPU の理論値は下記にまとめました。

CPU FLOPS

この出力結果はあくまでピーク値による比較なので、
実際のアプリケーションの実行速度とは異なります。

例えばスカラ VFP 演算で n8 と n1 の結果を比べると、
Cortex-A9 では命令の並び順によって 5倍も速度が落ちるケースがあります。
同じ条件でも Krait / Cortex-A15 はほとんど速度が落ちていないので、
パイプラインの実行効率が向上していることがわかります。

よって実際のアプリケーションでは、Cortex-A9 と Krait/Cortex-A15 では
ピーク値よりもさらに差が開くことが予想されます。

multi-thread は同じテストを CPU core の数だけ走らせています。
Tegra 3 のように single thread 時に動作クロックが上がるものがあるので、
single-thread の値を core 数倍しても正しい値にならないためです。

アプリの出力結果を見ると、Cortex-A15 は VFP のスカラ演算よりも
NEON の 64bit (float x2) の方が 2倍速く実行できることがわかります。

// Exynos 5 Dual Cortex-A15 1.7GHz dual (Nexus 10)

* VFP/NEON (single fp)         sec    MFLOPS    最大
----------------------------------------------------
VFP fmuls     (32bit x1) n8 :  2.675  1495.4  1555.9
VFP fadds     (32bit x1) n8 :  2.392  1672.1  1672.1
VFP fmacs     (32bit x1) n8 :  3.171  2523.2  2523.2
VFP vfma.f32  (32bit x1) n8 :  2.985  2679.9  2679.9
NEON vmul.f32 (32bit x2) n8 :  1.187  6740.5  6740.5  **
NEON vadd.f32 (32bit x2) n8 :  1.187  6740.7  6740.7  **
NEON vmla.f32 (32bit x2) n8 :  1.187 13480.8 13480.8  **
NEON vfma.f32 (32bit x2) n8 :  1.187 13480.3 13480.3  **
NEON vmul.f32 (32bit x4) n8 :  2.373  6741.8  6741.8
NEON vadd.f32 (32bit x4) n8 :  2.374  6740.7  6740.7
NEON vmla.f32 (32bit x4) n8 :  2.373 13482.7 13482.7
NEON vfma.f32 (32bit x4) n8 :  2.373 13482.3 13482.3

以前予想したようにおそらく NEON の演算 unit は 64bit の 2 pipe ですが、
VFP は 1命令しか実行できない可能性があります。
Cortex-A8 で行ったように、VFP 命令を NEON 演算に置換する
Cortex-A15 最適化ができるかもしれません。


関連エントリ
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
Qualcomm APQ8064 GPU Adreno 320 の速度
Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力
iPad 4/iPad mini A6X/A5 の CPU/GPU 速度
iPhone 5 / A6 の CPU 速度 その 3
ARM Cortex-A8 の NEON と浮動小数演算最適化
benchmark 関連


VFP Benchmark の Android 版も 64bit 対応になりました。
対応していれば arm64 (arm64-v8a), x86_64 (x64), mips64 で計測を行います。
なお iOS 版はすでに 64bit (arm64) に対応しています。

VFP Benchmark v1.3
VFP Benchmark (Google Play)

下記は Nexus 9 (Tegra K1 64) での結果の比較です。

NVIDIA Denver            ST-SP    ST-DP   MT-SP   MT-DP
----------------------------------------------------------------
AArch32 32bit armv7a     17.799   4.423   34.582   8.719  GFLOPS
AArch64 64bit arm64      17.906   8.762   34.888  17.601  GFLOPS

 * ST=Single thread, MT=Multi thread
 * SP=Single precision fp, DP=Double precision fp
 * 単位は GFLOPS, 数値が大きい方が高速

AArch64 は倍精度 NEON 命令が使えるため DP の速度が 2倍になっています。
より詳しい結果は下記ページに載せています。

VFP Benchmark Log

// Tegra K1 Denver arm64
                                  時間(sec)  MFLOPS
---------------------------------------------------
FPU fmul (32bit x1) n8        :    2.049     1952.1
FPU fadd (32bit x1) n8        :    1.000     3998.3
FPU fmadd (32bit x1) n8       :    1.849     4326.0
NEON fmul.2s (32bit x2) n8    :    1.842     4343.8
NEON fadd.2s (32bit x2) n8    :    1.259     6356.0
NEON fmla.2s (32bit x2) n8    :    1.900     8420.3
NEON fmul.4s (32bit x4) n8    :    1.837     8711.7
NEON fadd.4s (32bit x4) n8    :    1.179    13570.5
NEON fmla.4s (32bit x4) n8    :    1.831    17475.0

FPU fmul (64bit x1) n8        :    1.930     2072.7
FPU fadd (64bit x1) n8        :    0.929     4306.0
FPU fmadd (64bit x1) n8       :    1.798     4450.2
NEON fmul.2d (64bit x2) n8    :    1.809     4422.6
NEON fadd.2d (64bit x2) n8    :    1.195     6695.8
NEON fmla.2d (64bit x2) n8    :    1.826     8762.0

fmul.2s, fmul.4s の速度差が無いため、Cortex-A15 と異なり NEON 命令の実行は
128bit 単位と思われます。
おそらく Nexus 9 の Denver は 2.2GHz 前後で動作しており、
1 cycle あたりスカラー乗算 で 1、加算が 2。
SIMD ではこの割合が 4 mul, 6 add, 4 mad となっています。
表にまとめると下記の通り。(数値が大きい方が cycle あたりの演算能力が高い)

                 Scalar SP       Scalar DP
                 mul add mad     mul add mad
----------------------------------------------
Cortex-A9  32      1   1   2     0.5   1   1
Cortex-A15 32      1   1   2       1   1 1.4
Krait 400  32      1   1   2       1   1   2  (Qualcomm)
Swift      32      1   1   1       1   1   1  (Apple A6)
Denver     64      1   2   2       1   2   2  (NVIDIA Tegra) ←
Cyclone    64      2   3   4       2   3   4  (Apple A7/A8)
Silvermont 64      1   1   -     0.5   1   -  (Intel BayTrail Atom)
Jaguar     64      1   1   2     0.5   1   -  (AMD Kabini)


               SIMD2(32x2) SP    SIMD4(32x4) SP    SIMD2(64x2) DP
                mul add mad       mul add mad       mul add mad
------------------------------------------------------------------
Cortex-A9  32     2   2   4         2   2   4         -   -   -
Cortex-A15 32     4   4   8         4   4   8         -   -   -
Krait 400  32     2   2   4         4   4   8         -   -   -
Swift      32     2   2   4         4   4   8         -   -   -
Denver     64     2   3   4         4   6   8         2   3   4  ←
Cyclone    64     4   6   8         8  12  16         4   6   8
Silvermont 64     -   -   -         2   4   6       0.5   1 1.5
Jaguar     64     -   -   -         4   4   8         2   2   4

↑この表は命令あたりの演算個数で、積和を 2とみなしています。
より詳しい表は下記ページに載せています。

CPU の浮動小数点演算能力の詳細

Denver は CPU core と比べても比較的おとなしい結果となっています。
浮動小数点演算において特に突出した特徴は持っていないので、
core の数が少ない分だけ Multi-Thread 時のピーク値が低くなっています。
下の表は 32bit 版 Tegra K1 を搭載した SHILD Tablet との比較です。

Tegra K1 (数値はGFLOPS)          ST-SP   ST-DP  MT-SP    MT-DP
---------------------------------------------------------------
Denver     AArch32 32bit armv7a  17.799  4.423  34.582   8.719  Nexus 9
Denver     AArch64 64bit arm64   17.906  8.762  34.888  17.601  Nexus 9
Cortex-A15 ARMv7A  32bit armv7a  17.136  3.431  70.174  14.036  SHIELD Tab

これだけ見ると Cortex-A15 版の方が優れているように見えますが、
あくまで浮動小数点演算命令だけの結果です。
実際には ARM の 64bit 命令セットが使えるメリットは大きく、
アプリケーションの動作速度ではこれらと大きく異なった結果になると思われます。

↓の表は WebGL (Emscripten) 物理エンジン ベンチマークの結果比較で、
Nexus 9 はかなり高速に実行できています。

Nexus 9        Tegra K1  Denver     64  Android 5.0  Firefox 33  13体
iPad Air 2     Apple A8X Cyclone    64  iOS 8.1      Safari      13体
MeMO Pad ME176 Z3740     Silvermont 32  Android 4.4  Firefox 33   9体
Tegra Note 7   Tegra 4   Cortex-A15 32  Android 4.4  Firefox 33   8体
Nexus 5        MSM8974   Krait 400  32  Android 4.4  Firefox 33   8体
Nexus 7        APQ8064   Krait      32  Android 5.0  Firefox 33   5体

詳しくは下記ページで。現在は Firefox でも正しく描画されるようになっています。

iOS8 で WebGL & 物理エンジンのベンチマーク結果


● Android NDK のアセンブラ命令

clang と gcc4.9 の違いかもしれませんが、左側の省略記法が使えなかったので
右のようにレジスタ名への展開が必要でした。

orr.16b  v1, v0, v0      →     orr   v1.16b, v0.16b, v0.16b
fmla.4s  v0, v8, v4      →     fmla  v0.4s,  v8.4s,  v4.4s


関連エントリ
iPad Air 2 (Apple A8X) の浮動小数点演算能力
Android x86 Binary Translator を試してみる
Atom Bay Trail の浮動小数点演算能力
VFP Benchmark v1.1 浮動小数点演算命令の速度 (NEON/SSE/AVX)
ARM CPU の VFP Benchmark アプリ 浮動小数点演算速度の計測
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
Qualcomm APQ8064 GPU Adreno 320 の速度
Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力
ARM Cortex-A8 の NEON と浮動小数演算最適化
benchmark 関連


x86 の SSE/AVX 命令に対応しました。
ARM CPU と同じように SSE/AVX の命令速度を計測することができます。

VFP Benchmark v1.1
VFP Benchmark Android (Google play)
VFP Benchmark iOS (AppStore)

上記は Android ですが iOS 版では ARMv8A (arm64) に対応しています。(2014/02/05 iOS 版追加)
下記は手持ちのデバイスでの結果。

Device           CPU                             sp GFLOPS  dp GFLOPS
---------------------------------------------------------------------
MacBookRetina13  Core i5-3210M Ivy    2.5GHz x2       90.2       45.2
Kindle HDX 7     MSN8974  Krait 400   2.2GHz x4       67.5       16.9
Tegra Note 7     Tegra4   Cortex-A15  1.8GHz x4       51.3        9.8
Nexus 7 (2013)   AQP8064  Krait       1.5GHz x4       47.8       11.8
iPhone 5s        A7 arm64 Cyclone     1.3GHz x2       40.9       20.5
iPhone 5s        A7 arm7s Cyclone     1.3GHz x2       40.9        8.0
Mac mini 2009    Core2 Duo P7350      2.0GHz x2       31.7       12.7
Nexus 10         Exynos5D Cortex-A15  1.7GHz x2       26.7        5.3
iPad 4           A6X      Swift       1.4GHz x2       21.5        3.6
iPhone 5         A6       Swift       1.3GHz x2       20.1        3.4
Nexus 7 (2012)   Tegra3   Cortex-A9   1.3GHz x4       18.9        4.7
EVO 3D ISW12HT   MSM8660  Scorpion    1.2GHz x2       16.6        1.3
VAIO Type P      Atom Z540 Bonnell    1.8GHz x1       10.9        1.9
Desire X06HT     QSD8250  Scorpion    1.0GHz x1        7.1        0.9
iPad 2           A5       Cortex-A9   1.0GHz x2        7.8        2.0
iPod touch 4     A4       Cortex-A8   0.8GHz x1        3.1        0.1
Raspberry Pi     BCM2835  ARM1176JZFS 0.7GHz x1        0.7        0.7

 * 数値が大きい方が速い。
 * sp= 単精度, dp= 倍精度

ピーク値の測定なので実アプリケーションの速度とは異なります。
詳しくはこちらを参照してください。
下記のページのほぼ理論値通りの傾向が出ています。

CPU FLOPS 理論値

倍精度のテストはまだ改良の余地があります。
スカラーで mul+add のペアリングを測定していないので、
一部の CPU でもう少しスコアが伸びると考えられます。

Core i5 Ivy Bridge は想定より高い数値が出ていますが、TurboBoost の効果で
より高いクロックで走っているようです。single-thread 時は 3.0GHz、
mult-thread 時は 2.85GHz 相当の結果となっています。

実際の測定結果は命令単位の数値を出すので、より細かく CPU の動作を
調べることができます。

SSE2/AVX1 には積和命令がありませんが、Intel CPU は加算と乗算命令が
並列に実行できるようです。
↓ 実際に addps/mulps の Interleave は半分の時間で実行しています。

Ivy Bridge Core i5-3210M
* SSE/AVX (single fp)                sec     MFLOPS     MFLOPS
AVX vmulps (32bit x8) n8      :    1.322    24205.7    24205.7
AVX vaddps (32bit x8) n8      :    1.319    24256.0    24256.0
AVX vmul+addps (32bit x8) n8  :    0.658    48604.4    48604.4

↓ Atom (Bonnell) は場合少々特殊です。
SSE 命令の乗算は加算よりも 2倍時間がかかっています。
動作クロックを考えると SSE の add が 128bit で mul が 64bit 幅で
演算していると考えられます。

Atom Z540 (Bonnell)
* SSE/AVX (single fp)                sec     MFLOPS     MFLOPS
SSE mulps (32bit x4) n8       :    4.307     3715.2     3715.2
SSE addps (32bit x4) n8       :    2.207     7248.1     7248.1
SSE mul+addps (32bit x4) n8   :    2.155     7424.2     7424.2

ARM NEON の場合は、同じ SIMD でも 64bit 命令があります。
例えば「 vadd.f32 d0,d1,d2 」は単精度 32bit x2 の 64bit 加算を行うので、
Cortex-A8/A9 のように 64bit 幅でも 1cycle で実行します。
128bit 命令「 vadd.f32 q0,q1,q1 」の場合は 2cycle かかります。

SSE は常に 4要素 = 128bit 単位なので Pentium 3 等 64bit 幅の
SIMD Unit では最小でも 2cycle かかることになります。
同様に Atom の乗算も最小値は 2cycle です。
ただし mulps + addps の Interleave でも、addps のみの場合と同じ時間で
完了するため、加算と乗算は非対称ながら Overlap できるようです。

Atom には HT があるので、Multi-thread 時は無駄な隙間を埋められます。
メインスレッドで mulps + addps のペアを実行し、サブスレッドで addps のみ
走らせるとおそらく 128bit + 64bit の非対称なパイプラインが埋まります。

mulps + addps + addps 組み合わせを 2スレッド走らせたのが下記の結果で、
スコアが伸びていることがわかります。

Atom Z540 (Bonnell)
* SSE/AVX (single fp) multi-thread   sec     MFLOPS     MFLOPS
SSE ml+ad+addps (32bit x4) n6 :    3.075    10926.6    10926.6

これらの測定結果から、CPU の個別の演算能力をまとめたのが下記の表です。
倍精度の値はもう少し変動する可能性があります。

・スカラー

                  単精度                      倍精度
CPU               mul    add    mad   fma     mul    add    mad    fma
-----------------------------------------    -------------------------
ARM1176JZF-S      0.5    0.5      1    --     0.5    0.5      1     --
Cortex-A8        0.14   0.14   0.18    --     0.1    0.1    0.1     --
Cortex-A9           1      1      2    --     0.5      1      1     --
Cortex-A15          1      1    1.4     2       1      1    1.4    1.4
Scorpion            1      1      2    --     0.5      1      1     --
Krait 400           1      1      2     2       1      1    1.6      2
A6 Swift            1      1      1     1       1      1      1      1
A7 Cyclone arm7s    1      1      2     2       2      3      3      3
A7 Cyclone arm64    2      3     --     4       2      3     --    1.6
Atom Bonnell        1      1     --    --     0.5      1     --     --
Core2 Penryn        1      1     --    --       1      1     --     --
Core i5 Ivy Bridge  1      1     --    --       1      1     --     --

 * 数値は 1 cycle に実行可能な演算数
 * 値が大きい方が高速

ARM11 の mul は 0.5演算/cycle となっています。
つまり単精度の加算や乗算は 2cycle かかります。

mad/fma は命令あたり 2 演算なので、この欄が 2 の場合に 1 cycle で
実行できることを意味しています。

Cortex-A8 のピーク FLOPS は NEON のおかげで ARM11 より高いですが、
上記のように VFP のスカラー演算では ARM11 に負けています。

A7 Cyclone (ARMv8A) は AArch32 (32bit mode) と AArch64 (64bit mode) で
かなり違いがあります。
単精度演算は 64bit mode の方が数倍速く実行できるようです。
おそらく VFP が要求する仕様が NEON と異なっているためだと考えられます。
AArch64 は NEON と統一されたので、NEON と同等の速度で動作できるようです。
VFP が足を引っ張る似たような傾向は、Cortex-A15 など他の ARMv7A CPU にも
見られます。

・SIMD 単精度

                   SIMD2 (32bit x 2)         SIMD4 (32bit x4)
CPU                mul   add   mad   fma     mul   add   mad   fma  
----------------------------------------    ----------------------
ARM1176JZF-S        --    --    --    --      --    --    --    --
Cortex-A8            2     2     4    --       2     2     4    --
Cortex-A9            2     2     4    --       2     2     4    --
Cortex-A15           4     4     8     8       4     4     8     8 
Scorpion             2     2     4    --       4     4     8    -- 
Krait 400            2     2     4     4       4     4     8     8 
A6 Swift             2     2     4     4       4     4     8     8 
A7 Cyclone arm7s     4     6     8     8       8    12    16    16 
A7 Cyclone arm64     4     6    --     8       8    12    --    16
Atom Bonnell        --    --    --    --       2     4    (6)   --
Core2 Penryn        --    --    --    --       4     4    (8)   --
Core i5 Ivy Bridge  --    --    --    --       4     4    (8)   --

Cortex-A8/A9 は 64bit 幅なので、SIMD2 では Scorpion/Krait/Swift と
差がありません。
SIMD4 では 128bit の Scorpion/Krait/Swift の半分であることがわかります。

ユニークなのは Cortex-A15 で、SIMD4 では同じ 128bit の
Scorpion/Krait/Swift と同等ですが SIMD2 では 2倍の数値となっています。
Cortex-A15 は 64bit 幅 2 pipe なので、2命令同時実行できるためです。
スカラーでは単精度でも 1命令/cycle だったので、半分しか使わなくても
NEON の方が速いことになります。

Ivy Bridge は AVX に対応しているので、上の表では省略していますが SIMD8
があります。下記のページに SIMD8 や倍精度 SIMD 含めて表にまとめています。

CPU FLOPS : FPU

一番最初の GFLOPS のリストでは、Quad core かつ動作クロックの高い
Snapdragon 800 (MSM8974) が上位でした。
CPU の cycle 単位の命令数を出してみると、唯一の ARMv8 CPU でもある
A7 Cyclone が群を抜いて高性能であることがわかります。

計測結果から、mul, mad/fma で 2命令、add では 3命令を同時に実行できるようです。
NEON の場合は AArch32 と AArch64 特に違いはありませんでした。

A7 Cyclone の設計は DEC Alpha や StrongARM に由来するエンジニアが
関わっているとのこと。(Wikipedia P.A.Semi)

Benchmark はあくまで浮動小数点演算能力のピーク値を実測することが目的なので、
必ずしも総合的な優劣には一致しないことを予めご了承ください。


関連エントリ
ARM CPU の VFP Benchmark アプリ 浮動小数点演算速度の計測
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 10 CPU Cortex-A15 の速度
Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
Qualcomm APQ8064 GPU Adreno 320 の速度
Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力
ARM Cortex-A8 の NEON と浮動小数演算最適化
benchmark 関連


oga at 15:00
Android は端末によって SD カードの扱いが結構ばらばらです。
設定画面に表示される用語も端末ごとに異なっています。

                 OS   内部Flash  内部メディア領域   SDカード
-------------------------------------------------------------------
Desire X06HT     2.2   147MB     無し               /sdcard
ZEN Touch2(8GB)  2.1   2.95GB    4.10GB  /sdcard    /extsd
ZiiO 7 (8GB)     2.1   1.97GB    4.94GB  /sdcard    /sdcard/SD_CARD
LuvPad AD100     2.2   1.62GB    12.95GB /sdcard    /sdcard2

上の 内部Flash は /data の容量です。

Android のデータ領域は 2種類あります。
本体内蔵の内部ストレージと取り外し可能な外部ストレージです。

ダウンロードしたアプリケーションは主に内部ストレージにインストールされます。

外部ストレージは主に撮影した写真等のメディアデータが格納されます。
共有しても問題ないデータ、あとから生成する容量の大きいデータはこちらが
使われることが多いようです。
また OS 2.2 からは外部ストレージへインストールできるアプリもあります。

◎内部ストレージ /data
・本体内蔵のフラッシュメモリのうちデータ用の領域
・ダウンロードしたアプリケーションは主にこちらにインストールされる
・USB 接続時に PC から見えない

◎外部ストレージ /sdcard
・共有可能なデータが格納される
・取り外し可能
・OS 2.2 からは対応アプリケーションならインストールできる
・USB 接続時に PC から直接アクセスできる。(一時的に Unmount される)


●SD カードとの関係

iPod touch のように、本体にもメディア用の大容量なフラッシュメモリを
内蔵している場合に少々複雑になります。
内蔵のメディア用フラッシュ領域が /sdcard が割り当てられるものの、
同時に本来の SD カードスロットも存在しているからです。

ZEN Touch 2 / ZiiO 7 は設定画面からも両方の容量を確認可能です。
PC 接続時には内蔵のメディア領域と SDカードの 2つのドライブが作られます。

LuvPad の場合は基本的に内蔵のメディア領域を使うことが前提となっているようです。
SD カード側のマウントには再起動が必要で PC から見えるのも内部の
メディア領域のみです。

大容量の内蔵フラッシュを持たない Desire X06HT の場合はシンプルです。
もともとこのような使われ方を想定していたのだと思われます。

内蔵のメディア領域を持っている場合、外付けの SD カードがなくても運用
できますが容量は固定となります。
SD カードは別領域にマウントされるため /sdcard そのもののは変わりません。


●アプリケーション

端末によっては内部ストレージがかなり小さく、アプリケーションの
インストール時に容量が足りなくなることがあります。

2.2 からは SDカードへもインストールや移動ができるようになりましたが
その対応度はアプリケーションに依存します。

この点においては、取り外し不可能な単一領域の大容量フラッシュを内蔵
している iOS の方が分かりやすく開発側の負担も少なくなっています。


◎アプリケーションを SDカードインストール対応にする方法

AndroidManifest.xml に1行追加。auto または preferExternal

<manifest ~
      android:installLocation="auto"
      >

実際に HTC Desire X06HT (2.2 Froyo) で Market から Angry Birds を
ダウンロードしてみると SD カードにインストールされました。
おそらく preferExternal が指定されているのだと思われます。

また前回ベンチマークテストに用いた GPUBench も SD カードに入ります。
このアプリは当初 LuvPad (2.2) や ODROID-S (2.2) にはインストールすることが
出来ずしばらくはまりました。

 設定→「SDカードと端末容量」→「SDカードのアンマウント」

でアンマウントしてからだとインストール出来ることがわかりました。
この場合は内部ストレージに入ります。

もしかしたら Market が使えないか、何らかの認証されていないデバイスでは
SD カードにアプリケーションをインストール出来ないのかもしれません。
そのため preferExternal が設定されたアプリケーションはインストールに失敗し、
管理画面からも SD カードに移動出来なくなっていると考えられます。


関連エントリ
各種 Android 端末のベンチマークテスト (2)
各種 Android 端末のベンチマークテスト


ARM や MIPS、Atom 等さまざまな CPU を比べてみました。

CPU benchmark

厳密なテストとは言いがたいので参考程度にお願いします。
コンパイラの違いでも結構差が出ているようです。


関連エントリ
Android 4.0 ainol Novo 7 Paladin、MIPS CPU の NDK と Vivante GPU


下記の CPU ベンチに Apple A6 の結果を追加しました。

CPU benchmark

以下抜粋

              SoC/CPU core          実行時間  実行速度   1GHz時
----------------------------------------------------------------
iPhone 5      A6  ?                    1.87 (57.96 MB/s)  44.58?
iPad 3        A5X Cortex-A9 1.0GHz     4.60 (23.55 MB/s)  23.55
iPod touch 4  A4  Cortex-A8 800MHz     6.07 (17.85 MB/s)  17.92

実行時間が小さい方が高速。(実行速度が大きい方が速い)

こちらでも A6 は非常に良い結果となっています。

リンク先の説明にもある通りテストはデータの暗号化を行なっており、
処理の大半がメモリアクセスやテーブル参照と XOR です。
浮動小数点演算は含みません。
single thread なので単一 core だけの速度となっています。

またコンパイラとの相性があり、全体的に iOS よりも Android の方が
高速に実行される傾向があります。
比較する場合はコンパイラの違いにも注意してください。

必ずしもこの結果だけで判断できませんが、A6 はリストにある ARM の中では
最も速く、x86 でもネットブック向け Atom では全く相手にならないようです。


関連エントリ
iPhone 5 / A6 の CPU 速度 その 2
iPhone 5 / A6 の浮動小数点演算


ベンチマークソフトを手持ちのデバイスで試してみました。

Sillicon Studio MOBILE GPUMARK

MOBILE GPUMARK                             GEMS   DP   NB   GPU Total
---------------------------------------------------------------------
iPhone5             A6  PowerVR SGX543MP3   751  902  474  4068  6195
iPad4               A6X PowerVR SGX554MP4   665  729  429  3943  5757
iPad mini           A5  PowerVR SGX543MP2   582  695  362  2852  4491
Nexus 7             Tegra3 ULP GeForce(12)  362  623  231  3271  4487
EVO 3D ISW12HT      MSM8660 Adreno220       431  564  245  2235  3475
iPod touch5         A5  PowerVR SGX543MP2   385  450  239  2338  3412
Galaxy S2 SC-02C    Exynos4210 Mali-400MP4  577  730  174  1196  2677
Optimus Pad L-06C   Tegra2 ULP GeForce(8)   121  220   81  1838  2260
Galaxy Nexus SC-04D OMAP4460 PowerVR SGX540 160  161   63  1273  1657
HONEYBEE 101K       APE5R PowerVR SGX543MP  407  572  240 10673 11892 ※無効

・数値が大きいほうが高速。スコアは v1.0 時のもの
・GEMS=RIGID GEMS, DP=DEAD PARKING, NB= NATURAL BONE, GPU=GPU BENCHMARK
・CPU はすべて dual core 以上

iPad4 より iPhone5 の方が良い結果でした。
画面の解像度が小さい方が多少有利に働くのかもしれません。

SC-04D は非常に低速で、ひと通り完了を待つだけでもかなり時間がかかりました。
見かけの速度は速いですが、SGX540 はやはりひと世代前の GPU であることがわかります。
Galaxy S2 はそこそこのスコアですがディザがかかったような画面に見えるのが気になりました。

HONEYBEE 101K が突出した値に見えますが実は描画が正しく行われておりません。
もともとこの端末は OpenGL ES 2.0 で問題が生じることが多かったのですが、
GEMS,DP,NB の描画はラスタ状に一瞬見える程度でほとんど暗転しており、まるで
V-Sync を待たずにフレームバッファがクリアされているような画面になっています。
よってこのスコアは無効です。

GPU BENCHMARK の内容をさらに詳しく比較したのが下記の表です。

GPU BENCHMARK                 fill high many vert spec  pix norm  420  800 1280
-------------------------------------------------------------------------------
iPhone5      PVR SGX543MP3     538   82  242 1013  871  343  310  364  203  102
iPad4        PVR SGX554MP4     403  137  296  765  726  412  393  234  269  172
iPad mini    PVR SGX543MP2     484   62  158  640  560  241  222  274  144   67
Nexus 7      Tegra3 ULP GF(12) 185   56  116  828  571  288  235  667  218  107
EVO 3D       8660 Adreno220    283   98  123  384  378  320  279  191  132   47
iPod touch5  PVR SGX543MP2     286   39  130  601  513  183  164  243  123   56
Galaxy S2    4210 Mali-400MP4  253   37   26  193  138  159  145  196   29   20
Optimus Pad  Tegra2 ULP GF(8)   75   22   77  572  409  125  102  317   98   41
Galaxy Nexus 4460 PVR SGX540    87   31   48  302  265  190  131  134   62   26
HONEYBEE101K PVR SGX543MP     7768   72   91 1038  595  385  416  161  102   45

・数値が大きいほうが高速。スコアは v1.0 時のもの
・fill=Fill Test, high=High Polygon Model, many=Many Models
・vert=Per Vertex Lighting, spec=Per Vertex Lighting & Specular
・pix=Per Pixel Lighting & Specular, norm=Per Pixel Lighting & Specular & Normal Map
・420=YEBIS Resolution 420x234, 800=YEBIS Resolution 800x450, 1280=YEBIS Resolution 1280x720

PowerVR 系は頂点(vert,spec)とピクセル(pix,norm)のスコアに極端な差が
ついていることがわかります。
Unified Shader である PowerVR 系はピクセル負荷が下がった分だけ頂点性能が
大きく向上します。

同じ Unified ながら全く性質が異なるのが Adreno 220 系で、
頂点(vert,spec)とピクセル(pix,norm)の差がわずかです。
全体の負荷を下げてもピーク性能が上がらない代わりに、ある程度複雑な
ピクセルシェーダーを走らせても性能が落ちにくい傾向があります。

Discrete Shader である Tegra は頂点性能が非常に高いことがわかります。
ピクセル負荷に影響を受けず、Tegra2 でもアンバランスに見えるほど
頂点スコアが高くなっています。
Tegra3 はピクセルも強化されていますが、PowerVR とは異なり
シェーダーの演算能力よりも fill が弱点になっているようです。

Tegra と正反対なのが同じ Discrete の Mali-400MP4 です。
4 core あるのはピクセルユニットだけなので、どうしても相対的に頂点性能が
足りないようです。
spec, pix を比べるとわかりますが、頂点でライティングするよりもむしろ
ピクセルでライティングした方が速くなっています。
GEMS, DP だけを見ると上位に食い込むスコアなので、NB を含めて
ハイポリ系が大きくスコアを落とす原因となっているようです。

HONEYBEE 101K では 420,800,1280 (YEBIS) の描画が完全に壊れていました。
よってこのスコアは正しくないことに注意してください。
それ以外は一見正しく描画されていましたが fill の値だけなぜか突出しています。
この機種だけ Android 2.3 であることも何か関係しているかもしれません。


実際のラインキングを見ると Snapdragon S4 (Adreno225/320) がかなり
上位を占めているようです。

MOBILE GPUMARK - RANKING

ポストエフェクトなどスクリーン系エフェクトは TBDR の PowerVR 等とは
相性がよくなく、Mobile 系 GPU ではあまり用いられていませんでした。
このソフトでは非常によく動いており各種効果による違いもよくわかります。

PowerVR はかなり特徴が偏っているため、PC と同じアプローチだと他の GPU と
あまり差がつかないかもしれません。その点 Tegra の方が素直です。
また highp 演算が多い場合やピクセルの演算命令が複雑な場合は Adreno が有利です。

今後は様々な GPU が登場し、レンダリング手法も幅が広がってくるものと思われます。
Adreno 320 では TBR だけでなく Direct Rendering Mode も使い分けられるので、
このようなケースでも今まで以上に最適化が可能となるようです。

新しい世代の Adreno 320/Mali-T604 をまだ入手できていないので、
機会があればぜひ比べてみたいと思います。


関連エントリ
iPad 4 Apple A6X GPU PowerVR SGX554 MP4 の速度


iPhone 5s の浮動小数点演算速度を命令単位で比べてみました。
A7 の CPU core は ARMv8 で 64bit 命令に対応していますが、
ここでの比較は AArch32 (32bit mode) の VFP/NEON 命令となっています。
64bit mode (AArch64) ではレジスタの個数や view が異なるので
違う結果になる可能性があります。

                 (1)      (2)    (3)     (4)      (5)      (6)
                Nexus7  EVO 3D  iPhone5  HTL21  Nexus10  iPhone5s
              Cortex-A9 Scorpion Swift   Krait Cortex-A15   ?
                Tegra3  MSM8660    A6  APQ8064 Exynos5D     A7
                1.2GHz  1.2GHz  1.3GHz  1.5GHz  1.7GHz    1.3GHz?
-----------------------------------------------------------------
a:m44 vmla_A Q   3.959   2.859   1.293   1.337   0.619     0.700
b:m44 vmla_B Q   2.002   1.136   1.359   0.931   0.569     0.670
c:m44 vmla_A D   3.980   3.053   1.669   1.889   0.557     0.649
d:m44 vmla_B D   2.003   1.434   1.329   1.532   0.568     0.745
A:m44 vfma_A Q   -----   -----   1.632   1.882   0.746     0.707
B:m44 vfma_B Q   -----   -----   1.594   0.695   0.840     0.699
e:fadds      A   3.343   3.383   3.090   2.774   2.383     3.551
f:fmuls      A   3.337   3.383   3.167   2.747   2.369     3.475
g:fmacs      A   3.337   3.379   6.180   5.574   2.956     3.480
h:vfma.f32   A   -----   -----   6.180   2.747   2.957     3.480
i:vadd.f32 D A   3.426   3.377   3.091   2.762   1.183     1.031
j:vmul.f32 D A   3.421   3.383   3.168   2.746   1.478     1.545
k:vmla.f32 D A   3.792   3.380   3.166   5.604   1.480     1.567
l:vadd.f32 Q A   6.688   3.377   3.090   2.801   2.365     1.031
m:vmul.f32 Q A   6.681   3.384   3.166   2.761   2.364     1.548
n:vmla.f32 Q A   6.681   3.380   3.167   5.606   2.367     1.574
o:vfma.f32 D A   -----   -----   3.167   2.833   1.479     1.574
p:fadds      B   3.347   5.917   6.181   3.467   2.956     6.953
q:fmuls      B   4.195   5.917   6.180   3.556   3.558     6.652
r:fmacs      B   6.688   8.451  12.361   6.298   5.912     9.867
s:vfma.f32   B   -----   -----  12.363   3.430   5.910     9.859
t:vadd.f32 D B   3.421   5.916   3.090   3.529   2.958     3.663
u:vmul.f32 D B   3.422   5.073   3.169   3.447   2.364     3.114
v:vmla.f32 D B   7.561   8.451   6.180   6.293   4.728     6.185
w:vadd.f32 Q B   6.705   5.916   3.090   3.457   2.961     3.659
x:vmul.f32 Q B   6.683   5.074   3.167   3.428   2.363     3.101
y:vmla.f32 Q B   7.532   8.457   6.179   6.372   4.729     6.199
z:vfma.f32 D B   -----   -----   6.181   3.437   4.730     6.188

↑数値は実行時間(秒) 数値が小さい方が高速

速いと思った iPhone 5 A6 の Swift から 1年、A7 はさらに強力な演算能力を
持っているようです。
ほぼ同クロック(?)でも最大で Swift の 3倍のスループットとなっており、
クロック差があるにも関わらず Cortex-A15 に匹敵するスコアが出ているようです。

特に NEON 命令が高速であることがわかります。
D と Q で差がないので、演算は 128bit 単位だと考えられます。
それでも Cortex-A15 の 64bit 2pipe で実現している速度に追いついているので、
あくまで憶測ですが A7 は 128bit pipe が複数存在している可能性があります。

反面、VFP の方は他の CPU とあまり違いが無いようで、
動作クロックの分だけ差がついています。
ただし Swift で極端に苦手だったスカラーの積和命令においては、
A7 できちんと欠点を克服していることがわかります。
それでもレイテンシは Swift 程ではないものの比較的大きくなっているようです。

ARMv8 のアーキテクチャの変更により、NEON 命令でも倍精度の演算が
サポートされました。
このテストは単精度の 32bit 浮動小数点演算ですが、もし倍精度で比較したなら
32bit ARMv7 世代とはさらに差が広がることになります。

x86 でも SSE2 が倍精度命令をサポートしたことにより、
互換性目的以外で FPU (x87) を使う必要がなくなりました。
実際に Windows x64 の 64bit mode では、
FPU を使わずに SSE 命令だけが用いられています。

同じように ARMv8 も Advanced NEON が倍精度をカバーしたことで、
VFP を分ける必要がなくなっています。
AArch32 では VFP 命令でも AArch64 では NEON のスカラーに
置き換わっていると考えられます。

Krait, Swift, Cortex-A15 と ARMv7-A の VFPv4 世代の CPU を
やっと揃えたと思ったら、更に新しい世代の CPU が登場してしまいました。
本当のパフォーマンスは AArch64 (64bit mode) で発揮されるので、
まだまだこれからです。

a:〜z: 個々の詳細と説明は過去の記事を参照してください。
Cortex-A8 を含めて多くの機種の結果を下記のページにまとめました。

ARM CPU core 毎の浮動小数点演算速度の比較 (VFP/NEON)


関連エントリ
2013/04/08:Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
2013/01/09:Qualcomm APQ8064 GPU Adreno 320 の速度
2012/12/23:Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力


64bit mode (AArch64) で走らせてみました。
命令もレジスタの構造も異なるのでコードは別物です。
検証が不完全で、この結果には間違いが含まれている可能性があります。

                  (1)    (2)     (3)       (4)       (5)
               iPhone5  HTL21  Nexus10   iPhone5s iPhone5s
                Swift   Krait Cortex-A15  AArch32  AArch64
                  A6   APQ8064 Exynos5D     A7       A7
                1.3GHz  1.5GHz  1.7GHz    1.3GHz?  1.3GHz?
--------------------------------------------------------------------
a:m44 vmla_A Q   1.293   1.337   0.619     0.700    -----
b:m44 vmla_B Q   1.359   0.931   0.569     0.670    -----
c:m44 vmla_A D   1.669   1.889   0.557     0.649    -----
d:m44 vmla_B D   1.329   1.532   0.568     0.745    -----
A:m44 vfma_A Q   1.632   1.882   0.746     0.707    0.692  (fmla v)
B:m44 vfma_B Q   1.594   0.695   0.840     0.699    0.696  (fmla v)
e:fadds      A   3.090   2.774   2.383     3.551    1.043  (fadd s)
f:fmuls      A   3.167   2.747   2.369     3.475    1.548  (fmul s)
g:fmacs      A   6.180   5.574   2.956     3.480    -----
h:vfma.f32   A   6.180   2.747   2.957     3.480    3.185  (fmadd s)
i:vadd.f32 D A   3.091   2.762   1.183     1.031    1.031  (fadd.2s)
j:vmul.f32 D A   3.168   2.746   1.478     1.545    1.545  (fmul.2s)
k:vmla.f32 D A   3.166   5.604   1.480     1.567    -----
o:vfma.f32 D A   3.167   2.833   1.479     1.574    1.753  (fmla.2s)
l:vadd.f32 Q A   3.090   2.801   2.365     1.031    1.039  (fadd.4s)
m:vmul.f32 Q A   3.166   2.761   2.364     1.548    1.548  (fmul.4s)
n:vmla.f32 Q A   3.167   5.606   2.367     1.574    -----
*:vfma.f32 Q A   -----   -----   -----     -----    1.696  (fmla.4s)
p:fadds      B   6.181   3.467   2.956     6.953    3.663  (fadd s)
q:fmuls      B   6.180   3.556   3.558     6.652    3.296  (fmul s)
r:fmacs      B   2.361   6.298   5.912     9.867    -----
s:vfma.f32   B   2.363   3.430   5.910     9.859    3.292  (fmadd s)
t:vadd.f32 D B   3.090   3.529   2.958     3.663    3.643  (fadd.2s)
u:vmul.f32 D B   3.169   3.447   2.364     3.114    3.289  (fmul.2s)
v:vmla.f32 D B   6.180   6.293   4.728     6.185    -----
z:vfma.f32 D B   6.181   3.437   4.730     6.188    6.237  (fmla.2s)
w:vadd.f32 Q B   3.090   3.457   2.961     3.659    3.641  (fadd.4s)
x:vmul.f32 Q B   3.167   3.428   2.363     3.101    3.276  (fmul.4s)
y:vmla.f32 Q B   6.179   6.372   4.729     6.199    -----
*:vfma.f32 Q B   -----   -----   -----     -----    6.226  (fmla.4s)

↑数値は実行時間(秒) 数値が小さい方が高速

scalar 演算は予想通り AArch64 の方が高速に実行できるようです。
AArch64 では NEON に統合されていると考えられるため
vector 時と同等になっています。

ARMv8 の AArch64 では SIMD レジスタの構造が変わっており、
すべて 128bit サイズになっています。
スカラー演算はその一部だけが用いられる仕組みで、
ちょうど x86 の SSE と同じです。
スカラーのロードでもレジスタ全体がクリアされます。

32bit (ARMv7) では、Q(128bit) x 8 = D(64bit) x 16 = S(32bit) x 32
が同じ領域でした。
D は S の 2個分で、Q には S レジスタが 4個含まれています。

AArch32 の場合、スカラー演算はレジスタの部分書き換えに相当するので
パイプラインの実行効率が落ちているのではないかと考えられます。

fmadd が遅いのは Swift と傾向が似ています。
AArch64 はこの命令だけ 4 オペランドでした。

A: と B: は下記の通り。

; A: m44 fmla  A Q
ldp q0, q1, [%0]
ldp q2, q3, [%0,#32]
ldp q4, q5, [%1]
ldp q6, q7, [%1,#32]

fmul.4s	v8, v0, v4[0]
fmla.4s	v8, v1, v4[1]
fmla.4s	v8, v2, v4[2]
fmla.4s	v8, v3, v4[3]
str  q8, [%2]
〜
fmul.4s	v8, v0, v7[0]
fmla.4s	v8, v1, v7[1]
fmla.4s	v8, v2, v7[2]
fmla.4s	v8, v3, v7[3]
str  q8, [%2,#48]


; B: m44 fmla  B Q
ldp q0, q1, [%0]
ldp q4, q5, [%1]
ldp q6, q7, [%1,#32]

fmul.4s	v8,  v0, v4[0]
fmul.4s	v9,  v0, v5[0]
fmul.4s	v10, v0, v6[0]
fmul.4s	v11, v0, v7[0]
ldp	q2, q3, [%0,#32]
〜
fmla.4s	v8,  v3, v4[3]
fmla.4s	v9,  v3, v5[3]
fmla.4s	v10, v3, v6[3]
fmla.4s	v11, v3, v7[3]
stp  q8,  q9,  [%2]
stp  q10, q11, [%2,#32]

レジスタ番号が一致しているので非常に書きやすくなりました。


関連ページ
ARM CPU core 毎の浮動小数点演算速度の比較 (VFP/NEON)

関連エントリ
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
2013/04/08:Nexus 10 CPU Cortex-A15 の浮動小数点演算速度
2013/01/09:Qualcomm APQ8064 GPU Adreno 320 の速度
2012/12/23:Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力


スマートフォンが搭載しているメモリ容量は非常に速いペースで増加しています。
下記ページに日本で発売された端末のスペックを集めています。

端末全リスト: 日本で発売されたスマートフォン・タブレット全リスト

ざっと眺めただけでもだいたいこんな感じ↓でしょうか。

2008 年 128MB
2009 年 128MB〜256MB
2010 年 256MB〜512MB
2011 年 512MB〜1GB
2012 年 1GB〜2GB
2013 年 1/2GB〜?

特に Android デバイスで容量増加が著しいことがわかります。
このペースが今後も続くと考えるならば、来年には 32bit プロセッサの
壁にぶつかることになります。

RAM 容量が必要になる原因の一つとして画面の高解像度化が考えられます。
こちらも RAM 増量に負けないペースで進化してきました。

2008 年 128MB           480x320              x1.0
2009 年 128MB〜256MB    480x320〜800x480     x2.5
2010 年 256MB〜512MB    854x480〜1024x768    x5.12
2011 年 512MB〜1GB      854x480〜1280x800    x6.67
2012 年 1GB〜2GB        854x480〜2560x1600   x26.67
2013 年 1/2GB〜?       1280x720〜?

高解像度化に伴いアプリケーションで必要な描画リソース量も増加します。
解像度が高いと CPU 描画が間に合わないので、GPU のサポートも必須となります。
描画やレイヤーの合成など OS が管理する GPU リソースも大幅に
増えているのではないかと考えられます。

それ以外にも多数要因があると思いますが、
プロセッサ全体の性能向上とそれに合わせた要求から、
64bit 化は自然な流れだといえるでしょう。

しかしながら、今一番 RAM 容量が切迫しているのは Android の方です。
iOS は Android のおよそ半分の RAM 容量で動作しているため、
iPhone 5s の A7 が先陣を切ったのはかなり意外だと思いました。

64bit 化のメリットとしてアドレス空間の拡張が挙げられますが、
他にも様々なメリットがあります。
特に 64bit mode は互換性の枷から逃れるための大きなチャンスであり、
64bit 化においてはさまざまなアーキテクチャの変更が行われているようです。

ひとつは命令セットやレジスタなどのハードウエア的なアーキテクチャの
変更で、もうひとつはソフトウエア的な取り決めを再設計可能なことです。
全く使われないけど互換性のために残っている機能とか、
設計が古く都合が悪くなっていた仕様などを切り捨てることが出来ます。
(もちろん 32bit 動作 mode では互換性が保たれます)


ARM はロードストア型の RISC プロセッサですが、ひとつの
インストラクションに複数の機能が盛り込まれた多機能な命令体系でした。
例えば命令フィールドには Condition Code が含まれており、条件付き
実行が可能だったり、ソースオペランドに Shifter が組み込まれているなど
かなり独特です。

AArch64 では全く異なる別の命令セットになっています。
よりシンプルで実用的な設計になったと言われていますが、見たところ
便利そうな少々変わった機能も豊富で、十分 ARM らしいと感じました。

コンパイラの出力コードを比べると、関数によっては 64bit の方が命令数が
減ってコンパクトになっていることに気が付きます。

Nexus 7 の Ubuntu で ARM の abi softfp と hard-float を比べる

上記のように ARMv7 では互換性の問題から softfp (soft-float) が
使われることがありました。
浮動小数点値も関数入出力では一旦整数レジスタを経由しており無駄が発生します。

AArch64 (64bit) ではこのような配慮が不要なので最初から hard-float 相当
となっているようです。

// AArch64
__Z5func3fff:                           ; @_Z5func3fff
; BB#0:
	fadd	s0, s0, s1
	fsub	s0, s0, s2
	ret	lr

__Z5func419__simd128_float32_tS_:       ; @_Z5func419__simd128_float32_tS_
; BB#0:
	fmul.4s	v1, v0, v1
	fadd.4s	v0, v1, v0
	ret	lr



// AArch32
__Z5func3fff:                           @ @_Z5func3fff
@ BB#0:
	vmov	d18, r1, r1
	vmov	d20, r0, r0
	vmov	d16, r2, r2
	vadd.f32	d18, d20, d18
	vsub.f32	d0, d18, d16
	vmov	r0, s0
	bx	lr

__Z5func419__simd128_float32_tS_:       @ @_Z5func419__simd128_float32_tS_
@ BB#0:
	vmov	d17, r2, r3
	vmov	d16, r0, r1
	mov	r0, sp
	vld1.32	{d18, d19}, [r0]
	vmul.f32	q9, q8, q9
	vadd.f32	q8, q9, q8
	vmov	r0, r1, d16
	vmov	r2, r3, d17
	bx	lr

64bit 化が直接的な理由ではありませんが、
ABI やスタックフレームの改良ができることも実パフォーマンスに
影響を与えているのではないかと思います。

実際に Windows の x86/x64 でも、両方使っていると
同じ CPU 上でも明らかに 64bit の方が速いことに気が付きます。
64bit が苦手と言われていた Core 2 でもきちんと効果がでていました。

CPU ベンチ

x64 でレジスタ数が倍増したことが一番の要因かもしれませんが、
ABI のようにソフトウエアのデザイン面で互換性保たなくて良いことも
大きなメリットになっていると考えられます。


iPhone のメモリ空間にはまだ余裕がありますが、
パフォーマンスの向上や、利用効率を上げて省電力につなげるという
意味でも iPhone 5s の 64bit 化は意味があるように思います。


昨日 ARMv8 AArch64 の浮動小数点演算速度比較のためにコンパイラの
出力コードを調べていたのですが、これ↓が最初なにかわかりませんでした。

	orr.16b	v5, v1, v1

意味のない or 命令はレジスタ間の move でした。(mov v5,v1)


関連エントリ
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 7 の Ubuntu で ARM の abi softfp と hard-float を比べる
iPhone 5s の Apple A7 GPU


CPU ベンチに Snapdragon 800 MSM8974 Krait 400 の結果を追加しました。

ARM CPU core 毎の浮動小数点演算速度の比較 (VFP/NEON)
CPU benchmark

浮動小数点演算命令毎の実行速度

                (1)      (2)      (3)      (4)       (5)      (6)      (7)
               Nexus7   iPad4    HTL21   Nexus10  iPhone5s iPhone5s KindleHDX7
              Cortex-A9 Swift    Krait  Cortex-A15 Cyclone  Cyclone   Krait4
               Tegra3    A6X    APQ8064  Exynos5D   A7 32    A7 64   MSM8974
               1.2GHz   1.4GHz   1.5GHz   1.7GHz    1.3GHz   1.3GHz   2.2GHz
------------------------------------------------------------------------------
a:m44 vmla_AQ  3.959    1.204    1.337    0.619     0.700    -----    0.661
b:m44 vmla_BQ  2.002    1.266    0.931    0.569     0.670    -----    0.542
c:m44 vmla_AD  3.980    1.554    1.889    0.557     0.649    -----    0.888
d:m44 vmla_BD  2.003    1.238    1.532    0.568     0.745    -----    0.768
A:m44 vfma_AQ  -----    1.519    1.882    0.746     0.707    0.692    1.178
B:m44 vfma_BQ  -----    1.484    0.695    0.840     0.699    0.696    0.463
e:fadds     A  3.343    2.878    2.774    2.383     3.551    1.043    1.864
f:fmuls     A  3.337    2.953    2.747    2.369     3.475    1.548    1.867
g:fmacs     A  3.337    5.757    5.574    2.956     3.480    -----    2.052
h:vfma.f32  A  -----    5.756    2.747    2.957     3.480    3.185    1.864
i:vadd.f32 DA  3.426    2.877    2.762    1.183     1.031    1.031    1.866
j:vmul.f32 DA  3.421    2.950    2.746    1.478     1.545    1.545    1.864
k:vmla.f32 DA  3.792    2.951    5.604    1.480     1.567    -----    2.051
o:vfma.f32 DA  -----    2.494    2.833    1.479     1.574    1.753    1.871
l:vadd.f32 QA  6.688    2.878    2.801    2.365     1.031    1.039    1.872
m:vmul.f32 QA  6.681    2.952    2.761    2.364     1.548    1.548    1.879
n:vmla.f32 QA  6.681    2.950    5.606    2.367     1.574    -----    2.059
N:vfma.f32 QA  -----    -----    -----    -----     -----    1.696    -----
p:fadds     B  3.347    5.756    3.467    2.956     6.953    3.663    -----
q:fmuls     B  4.195    5.756    3.556    3.558     6.652    3.296    -----
r:fmacs     B  6.688   11.514    6.298    5.912     9.867    -----    -----
s:vfma.f32  B  -----   11.513    3.430    5.910     9.859    3.292    -----
t:vadd.f32 DB  3.421    2.881    3.529    2.958     3.663    3.643    1.865
u:vmul.f32 DB  3.422    2.949    3.447    2.364     3.114    3.289    2.339
v:vmla.f32 DB  7.561    5.755    6.293    4.728     6.185    -----    3.773
z:vfma.f32 DB  -----    5.755    3.437    4.730     6.188    6.237    2.340
w:vadd.f32 QB  6.705    2.879    3.457    2.961     3.659    3.641    1.875
x:vmul.f32 QB  6.683    2.950    3.428    2.363     3.101    3.276    2.340
y:vmla.f32 QB  7.532    5.759    6.372    4.729     6.199    -----    3.746
Y:vfma.f32 QB  -----    -----    -----    -----     -----    6.226    -----

・↑数値は実行時間(秒) 数値が小さい方が高速。single thread
・すべて単精度 32bit float の演算です。

Krait 400 は動作 clock が高いこともあり非常に高速です。
上の結果では同じ ARMv7A VFPv4 世代の Cortex-A15 に匹敵し、
実行効率の差を動作クロックが十分補っていることがわかります。

またここでの Quad core は Cortex-A9, Krait, Krait 400 だけなので、
総合的なパフォーマンスでは高クロックかつ Quad core の Krait 400 が
最も高いスコアになることが予想できます。

NEON 命令は 64bit と 128bit の差がなく、Cortex-A15 と違い 128bit
単位となっています。

vfma (FMA) よりも vmla が 2倍遅かった Krait 無印 (3) と比べて、
Krait 400 (7) では vmla も vfma に近い速度が出ています。
同じ Krait でも傾向が異なっており、様々な改良が施されているようです。

同時にあらためて A7 Cyclone の単 core 性能が非常に高いこともわかります。
A7 Cyclone の結果は 2個ありますが、
(5) は ARMv8 AArch32 (armv7) 32bit モードの結果で
(6) は ARMv8 AArch64 (arm64) 64bit モードでの結果です。

以下テスト端末の詳細

device                     OS   SoC      CPU core     clock  Arch        VFP
----------------------------------------------------------------------------
(1)ASUS Nexus 7 (2012)     A4.2 Tegra 3  Cortex-A9 x4 1.2GHz ARMv7A 32bit v3
(2)Apple iPad 4            i6.1 A6X      Swift     x2 1.4GHz ARMv7A 32bit v4
(3)HTC J butterfly HTL21   A4.1 APQ8064  Krait     x4 1.5GHz ARMv7A 32bit v4
(4)Samsung Nexus 10        A4.2 Exynos5D Cortex-A15x2 1.7GHz ARMv7A 32bit v4
(5)Apple iPhone 5s         i7.0 A7       Cyclone   x2 1.3GHz ARMv8A 32bit v4
(6)Apple iPhone 5s         i7.0 A7       Cyclone   x2 1.3GHz ARMv8A 64bit Ad
(7)Amazon Kindle Fire HDX7 A4.2 MSM8974  Krait 400 x4 2.2GHz ARMv7A 32bit v4

下記はもうひとつのCPUベンチの結果です。

  SoC CPU              clock  compiler  arch   time  MB/s   MBS/GHz
-------------------------------------------------------------------
1.A7 Cyclone + AES     1.3GHz clang 5.0 arm64  0.129 837.54  644.26
2.A7 Cyclone           1.3GHz clang 5.0 arm64  1.04  104.27   80.21
3.A7 Cyclone           1.3GHz clang 5.0 armv7  1.16   93.04   71.57
4.MSM8974 Krait 400    2.2GHz gcc 4.8   armv7  1.41   76.67   34.85
5.Exynos 5D Cortex-A15 1.7GHz gcc 4.6   armv7  1.49   72.61   42.71
6.A6X Swift            1.4GHz clang 4.2 armv7  1.75   61.82   44.16
7.APQ8064 Krait        1.5GHz gcc 4.6   armv7  2.28   47.64   31.82
8.Tegra3 Cortex-A9     1.3GHz gcc 4.4.3 armv7  3.00   36.15   25.82

・time の単位は秒
・MB/s が大きいほうが高速
・MBS/GHz = 1GHz あたりの処理速度

専用命令を使っている 1. が一桁高速なのは当然ですが、64bit アーキテクチャ
の A7 も十分高速です。
新 core + クロック数が最も高い Krait 400 はそれらに次ぐ速度となりました。
テスト内容の詳細はこちらから。

テストに使った Kindle Fire HDX 7 のデータは下記にも追加しました。

CPU/GPU OpenGL ES Extension (Mobile GPU)


関連エントリ
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
iPhone 5s A7 CPU の浮動小数点演算速度 (32bit)
Nexus 10 CPU Cortex-A15 の速度
Qualcomm APQ8064 GPU Adreno 320 の速度
Qualcomm APQ8064 Krait/A6 swift の浮動小数点演算能力


最近の Windows Tablet 等に使われている Bay Trail は、
新しい世代の Atom CPU core (Silvermont) を搭載しています。
HT 無しの 2/4 core で Out-of-Order となり、
旧 Atom と比べて実行性能が大きく向上しています。

Bay Trail の浮動小数点演算能力を調べてみました。
テスト環境は Bay Trail-D (Celeron J1900) なので厳密には Celeron となります。

結果、単精度の浮動小数点演算能力は 旧 Atom と変わらず、
1 core あたり 6 fop (add 4 + mul 2) / clock であることがわかりました。
旧 Atom 同様 add, mul の非対称な interleave が良い結果となっています。
その代わり倍精度演算は強化されており、旧 Atom の 2倍に相当します。

VFP Benchmark の結果から求めた cycle あたりの演算 (1coreあたり)

                       Single FP   Double FP
---------------------------------------------------------
Atom Bonnell (旧Atom)     6          1.5
Atom Silvermont (新)      6            3 1.5     (Bay Trail)
Core 2 Duo                8            4
Core i7 Sandy Bridge     16            8
Core i7 Ivy Bridge       16            8
Core i7 Haswell          32           16     (未計測,予想値)

Cortex-A9                 4            1
Cortex-A15                8          1.4
Krait                     8            2     (Snapdragon 800)
Swift                     8            1     (iPhone 5)
Cyclone ARM64            16            8     (iPhone 5s)

演算内容の内訳は次の通り

                       Single FP         Double FP
SIMD(Vector)           mul  add  mad     mul  add  mad
-------------------------------------------------------
Atom Bonnell (旧Atom)   2    4   (6)     0.4  0.5    ?
Atom Silvermont (新)    2    4   (6)       1    2   (3)  0.5  1.0  (1.5)
Core 2 Duo              4    4   (8)       2    2  (3?)
Core i7 Sandy Bridge    8    8  (16)       4    4   (8)
Core i7 Ivy Bridge      8    8  (16)       4    4   (8)

Cortex-A9               2    2    4       --   --   --
Cortex-A15              4    4    8       --   --   --
Krait                   4    4    8       --   --   --
Swift                   4    4    8       --   --   --
Cyclone ARM64           8   12   16        4    6    8

Scalar 時の結果など、より詳しくまとめた表を下記に載せています。

cycle あたりの演算命令の詳細

以下は実際の J1900 の VFP Benchmark の結果です。
演算命令単位など、より詳細な結果をご覧になりたい方は こちら よりどうぞ。
各種 CPU のログを載せています。

Bay Traild-D Celeron J1900 2.0GHz (TB:2.5GHz 2.41GHz)

ARCH: x64
FPU: SSSE3 SSE4.1 SSE4.2
SingleT SP max: 14.477 GFLOPS
SingleT DP max:  3.619 GFLOPS
MultiT  SP max: 57.902 GFLOPS
MultiT  DP max: 14.471 GFLOPS
CPU core: 4
SSE: yes
AVX: no
FMA: no
~

理論値は 2GHz 4core で 48 GFLOPS なので、計測結果はより高い数値が出ています。
Turbo Boost が効いているためで、57.902 / 24 = 2.41 から
Multi Thread 時におよそ 2.4GHz で動作していることがわかります。

他の CPU との比較。

VFP Benchmark 実測値        clock core    Single FP     Double FP
-------------------------------------------------------------------
Bay Trail-D  J1900           2.0GHz x4    57.9 GFLOPS   14.5 GFLOPS
Menlow       Atom Z540       1.9GHz x1    10.9 GFLOPS    1.9 GFLOPS
Core 2 Duo   P7350           2.0GHz x2    31.7 GFLOPS   12.7 GFLOPS
Ivy Birdge   Core i5-3210M   2.5GHz x2    90.2 GFLOPS   45.2 GFLOPS
Sandy Bridge Core i7-2720QM  2.2GHz x4   162.3 GFLOPS   74.0 GFLOPS

Kindle HDX 7 Krait 400       2.2GHz x4    67.5 GFLOPS   16.9 GFLOPS
Tegra Note 7 Cortex-A15      1.8GHz x4    51.3 GFLOPS    9.8 GFLOPS
iPhone 5s    Cyclone         1.3GHz x2    40.9 GFLOPS   20.5 GFLOPS

・ピーク値による比較、GFLOPS が大きい方が速い

↑ Multi Thread 時の比較なので、Core 数が多く Clock が高い方が良い結果になります。

Mobile 向け CPU の性能向上が著しく、旧 Atom (Bonnell/Saltwell) では
ハイエンドの Quad core ARM に太刀打ちできませんでした。
新しい Atom Silvermont は十分な性能を有しています。
ただ浮動小数点演算はそれほど得意ではないようです。
おそらく AVX にも対応している Jaguar の方が上でしょう。

なお Tablet 向け Bay Trail-T は動作クロックが下がるため、
上記の表よりも低い値になると考えられます。

また、あくまで浮動小数点演算に特化した数値なので、
実際のアプリケーションの動作速度とは異なる点にご注意ください。
当 blog が浮動小数点演算能力のデータを集めているのは、ゲーム開発時の最適化が目的となります。

2014/05/15 訂正:
 ・Celeron J1900 の TB Clock の間違いを訂正いたしました 2.5GHz → 2.41GHz
 ・倍精度演算で旧 Atom の 2倍は間違いでした。旧 Atom と同等の性能と思われます。
申し訳ありませんでした。


関連ページ
VFP Benchmark
VFP Benchmark の計測結果
CPU FLOPS 理論値と、cycle ごとの演算数まとめ

関連エントリ
VFP Benchmark v1.1 浮動小数点演算命令の速度 (NEON/SSE/AVX)


低消費電力の Desktop PC 向け CPU として Intel からは BeyTrail-D、
AMD からは Kabini が登場しています。
BayTrail-D Celeron J1900 と Kabini Athlon 5350 は、
どちらも 4 core CPU + マザーボードでちょうど 1万円。
価格帯もスペックも良く似ているので比べてみました。

                    BayTrail-D              Kabini
                    Celeron J1900         Athlon 5350
-----------------------------------------------------
CPU core             Silvermont             Jaguar
CPU cores                4                    4
CPU clock            2.0-2.41GHz           2.05GHz
RAM                DDR3-1333 dual         DDR3-1600
MEM BW                21.3GB/s             12.8GB/s
L2                      2MB                  2MB
SSE                    SSE4.2               SSE4.2
AVX                      --                  AVX
AES                      --                 AES-NI
CPU SP              24 fop/clock         32 fop/clock
CPU SP FLOPS        57.81 GFLOPS          65.6 GFLOPS
CPU DP               6 fop/clock         12 fop/clock
CPU DP FLOPS        14.46 GFLOPS          24.6 GFLOPS
GPU core         Intel HD Graphics 3G    RADEON R3 (GCN)
GPU clock            688-854MHz             600MHz
GPU SP              64 fop/clock         256 fop/clock
GPU SP FLOPS         54.7 GFLOPS         153.6 GFLOPS
OpenGL Windows       OpenGL 4.0           OpenGL 4.3
OpenGL Linux         OpenGL 3.3           OpenGL 4.3
TDP                     10W                  25W

Intel Celeron Processor J1900
AMD Athlon

浮動小数点演算能力

VFP Benchmark     Celeron J1900    Athlon 5350
-------------------------------------------------
SingleT SP max:   14.477 GFLOPS    15.943 GFLOPS
SingleT DP max:    3.619 GFLOPS     6.127 GFLOPS
MultiT  SP max:   57.902 GFLOPS    63.737 GFLOPS
MultiT  DP max:   14.471 GFLOPS    24.504 GFLOPS

・値が大きいほうが高速

前前回の予想通り浮動小数点演算能力は Jaguar (Kabini/Athlon) の方が高くなっています。
J1900 (BayTrail) は動作クロックの高さで補っている形です。

演算能力/clock    Single FP   Double FP
-----------------------------------------------
Celeron J1900         6          1.5
Athlon 5350           8            3

再測定して気が付きましたが、以前のエントリで J1900 の倍精度演算の
性能評価が間違っていました。下記訂正しましたので申し訳ありませんでした。
Atom Bay Trail の浮動小数点演算能力


前回のコンパイル速度比較を Kabini でも試してみました。
驚くほど拮抗しています。

flatlib3 Linux       clock  core  RAM   OS   arch compiler    time sec
-------------------------------------------------------------------------
Kabini Athlon 5350  2.05GHz  x4   8GB  14.04  x64  clang-3.5    54.8
BayTrail-D J1900    2.41GHz  x4   8GB  14.04  x64  clang-3.5    54.6

・time が小さい方が速い

テストした環境は下記の通り。

Test 環境
Celeron J1900 (Q1900B-ITX DDR3-1333 dual   8GB  21.3GB/s)
Athlon 5350   (AM1l       DDR3-1333 single 8GB  10.7GB/s)

Kabini は DDR3-1600 が使えますが、テスト環境では手持ちの DDR3-1333 を使用しています。
本来の能力よりもスコアが低くなっていると考えられますので予めご了承ください。


AES 変換テスト

AES CTR 599MByte  Celeron J1900    Athlon 5350
-------------------------------------------------
Table1               18.708          18.964
Table2               15.409          14.600
Table3               14.902          12.374
AES-NI                   --           4.238

・単位は秒、値が小さい方が速い, Single Thread

AES-NI が使えるため Jaguar (Athlon/Kabini) の方が高速です。
同じアルゴリズム同士でもわずかに Jaguar の方が速いようです。
メモリ速度、CPU の動作クロックともに J1900 (BayTrail) の方が上なので、
Jaguar (Athlon/Kabini) は Core 性能そのものが高いのだと思われます。


簡単なシーンのレンダリング速度の比較

Ubuntu 14.04   GPU                    API            fps
----------------------------------------------------------
Celeron J1900  Intel HD Graphics 3G   OpenGL 3.3     17fps
Athlon 5350    RADEON R3              OpenGL 4.3     89fps

・fps が大きい方が速い

比べるまでもなく内蔵 GPU の性能では圧倒的な差があります。
RADEON は OpenGL で新しい API が使える点もポイントが高いです。
J1900 の GPU は使用していて少々性能不足を感じます。


CPU core の基本性能は Jaguar (Athlon/Kabini) の方が上。
メモリ速度や動作クロックを加味すると両者かなり近い性能になっています。

GPU は当然 RADEON (Athlon/Kabini) の方が速く、
性能差には数倍の開きがあります。

● BayTrail-D (Celeron J1900/Silvermont)
・消費電力が低くファンレス
・メモリ帯域が広い

● Kabini (Athlon 5350/Jaguar)
・浮動小数点演算能力が高い
・AVX/AES 命令に対応している
・GPU 性能が非常に高い


関連エントリ
コンパイル時間の比較 BayTrail
Atom Bay Trail の浮動小数点演算能力


C++ で開発していた OpenGL/OpenGL ES の Project を Emscripten でビルドしてみました。
Native Code 向けのプログラムがそのままブラウザ内で動いています。

・Windows Firefox (29.0.1)

Emscripten Windows

・Android Firefox (29.0.1)

Emscripten AndroidEmscripten Android + animation

Chrome では 7 fps 程度なので asm.js (Firefox) の効果は絶大でした。
Android でも十分な速度で動いています。

追記 2014/05/24: その後 Chrome でも 60fps 以上出るようになりました。詳しくはこちら

Windows 8.1 Firefox 29    60fps 以上   (Core i7-3615QM)
FireOS 3.0  Firefox 29    60fps 以上   (Kindle Fire HDX7 MSM8974)
Android 4.4 Firefox 29    34fps 前後   (Nexus 7 2013 APQ8064)

Windows 8.1 Chrome 34      7fps 前後   (Core i7-3615QM)
FireOS 3.0  Silk           3fps 前後   (Kindle Fire HDX7 MSM8974)
Android 4.4 Chrome 34      3fps 前後   (Nexus 7 2013 APQ8064)

・fps の値が大きい方が高速
・FireOS 3.0 = Android 4.2.2 相当

もともと OpenGL ES 2.0 / EGL に対応していたこともあり、
修正箇所はごく僅かで済んでいます。
使えなかった API は pthread だけで、
追加したのは Mouse/Touch/Keyboard などの Event 周りです。
Network (socket系) とサウンドは未着手。
ソースコード数は 600 file, 26万行ほど。

Native を想定して書いたコードが、拍子抜けするほどあっさりと
ブラウザ内で動いています。

以前から何度か NativeClient (NaCl) への対応化にも取り組んでいたのですが、
あまり本質的でない部分で躓いていました。
同期型 FileIO や Thread 周りといった API 制限だけでなく、
gcc (4.4) が古くて C++11 のコードが通らなかったためです。
その後確認したところ、ARM や pnacl では比較的新しいコンパイラに
置き換わってるようです。

今回使用した Emscripten では何も問題はなく Native 向け API もそのままです。
詳しい説明は次回。


● Emscripten

emscripten wiki

Android では Java, iOS では Objective-C が使われているように、
プラットフォームによってアプリケーション記述言語はまちまちです。
ただ多くの場合 C/C++ も併用できることが多く、
C/C++ 言語 + OpenGL ES 2.0 の組み合わせは、
移植性の高い共通言語&API としての役割も担っています。
主にゲームで。

Web Browser も OpenGL ES 2.0 (WebGL) に対応しており、
NativeClient (NaCl) や Emscripten といった C/C++ のコードを
走らせる仕組みも登場しています。
C/C++ が使えるようになったことで、同じソースコードのまま
さらに多くの環境にアプリケーションを移植できるようになりました。

NaCl はコンパイルしたバイナリをブラウザ内で走らせますが、
Emscripten は仮想マシンとして JavaScript を利用しています。
ポインタを駆使した C Native なコードが JavaScript に変換されると聞いても
少々奇妙な印象を受けるかもしれません。
しかしながら JavaScript の性能向上は著しく、モバイル含めて
十分な速度で動いているこれらの結果にはやはり驚きを隠せません。


● 速度比較

1. 960x640 63万Tri/191万Vertices, 一部 Bone Animation あり

CPU                  GPU            OS           Browser      fps
------------------------------------------------------------------------
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Win+OpenGL  100fps 前後
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Firefox      60fps 以上*1
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Chrome        7fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  X11+OpenGL    8fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  Firefox       5fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  Chrome         動作せず
Kabini Athlon5350    GeForce GTX650 Ubuntu14.04  X11+OpenGL  880fps 前後
Kabini Athlon5350    GeForce GTX650 Ubuntu14.04  Firefox      30fps 前後
Kabini Athlon5350    GeForce GTX650 Ubuntu14.04  Chrome        4fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   NDK+ES3.0    50fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   Firefox      34fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   Chrome        3fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   NDK+ES3.0    60fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   Firefox       8fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   Chrome         動作せず
MSM8974 Krait 400    Adreno 330     FireOS 3.0   Firefox      60fps 以上*1
MSM8974 Krait 400    Adreno 330     FireOS 3.0   Silk           fps 前後

・fps の値が大きい方が高速
・*1 : VSyncの上限
・Firefox 29, Chrome 34
・FireOS 3.0 = Android 4.2.2 相当
・APQ8064 = Nexus 7(2013), Exynos5D = Nexus 10, MSM8974 = Kindle Fire HDX7

2. 960x640 63万Tri/191万Vertices

CPU                  GPU            OS           Browser      fps
------------------------------------------------------------------------
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Win+OpenGL  110fps 前後
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Firefox      60fps 以上*1
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Chrome       10fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  X11+OpenGL    8fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  Firefox       5fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  Chrome         動作せず
Kabini Athlon 5350   GeForce GTX650 Ubuntu14.04  X11+OpenGL  900fps 前後
Kabini Athlon 5350   GeForce GTX650 Ubuntu14.04  Firefox      30fps 前後
Kabini Athlon 5350   GeForce GTX650 Ubuntu14.04  Chrome        6fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   NDK+ES3.0    50fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   Firefox      30fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   Chrome        5fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   NDK+ES3.0    60fps 以上*1
Exynos5D Cortex-A15  Mali-T604      Android4.4   Firefox       8fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   Chrome         動作せず
MSM8974 Krait 400    Adreno 330     FireOS 3.0   Firefox      60fps 以上*1
MSM8974 Krait 400    Adreno 330     FireOS 3.0   Silk          5fps 前後

・fps の値が大きい方が高速

3. 960x640 6万Tri/19万Vertices

CPU                  GPU            OS           Browser      fps
------------------------------------------------------------------------
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Win+OpenGL  520fps 前後
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Firefox      60fps 以上*1
Ivy Core i7-3615QM   Intel HD 4000  Win8.1 x64   Chrome       15fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  X11+OpenGL   60fps 以上*1
BayTrail-D J1900     Intel HD       Ubuntu14.04  Firefox       5fps 前後
BayTrail-D J1900     Intel HD       Ubuntu14.04  Chrome         動作せず
Kabini Athlon 5350   GeForce GTX650 Ubuntu14.04  X11+OpenGL 1020fps 前後
Kabini Athlon 5350   GeForce GTX650 Ubuntu14.04  Firefox      38fps 前後
Kabini Athlon 5350   GeForce GTX650 Ubuntu14.04  Chrome        9fps 前後
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   NDK+ES3.0    60fps 以上*1
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   Firefox      60fps 以上*1
APQ8064 Krait 1.5GHz Adreno 320     Android4.4   Chrome        8fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   NDK+ES3.0    60fps 以上*1
Exynos5D Cortex-A15  Mali-T604      Android4.4   Firefox       9fps 前後
Exynos5D Cortex-A15  Mali-T604      Android4.4   Chrome         動作せず
MSM8974 Krait 400    Adreno 330     FireOS 3.0   Firefox      60fps 以上*1
MSM8974 Krait 400    Adreno 330     FireOS 3.0   Silk          8fps 前後

・fps の値が大きい方が高速

描画負荷を変えても速度が大きく変わらないものは CPU (JavaScript) 側の
限界と思われます。
Chrome, BayTrail-D, Kabini, Exynos 5D(Nexus10) が相当します。
また Native との差が少ないものは GPU 側も上限に近いことを意味しています。

Animation ありの場合骨の計算分 JS の負担が増えます。(頂点blendは GPU)
GPU に余裕があるのに 1. と 2. で大きく差が生じる場合は、
JavaScript の演算能力にも余裕がないことを示しています。

BayTrail-D は描画と CPU (JS) 両方共限界に達しているようです。
Native (X11+OpenGL) の 1./2. のテストでは、画面拡大時に速度が上がり、
オブジェクトが画面に全体が収まる場合は Firefox に近い速度まで下がります。
おそらく頂点性能が足りていないと思われます。

また同時に BayTraild の Firefox では拡大しても速度が上がらず一定なので、
JavaScript の動作速度も制限となっていることがわかります。
倍精度浮動小数点演算が苦手なことも影響しているかもしれません。

Kabini は外付けの GeForce がオーバースペック過ぎて CPU が追いついていません。
CPU (JS) 自体は BayTrail よりはかなり速いようです。

Android の Native (NDK+ES) は Fullscreen 動作となり、1920x1200, 2560x1600 で
レンダリングしているため他と条件が異なっています。

JavaScript の動作は Cortex-A15 よりも Krait/Krait 400 の方が高速でした。
Krait (APQ8064) は 3. のテストで制限がかかっていないため、
JavaScript 自体は余裕があるものの GPU で落ちているようです。
GPU の演算能力に余裕がある Krait 400 (MSM8974) はどのテストでも 60fps
超えています。

Desktop の Kabini よりも Krait/Krait 400 の方が JavaScript の
動作速度が速いこともわかります。

Cortex-A15 の速度が全然出ていませんが、VFP Benchmark の結果でも
倍精度演算は Krait の方が良い結果を出しています。
ただそれ以上に大きく差が開いているので、他にも何らかの要因があるのでは
ないかと思われます。

同じ Cortex-A15 のTegra Note 7 (Tegra4) でも試したかったのですが
RAM 容量が足りず動きませんでした。
今のところ Android + Firefox の組み合わせは RAM 2GB でぎりぎりです。
まだビルドを通したばかりでプロジェクトが巨大なせいもあります。


● まとめ

・Emscripten で C/C++ と OpenGL ES 2.0 のコードがブラウザ上でそのまま走る
・Firefox なら速度も速い (asm.js のおかげ)
・Android でも Firefox + Krait は高速動作 (Cortex-A15 が遅い原因は不明)

追記 (2014/05/20) : Tegra4 (Cortex-A15) では高速に動作することを確認しました

追記 (2014/05/24) : Chrome で速度が遅かった原因がわかりました。修正により 60fps 以上出ています。

続きます:「Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (2)」


関連エントリ
Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす 一覧



oga at 04:28
G Watch のスペックは Cortex-A7 1.2GHz Quad core ですが、
アプリケーションの実際のパフォーマンスは予想を大きく下回るものでした。
今回の計測結果から逆算すると 700MHz の Single core 相当となります。

VFP Benchmark による計測結果

SingleThread SP 最大  : 1.360 GFLOPS
MultiThread  SP 最大  : 1.360 GFLOPS

同じ Cortex-A7 1.2GHz Quad core (MT8125) の Tablet との比較は下記の通り。

単精度 Float        LG G Watch        Yoga Tablet
                    MSM8226           MT8125
----------------------------------------------------------
Single Thread       1.360 GFLOPS      2.374 GFLOPS  (x1.7)
Multi Thread        1.360 GFLOPS      9.474 GFLOPS  (x7.0)

・GFLOPS の数値が大きいほうが高速

MT8125 の計測結果は 1.2GHz ほぼ想定通りの速度が出ています。
1.2(GHz) * 4(core) / 0.7(GHz) = 6.9 倍

以下詳細データ

SingleSP  Single-Thread
命令                   時間(sec)       MFLOPS
---------------------------------------------
VFP    mul              6.331           631.8
VFP    add              6.011           665.5
VFP    fmacs            6.062          1319.7
VFP    vfma.f32 s       6.032          1326.4
NEONx2 vmla.f32 d      11.833          1352.1
NEONx2 vfma.f32 d      11.859          1349.2
NEONx4 vmla.f32 q      23.621          1354.8
NEONx4 vfma.f32 q      23.542          1359.3

・MFLOPS の数値が大きいほうが高速

SingleSP  Multi-Thread (4 Thread)
命令                   時間(sec)       MFLOPS
---------------------------------------------
VFP    mul             24.405           655.6
VFP    add             24.063           664.9
VFP    fmacs           24.109          1327.3
VFP    vfma.f32 s      24.049          1330.6
NEONx2 vmla.f32 d      47.458          1348.6
NEONx2 vfma.f32 d      47.653          1343.0
NEONx4 vmla.f32 q      94.490          1354.6
NEONx4 vfma.f32 q      98.163          1304.0

・MFLOPS の数値が大きいほうが高速

Cortex-A7 は NEON も 32bit 単位なので VFP と同じ速度になります。
(Cortex-A7 の浮動小数点演算速度)
Krait ではなく Cortex-A7 が使われていることが結果からもわかります。

やはり cpu0 だけが 787MHz で動いているようです。(cpu1-3 は idle 状態)

cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

300000 0
384000 4
600000 73
787200 8799475
998400 174
1094400 109
1190400 2280

ポリゴンの表示は可能です。
gwatch_lgw100_02.jpg


関連エントリ
Android Wear LG G Watch (LG-W100)
Android Wear LG G Watch の GPU
MediaTek MT8125/8389 Cortex-A7 の浮動小数点演算速度


oga at 00:26
Android Wear LG G Watch (LG-W100) の速度(実測)」で計測に使ったアプリを公開しました。

VFP Benchmark
Google Play: VFP Benchmark for Android Wear

命令単位の実行速度など、詳細な表は Smartphone/Tablet 側で表示することができます。
ログの書き出しも可能です。
よろしければどなたか Galaxy Gear Live の結果を教えて下さい。

Android Wear と Smartphone/Tablet の通信 API は対称で、どちらも同じコードになります。
Smartphone 側からデータを送ったり Android Wear の Activity を起動することができますし、
逆も同様に可能です。
Android Wear は Android を搭載した独立したデバイスなので、対等な扱いになっていることがわかります。
このアプリはログのビューアとして Smartphone/Tablet を利用しています。


関連エントリ
Android Wear 3D のアナログ時計 (Watch Face)
Android Wear の 3D 描画 と NDK r10
Android Wear にゲームを移植
Android Wear LG G Watch (LG-W100) の速度(実測)
Android Wear LG G Watch (LG-W100)
Android Wear LG G Watch の GPU


oga at 23:30
x86 の Atom を搭載した Android Tablet も増えてきました。
本来なら NDK を使用したアプリケーションの互換性が気になるところです。
ところが実際はほとんど問題が起こらず、想像以上にそのまま動作するものが多いようです。
最初から複数のアーキテクチャに対応しているアプリももちろんありますが、
x86 未対応でも動く仕組みが用意されています。

Bay Trailが実現する、WindowsとAndroidが共存するタブレット

x86 の Android 端末は armeabi-v7a のコードを x86 に変換して実行することができます。
実際に試してみました。


ASUS MeMO Pad 7 ME176 (BayTrail-T Atom Z3745) を使い、
ARMv7A のバイナリ (so) だけ含んだ VFP Benchmark を走らせてみました。
NDK かつ assembler を使ったプログラムながら、きちんと動作していることがわかります。

下記はそれぞれのスクリーンショット。
CPU/FPU の種類も正しく判別している点に注目です。(理由は後述)

↓armeabi-v7a バイナリのみ含む場合
x86_bench_arm.png

↓x86 バイナリのみ含む場合
x86_bench_x86b.png

結果のまとめ

                          Z3745 x86      Z3745 ARM-BT
---------------------------------------------------------
SingleFP Single-thread      8.95           6.14      69%
DoubleFP Single-thread      2.80           1.48      53%
SingleFP MultiT-hread      35.37          24.33      69%
DoubleFP MultiT-tread      11.06           5.91      53%
Matrix 4x4 Single-thread    3.06           1.79      59%
Matrix 4x4 Multi-thread    12.26           7.23      59%

・プロセッサのピーク演算能力
・単位は GFLOPS、数値が大きい方が高速
・ARM-BT = ARM Binary Translation

ARM コードは単精度浮動小数点数命令で x86 の 69%、
倍精度でおよそ 53% の速度となっています。
ただしこれは最善ケースのみです。
Matrix の方が比較的現実的な数値に近いと思われます。


↓他の CPU との比較。

                              clock      SP     DP     SP-MT  DP-MT
-------------------------------------------------------------------
BayTrail Z3745 ARM-BT      x4 1.86GHz    6.14   1.48   24.33   5.91 **
BayTrail Z3745 x86         x4 1.86GHz    8.95   2.80   35.37  11.06
BayTrail J1900 x64         x4 2.41GHz   14.48   3.62   57.90  14.47
Atom z540                  x1 1.86GHz    8.92   1.81   10.93   1.85
Tegra3 Cortex-A9           x4 1.30GHz    4.78   1.20   18.91   4.72
Tegra4 Cortex-A15          x4 1.80GHz   13.37   2.66   51.35   9.86
Snapdragon S4 Pro Krait    x4 1.50GHz   11.95   3.01   47.81  11.75
Snapdragon 800 MSM8974     x4 2.20GHz   17.13   4.29   67.54  16.87
Rockchip RK3066 Cortex-A9  x2 1.60GHz    6.35   1.59   12.66   3.14
MediaTek MT8125 Cortex-A7  x4 1.20GHz    2.37   1.17    9.47   4.65
Apple A5 (iPad2) Cortex-A9 x2 1.00GHz    3.97   0.99    7.83   1.96
Apple A6 (iPad4) Swift     x2 1.30GHz   10.86   1.82   21.50   3.57
Apple A7 (5s) Cyclone      x2 1.40GHz   20.62  10.31   40.87  20.48

上の表では ARM Binary Translation は同クロックの Cortex-A9 よりも
若干遅い程度、動作クロックの分だけ Cortex-A9 よりも高速な結果となっています。
最近増えてきた低価格帯デバイスの Cortex-A7 Quad core よりは、
ずっと高速に演算できるでしょう。

ただしあくまでピーク演算能力の比較なので、
実アプリケーションに則した結果ではない点に注意してください。
演算命令の分布次第で速度が異なります。
例えば下の命令単位の結果を見ると変換された vmla が特に低速であることがわかります。
vmla を多用した最適化されたプログラムほど速度が遅くなるかもしれません。

上の表は今回の用途では適切なベンチマークではないので、参考程度にお願いします。

// armeabi-v7a (Binary Translation)
* VFP/NEON (単精度 fp) single-thread
                                     sec     MFLOPS     MFLOPS
----------------------------------------------------------------
VFP fmuls (32bit x1) n8       :    3.954     1011.6     1011.6
VFP fadds (32bit x1) n8       :    3.332     1200.6     1200.6
VFP fmacs (32bit x1) n8       :    8.371      955.7      955.7
VFP vfma.f32 (32bit x1) n8    :        -          -          -
NEON vmul.f32 (32bit x2) n8   :    6.009     1331.4     1331.4
NEON vadd.f32 (32bit x2) n8   :    3.816     2096.6     2096.6
NEON vmla.f32 (32bit x2) n8   :   22.824      701.0      701.0
NEON vfma.f32 (32bit x2) n8   :        -          -          -
NEON vmul.f32 (32bit x4) n8   :    6.012     2661.2     2661.2
NEON vadd.f32 (32bit x4) n8   :    3.347     4780.6     4780.6
NEON vmla.f32 (32bit x4) n8   :   16.516     1937.5     1937.5
NEON vfma.f32 (32bit x4) n8   :        -          -          -

↑ FMA は無く VFPv3-D32 NEON 相当。

// x86
* SSE/AVX (単精度 fp) single-thread
                                     sec     MFLOPS     MFLOPS
----------------------------------------------------------------
SSE mulss (32bit x1) n8       :    2.203     1816.0     1816.0
SSE addss (32bit x1) n8       :    2.152     1858.6     1858.6
SSE mulps (32bit x4) n8       :    4.292     3728.2     3728.2
SSE addps (32bit x4) n8       :    2.146     7457.2     7457.2
SSE mul+addps (32bit x4) n8   :    2.146     7456.3     7456.3
SSE ml+ad+addps (32bit x4) n6 :    1.877     8949.5     8949.5
SSE mulss (32bit x1) ns4      :    2.145     1864.4     1864.4
SSE addss (32bit x1) ns4      :    2.145     1864.7     1864.7
SSE mulps (32bit x4) ns4      :    4.291     3728.9     3728.9
SSE addps (32bit x4) ns4      :    2.153     7430.9     7430.9
AVX vmulps (32bit x8) n8      :        -          -          -
AVX vaddps (32bit x8) n8      :        -          -          -
AVX vmul+addps (32bit x8) n8  :        -          -          -
AVX vml+ad+adps (32bit x8) n6 :        -          -          -


● ABI

ro.product.cpu.abi=x86
ro.product.cpu.abi2=armeabi-v7a

第二 ABI として armeabi-v7a が指定されています。
同じ ARM でも armeabi (ARMv5TE) は変換対象とならないようです。
実際に armeabi だけのプログラムを走らせましたが実行できませんでした。
armeabi-v7a ではなく armeabi でビルドしている古いプログラムは
動作しないことになります。
対応アプリが 100% にならない理由の一つだと思われます。


● CPU Features

NDK に付属している CPU Features Library は、SSE,NEON 等の CPU 拡張命令が
使えるかどうかを返します。
このライブラリは Hardware Register MVFR (CPUID相当) を見ているのではなく、
基本的には /proc/cpuinfo から判断しています。
そのため lib (so) バイナリを x86 に変換するだけでは互換性が不十分です。

x86 の Binary Translator は ARM コードからアクセスした場合
/proc/cpuinfo も ARM 相当に置き換えているようです。
CPU Feature を正しく認識できているのはこの機能のおかげでしょう。
armeabi-v7a のコードから見える cpuinfo は下記の通りです。

Processor	: ARMv7 processor rev 1 (v7l) 
BogoMIPS	: 1500.0 
Features	: neon vfp swp half thumb fastmult edsp vfpv3 
Processor	: ARMv7 processor rev 1 (v7l) 
BogoMIPS	: 1500.0 
Features	: neon vfp swp half thumb fastmult edsp vfpv3 



Tegra K1 を搭載した SHILED Tablet が発売されました。
SHIELD Tablet の CPU Core は Tegra 4 同様 32bit Cortex-A15 Quad ですが、
GPU の本気度がこれまでと違います。

ブランドイメージに反して GPU が非力だった Tegra シリーズも、
K1 でようやく NVIDIA らしいスペックになったと言えるでしょう。

NVIDIA SHIELD

GL_VENDOR:   NVIDIA Corporation
GL_RENDERER: NVIDIA Tegra
GL_VERSION:  OpenGL ES 3.1 340.00

Extension:
GL_EXT_debug_marker
GL_EXT_blend_minmax
GL_EXT_color_buffer_float
GL_EXT_color_buffer_half_float
GL_EXT_copy_image
GL_EXT_debug_label
GL_EXT_draw_buffers_indexed
GL_EXT_frag_depth
GL_EXT_geometry_point_size
GL_EXT_geometry_shader
GL_EXT_gpu_shader5
GL_EXT_map_buffer_range
GL_EXT_occlusion_query_boolean
GL_EXT_primitive_bounding_box
GL_EXT_robustness
GL_EXT_separate_shader_objects
GL_EXT_shader_implicit_conversions
GL_EXT_shader_integer_mix
GL_EXT_shader_io_blocks
GL_EXT_shadow_samplers
GL_EXT_sRGB
GL_EXT_sRGB_write_control
GL_EXT_tessellation_point_size
GL_EXT_tessellation_shader
GL_EXT_texture_border_clamp
GL_EXT_texture_buffer
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map_array
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_rg
GL_EXT_texture_sRGB_decode
GL_EXT_texture_storage
GL_EXT_texture_view
GL_EXT_unpack_subimage
GL_KHR_debug
GL_KHR_texture_compression_astc_ldr
GL_NV_bgr
GL_NV_bindless_texture
GL_NV_blend_equation_advanced
GL_NV_blend_equation_advanced_coherent
GL_NV_copy_buffer
GL_NV_copy_image
GL_NV_draw_buffers
GL_NV_draw_instanced
GL_NV_draw_texture
GL_NV_EGL_stream_consumer_external
GL_NV_explicit_attrib_location
GL_NV_fbo_color_attachments
GL_NV_framebuffer_blit
GL_NV_framebuffer_multisample
GL_NV_generate_mipmap_sRGB
GL_NV_instanced_arrays
GL_NV_occlusion_query_samples
GL_NV_non_square_matrices
GL_NV_pack_subimage
GL_NV_packed_float
GL_NV_packed_float_linear
GL_NV_pixel_buffer_object
GL_NV_read_buffer
GL_NV_read_depth
GL_NV_read_depth_stencil
GL_NV_read_stencil
GL_NV_secure_context
GL_NV_shadow_samplers_array
GL_NV_shadow_samplers_cube
GL_NV_sRGB_formats
GL_NV_texture_array
GL_NV_texture_border_clamp
GL_NV_texture_compression_latc
GL_NV_texture_compression_s3tc
GL_NV_texture_compression_s3tc_update
GL_NV_timer_query
GL_KHR_blend_equation_advanced
GL_KHR_blend_equation_advanced_coherent
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_depth24
GL_OES_depth32
GL_OES_depth_texture
GL_OES_depth_texture_cube_map
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_element_index_uint
GL_OES_fbo_render_mipmap
GL_OES_get_program_binary
GL_OES_mapbuffer
GL_OES_packed_depth_stencil
GL_OES_rgb8_rgba8
GL_OES_sample_shading
GL_OES_sample_variables
GL_OES_shader_image_atomic
GL_OES_shader_multisample_interpolation
GL_OES_standard_derivatives
GL_OES_surfaceless_context
GL_OES_texture_npot
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_texture_stencil8
GL_OES_texture_storage_multisample_2d_array
GL_OES_vertex_array_object
GL_OES_vertex_half_float
GL_ANDROID_extension_pack_es31a

OpenGL ES 3.1 に対応しており、OpenGL 4.x 相当の AEP
「 GL_ANDROID_extension_pack_es31a 」が付いています。

Tegra 2   Cortex-A9 x2   ULP GeForce(8)      OpenGL ES 2.0
Tegra 3   Cortex-A9 x4   ULP GeForce(12)     OpenGL ES 2.0
Tegra 4   Cortex-A15 x4  ULP GeForce(72)     OpenGL ES 2.0
Tegra K1  Cortex-A15 x4  GeForce Kepler(192) OpenGL ES 3.1 AEP/OpenGL 4.4

Tegra 2/3 の ULP GeForce は Direct3D 9 世代の GPU から
GLES 2.0 仕様ぎりぎりまで機能を削減したものでした。
Tegra 4 の ULP GeForce は同じ Direct3D 9 世代の GPU core のまま
本来のあるべき機能を復活させたもの。

Tegra K1 は Direct3D 11 世代の GPU core を搭載しています。
Shader Core 数が少ないだけで、対応 API など機能的には desktop GPU との差が
なくなっています。


CPU の VFP Benchmark の結果はこちら。

  SingleT SP max: 17.136 GFLOPS
  SingleT DP max:  3.431 GFLOPS
  MultiT  SP max: 70.174 GFLOPS
  MultiT  DP max: 14.036 GFLOPS


下記ページにも追加しました。

CPU/GPU OpenGL ES Extension (Mobile GPU)
VFP Benchmark Log


iPhone 5s に遅れることおよそ 1年、
64bit 対応の Android と ARM64 端末がリリースされました。
Nexus 9 の CPU core は NVIDIA の Denver。

Processor	: NVIDIA Denver 1.0 rev 0 (aarch64)
processor	: 0
processor	: 1
Features	: fp asimd aes pmull sha1 sha2 crc32 
CPU implementer	: 0x4e
CPU architecture: AArch64
CPU variant	: 0x0
CPU part	: 0x000
CPU revision	: 0

Hardware	: Flounder
Revision	: 0000
Serial		: 0000000000000000

少々わかりにくいですが "processor" の行が 2つあるので dual core です。

$ cat /sys/devices/system/cpu/online
0-1

vfpbenchmark は下記のとおり。
single core 時の浮動小数点演算能力はほぼ SHILED Tablet (Cortex-A15 2.2GHz)
と同等で、トータル性能では Core 数の分だけ落ちています。
あくまで 32bit の結果なので後ほど 64bit (AArch64) でも試してみたいと思います。

// Nexus 9
ARCH: ARMv7A
CPU core: 2
VFP: VFPv4-D32 NEON
FMA: Yes
NEON: Yes
  SingleT SP max: 17.799 GFLOPS
  SingleT DP max:  4.423 GFLOPS
  MultiT  SP max: 34.582 GFLOPS
  MultiT  DP max:  8.719 GFLOPS


ro.product.cpu.abi=arm64-v8a
ro.product.cpu.abilist=arm64-v8a,armeabi-v7a,armeabi
ro.product.cpu.abilist32=armeabi-v7a,armeabi
ro.product.cpu.abilist64=arm64-v8a

arm64-v8a, armeabi-v7a, armeabi 3つの ABI に対応していました。
Android が現在 NDK でサポートしている ABI は下記の 7種類です。

armeabi       ARMv5TE
armeabi-v7a   ARMv7A VFPv3-D16 softfp (VFPv3-D32, NEON, hard-float)
arm64-v8a     ARMv8A (AArch64)
x86           x86 (IA-32)
x86_64        x64
mips          MIPS32-R1
miips64       MIPS64

ちなみに iOS で開発用の lib を作ると 5種類。

armv7         ARMv7A VFPv3-D32+NEON softfp
armv7s        ARMv7A VFPv4-D32+NEON softfp
arm64         ARMv8A (AArch64)
i386          x86    simulator
x86_64        x86_64 simulator

GPU は OpenGL ES 3.1 の Context を返します。

GL_VERSION: OpenGL ES 3.1 NVIDIA 343.00
GL_RENDERER: NVIDIA Tegra
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10

対応しているテクスチャフォーマットは DXT, ETC1, ETC2/EAC, ASTC 。
詳細は下記ページに掲載しています。

CPU/GPU OpenGL ES Extension (Mobile GPU)


oga at 19:25
Sony SmartWatch3 の vfpbench スコアを送っていただきました。
LG G Watch (LG-W100) よりも速く、実際に 1.2GHz 出ているものと思われます。
またきちんと確認していませんが 2 core 生きている可能性もあります。

// SmartWatch 3 SWR50
// MSM8226 Cortex-A7 1.2GHz x4 (1.2GHz x2?)

ARCH: ARMv7A
CPU core: 4
VFP: VFPv4-D32 NEON
FMA: Yes
NEON: Yes
Result
  SingleT SP max:  2.257 GFLOPS
  SingleT DP max:  1.144 GFLOPS
  MultiT  SP max:  4.946 GFLOPS
  MultiT  DP max:  2.278 GFLOPS

Motorola Moto 360 以外はどれも同じ Snapdragon 400 (MSM8226) の
横並びですが、予想外に違いがあるようです。

device                SoC             CPU       SoCのspec   実質
----------------------------------------------------------------------
LG G Watch   LG-W100  Snapdragon 400  Cortex-A7 1.2GHz x4   0.8GHz x1
LG G Watch R LG-W110  Snapdragon 400  Cortex-A7 1.2GHz x4   ?
Galaxy Gear Live      Snapdragon 400  Cortex-A7 1.2GHz x4   ?
ASUS ZenWatch WI500Q  Snapdragon 400  Cortex-A7 1.2GHz x4   ?
SmartWatch 3 SWR50    Snapdragon 400  Cortex-A7 1.2GHz x4   1.2GHz x2?
Motolora Moto 360     TI OMAP3630     Cortex-A8 1.0GHz x1   1.0GHz x1

同様に Motorola Moto 360 の結果も頂いたので下記にまとめます。
スコアから見てこちらは Cortex-A8 の 1.0GHz で動いているものと見られます。

device (4.4W.2)       SP-ST   DP-ST   SP-MT   DP-MT
-----------------------------------------------------------
LG G Watch LG-W100    1.419   0.742   1.367   0.676  GFLOPS
SmartWatch 3 SWR50    2.257   1.144   4.946   2.278  GFLOPS
Motolora Moto 360     3.739   0.126   3.376   0.125  GFLOPS

  * SP=単精度, DP=倍精度, ST=SingleThread, MT=MultiThread

一見 Moto 360 が一番速いようにみえるかもしれません。
ピーク値で突出しているのは Cortex-A8 が 64bit 幅の NEON ALU を
持っているからです。(Cortex-A7 は 32bit幅)

実際は世代の古い SoC を採用しており Moto360 の CPU Core も数世代前のものです。
倍精度(DP)の結果を見てわかるように、VFP 演算では他の CPU の 1/5 以下の速度となります。
浮動小数点演算を多用している一般的なアプリケーション (NEON未使用) では
おそらく Moto 360 の方が低速でしょう。
この辺りは VFP Bencmark で命令毎の数値を比較するとよくわかります。

詳しいログを下記ページに追加しました

VFP Benchmark Log

もし他のデバイスのログをお持ちの方がいましたらぜひ送ってください。


関連エントリ
Android Wear VFP Benchmark
ndroid Wear LG G Watch (LG-W100) の速度(実測)


oga at 20:29
Raspberry Pi 2 を入手したので使ってみました。
ARM11 の Raspberry Pi と比べると格段に速くなっています。

VFP Benchmark の比較

               CPU       clock       single fp      double fp
----------------------------------------------------------------
Raspberry Pi B ARM1176   0.7GHz x1   0.674 GFLOPS   0.674 GFLOPS
Raspberry Pi 2 Cortex-A7 0.9GHz x4   7.087 GFLOPS   3.472 GFLOPS

ARM11 世代の VFP と比べると core あたり 2.6倍 (単精度時,クロック差含む)。

詳細な結果は下記に追加しました

VFP Benchmark Log

Cortex-A7 は big.LITTLE でも省電力 core として用いられており、
単体の性能はあまり高くありません。

それでもエントリークラスのスマートフォンやタブレットでは
同じ Cortex-A7 Quad core のデバイスが多数リリースされています。
Snapdraogn 400 MSM8926/8226 や MT8125/8389/6582 など、
それなりにバランスが良い構成なのだと思われます。

下記は手持ちライブラリ(flatlib3)のビルド時間の比較です。
36分から 5分半へと現実的な数値になりました。
SD Card の速度に依存するためあまり正確ではないですが、
およそ 6.6倍で公称値通りといえそうです。

                                Clock  core  ISA    RAM    gcc-4.8 clang-3.4
---------------------------------------------------------------------------
(1) Raspberry Pi B ARM1176JZF   0.7GHz x1    armv6l 0.5GB   36m18s
(2) Raspberry Pi 2 Cortex-A7    0.9GHz x4    armv7l   1GB    5m29s
(3) Nexus 7 2012   Cortex-A9    1.3GHz x4    armv7l   1GB    3m42s
(4) Atom Z540      Bonnell      1.8GHz x1+HT x86      2GB    6m23s   6m18s
(5) BayTrail-D J1900 Silvermont 2.0GHz x4    x86_64   8GB    1m30s   1m11s
(6) Athlon-5350    Jaguar       2.0GHz x4    x86_64   8GB    1m33s   1m10s
(7) Core i7-2720QM SandyBridge  2.2GHz x4+HT x86_64  16GB    0m31s   0m24s

・36m18s = 36分18秒
・値は実行時間(3回の平均)。数値が小さい方が高速

Raspberry Pi 2 でそのままビルドすると ARMv6 のバイナリが生成されるため、
gcc-4.8 -march=armv7-a mfpu=neon-vfpv4 のオプションでコンパイルしています。

下記はそれぞれの詳細です。

(1) Raspberry Pi model B
BMC2835 ARM1176JZF 0.7GHz x1
RAM 512MB, SD 16GB
Debian wheezy armv6l (console)


(2) Raspberry Pi 2 model B
BMC2836 Cortex-A7 0.9GHz x4
RAM 1GB DDR2, SD 16GB
Debian wheezy armv7l (console)
gcc-4.8 (-march=armv7-a mfpu=neon-vfpv4)


(3) Nexus 7 (2012)
Tegra 3 T30L Cortex-A9 1.3GHz x4
RAM 1GB DDR3L, 8GB
Ubuntu 13.04 armv7l (console)


(4) VAIO Type P
Atom Z540 Bonnell 1.86GHz x1+HT
RAM 2GB, SSD 64GB
Ubuntu 14.04LTS x86 (console)


(5) Desktop PC
BayTrail-D Celeron J1900 Silvermont 2.0GHz x4
RAM 8GB, HDD
Ubuntu 14.04LTS x86_64


(6) Desktop PC
Athlon-5350 Jaguar 2.0GHz x4
RAM 8GB, HDD
Ubuntu 14.04LTS x86_64


(7) Desktop PC
Core i7-2720QM SandyBridge 2.2GHz x4+HT
RAM 16GB, HDD
Ubuntu 14.04LTS x86_64

GPU 周りは変わっていないようです。下記ページに追加しました。

CPU/GPU OpenGL ES Extension (Mobile GPU)


oga at 21:07
Google の Android TV 端末、Nexus Player を使ってみました。
UI は一般の Android とは大きく異なり TV を意識したもの。
操作は付属のリモコンを使うので Apple TV に似ています。

Google Nexus Player

大きく異なっているのは単体でアプリが動作することで、Google Play Store からダウンロードできます。
ただし専用&対応アプリしか出てこないらしく検索してもタイトルは多くありません。
HOME に並んでるものもゲームとムービー等のコンテンツのみで実用系アプリは無し。
Chrome や GMail なども無く、検索でもこの辺りのアプリが見当たりませんでした。

micro USB 端子があるので PC につなげば adb 接続できます。
開発者メニューを有効にするには設定の端末情報から「 ビルド 」を何度も選択する必要あり。
USB 経由で install した場合は普通の Android アプリも動くようです。
ただし HOME 画面にはアイコンが表示されないため、実行には少々手間がかかります。

 1. 設定 → アプリ → ダウンロードしたアプリ
 2. 一覧から選択してから「開く」

HOME画面に表示させる場合は intent-filter の設定が必要です。

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>

application に isGame="true" があるとアプリではなくゲーム側に分類されます。

<application android:isGame="true">

通常の Android アプリを走らせた場合タッチ操作はできませんが、
vfpbenchmark のように標準の UI を使ったものはリモコンだけで操作できました。
(vfp benchmark の結果はこちら)

また USB Host が有効なので、タッチ操作が必要なアプリでもマウスを繋げばそれなりに使用することが出来ます。
BACK や HOME ボタンはないので、マウスの場合もリモコンは必要になります。

同様に USB を使った接続では PS3 や Xbox360 (USB版) のゲームコントローラも使うことが出来ました。
この辺りも通常の Android 端末と同様です。
専用のゲームパッドがなくてもひと通りゲーム操作できます。
ただし USB 接続は adb と併用できないので、ゲーム開発にはワイヤレスのコントローラが欲しくなります。

下記追加しました

VFP Benchmark Log
CPU/GPU OpenGL ES Extension (Mobile GPU)

GPU は Intel HD Graphics ではなく Apple A7 世代と同じ PowerVR G6430 です。


関連エントリ
Android 5.0 Nexus Player x86 と対応 ABI
iOS7 対応 SteelSeries Stratus ワイヤレスゲームコントローラー
Android 用ゲームパッド BUFFALO Zeemote JS1 H
Android 3.1 と GamePad のイベントの詳細 (2)
Android 3.1 と GamePad のイベントコード


新しい iPod touch 6 は iPhone 4S 相当から 2世代飛んで一気に iPhone 6 世代へ移行しています。最も安価な iOS Device の底上げが行われました。

CPU SoC iPhone iPod iPad iPad mini
Cortex-A9 A5 iPhone 4S iPod touch 5 iPad2/iPad3 mini
Swift A6 iPhone 5/5c -- iPad4 --
Cyclone A7 iPhone 5s -- iPad Air mini2/mini3
Cyclone2 A8 iPhone 6/6p iPod touch 6 iPad Air2 --

GPU も一番新しい PowerVR Series 6XT の世代へ。

GPU PVR iPhone iPod iPad iPad mini
SGX543/554 5XT iPhone 4S/5/5c iPod touch 5 iPad2/iPad3/iPad4 mini
G6430 6 iPhone 5s -- iPad Air mini2/mini3
GX6450/6850 6XT iPhone 6/6p iPod touch 6 iPad Air2 --

RAM 容量も一段上がっています。

RAM iPhone iPod iPad iPad mini
512MB iPhone 4S iPod touch 5 iPad2 mini
1GB iPhone 5/5c/5s/6/6p iPod touch 6 iPad3/iPad4/Air mini2/mini3
2GB -- -- iPad Air2 --

歴代 iOS Device との速度比較は下記の通りです。(vfpbenchmark)

Device SoC CPU Clock S-SP S-DP M-SP M-DP
iPad Air 2 A8X Cyclone2 x3 1.5GHz 23.568 11.751 68.591 33.968
iPhone 5s A7 Cyclone x2 1.3GHz 20.621 10.313 40.871 20.480
iPad mini 2 A7 Cyclone x2 1.3GHz 20.373 10.223 40.616 20.238
iPod touch 6 A8 Cyclone2 x2 1.1GHz 17.964 8.899 35.530 17.775
Mac mini 2009 Core 2 Duo x2 2.0GHz 15.916 6.365 31.662 12.724
iPad 4 A6X Swift x2 1.4GHz 10.855 1.818 21.502 3.573
iPhone 5 A6 Swift x2 1.3GHz 10.094 1.710 20.029 3.398
iPad 2 A5 Cortex-A9 x2 1.0GHz 3.960 0.989 7.830 1.961
iPad mini A5 Cortex-A9 x2 1.0GHz 3.846 0.983 7.800 1.941
iPad 3 A5X Cortex-A9 x2 1.0GHz 3.394 0.983 7.752 1.954
iPod touch 5 A5 Cortex-A9 x2 0.8GHz 3.161 0.790 6.203 1.565
iPod touch 4 A4 Cortex-A8 x1 0.8GHz 3.139 0.112 3.139 0.112

S-SP = Single Thread 単精度  (GFLOPS) いずれも数値が大きいほうが高速
S-DP = Single Thread 倍精度  (GFLOPS)
M-SP = Multi Thread 単精度  (GFLOPS)
M-DP = Multi Thread 倍精度  (GFLOPS)

浮動小数点演算のピーク値だけの比較なので実際のアプリケーションの速度とは異なります。ですが、浮動小数点演算の速度だけでも Apple の公称値である「CPU 速度で 6倍」に近い数値を得ることが出来ました。

M-SP: 35.5 (iPod touch 6) / 6.2 (iPod touch 5) = 5.7倍

また 32bit 世代 (A4~A6) と 64bit 世代 (A7/A8) の間に入る調度良い比較対象だったので Mac mini Early 2009 の結果も載せてみました。もちろん最新の Core i5/i7 には敵いません。Android や Desktop PC 含めた結果を下記に載せています。

VFP Benchmark Log

GPU は ASTC 対応で PowerVR Series6XT (iOS GPUFamily2) を確認。

GL_VERSION: OpenGL ES 3.0 Apple A8 GPU - 53.13
GL_RENDERER: Apple A8 GPU
GL_VENDOR: Apple Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00

Extension:
GL_OES_standard_derivatives
GL_KHR_texture_compression_astc_ldr
GL_EXT_color_buffer_half_float
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_pvrtc_sRGB
GL_EXT_read_format_bgra
GL_EXT_separate_shader_objects
GL_EXT_shader_framebuffer_fetch
GL_EXT_shader_texture_lod
GL_EXT_shadow_samplers
GL_EXT_texture_filter_anisotropic
GL_APPLE_clip_distance
GL_APPLE_color_buffer_packed_float
GL_APPLE_copy_texture_levels
GL_APPLE_rgb_422
GL_APPLE_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc

RAM は 1GB でした。

HW INFO: Machine = iPod7,1
HW INFO: Model = N102AP
HW INFO: Arch = N102AP
HW INFO: ByteOrder = 1234
HW INFO: NCPU = 2
HW INFO: MemSize = 1039306752
HW INFO: UserMem = 862314496
HW INFO: PageSize = 16384
HW INFO: VectorUnit = 0
HW INFO: Float = 0


関連エントリ
iPad Air 2 (Apple A8X) の浮動小数点演算能力
Android x86 Binary Translator を試してみる
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
VFP Benchmark 関連


VFP Benchmark を走らせてみました。

ARCH: ARMv7A
FPU: VFPv4-D32 NEON
SingleT SP max: 0.951 GFLOPS
SingleT DP max: 0.470 GFLOPS
MultiT  SP max: 0.945 GFLOPS
MultiT  DP max: 0.469 GFLOPS
CPU core: 1
NEON: yes
FMA: yes

詳細な結果はこちら。

VFP Benchmark Log

下記は抜粋です。

* VFP/NEON (single fp)               sec     MFLOPS     MFLOPS
--------------------------------------------------------------
VFP fmuls (32bit x1) n8       :    2.649      453.0      453.0
VFP fadds (32bit x1) n8       :    2.557      469.3      469.3
VFP fmacs (32bit x1) n8       :    2.586      928.2      928.2
NEON vmul.f32 (32bit x4) n8   :   10.097      475.4      475.4
NEON vadd.f32 (32bit x4) n8   :   10.182      471.4      471.4
NEON vmla.f32 (32bit x4) n8   :   10.165      944.4      944.4

* VFP/NEON (double fp)               sec     MFLOPS     MFLOPS
--------------------------------------------------------------
VFP fmuld (64bit x1) n8       :   10.164      118.1      118.1
VFP faddd (64bit x1) n8       :    2.554      469.8      469.8
VFP fmacd (64bit x1) n8       :   10.746      223.3      223.3

Single core で VFPv4 と NEON に対応していることがわかります。
ただし NEON でも結果はスカラーと同じ速度しか出ていません。(上の表の MFLOPS)
また倍精度の乗算速度も加算の 1/4 まで落ちています。

これらの特徴を踏まえると Cortex-A7 が使われているものと思われます。速度を見る限り実行クロックは 500MHz 程度でしょう。CPU core 毎の浮動小数点演算能力 (特徴) は下記にまとめています。

CPU の浮動小数点演算能力の詳細

Apple S1 のアプリケーションプロセッサは Android Wear に使われている Snapdragon 400 と比べると少々非力です。CPU core は同じですがクロックはおよそ半分で Single core になります。

↓ 一応 Apple Watch で ChiRaKS 動きました。まだ操作と速度に問題があります。

chiraks_awatch01.png


関連エントリ
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
Android Wear Sony SmartWatch 3 SWR50 は速い
iPad Air 2 (Apple A8X) の浮動小数点演算能力
Android Wear VFP Benchmark
ndroid Wear LG G Watch (LG-W100) の速度(実測)
VFP Benchmark 関連


Amazon Fire TV (2015) で vfpbench を走らせてみました。下記表の MT8173C (上 2つ) が Fire TV です。

SoC CPU clock AArch fop SP DP SP-MT DP-MT
MT8173C Cortex-A72 2.0GHz x2 64 16 15.875 7.946 31.756 15.882
MT8173C Cortex-A72 2.0GHz x2 32 16 15.864 7.934 31.771 15.885
Tegra4 Cortex-A15 1.8GHz x4 32 32 13.371 2.655 51.345 9.860
AppleA7 Cyclone 1.3GHz x2 64 32 20.621 10.313 40.871 20.480
AppleA7 Cyclone 1.3GHz x2 32 32 20.608 4.038 40.924 8.021
TegraK1 Denver 2.3GHz x2 64 24 17.906 8.762 34.888 17.601
TegraK1 Denver 2.3GHz x2 32 24 18.043 4.297 34.177 8.702
(SP/DP/SP-MT/DP-MT の単位は MFLOPS GFLOPS,数値が大きい方が高速)

詳細な結果は下記に追加しています。(big core のみ計測しています)

VFP Benchmark Log

Cortex-A72 はピーク性能に突出したところはなく core あたり 8 fop (単精度 SIMD4 FMA) と標準的。SIMD2 の結果から Cortex-A15 同様 64bit 2pipe の構成であることもわかります。

ただしスカラー命令にはかなり違いがあるようです。Cortex-A72 では NEON だけでなくスカラー命令も 2 pipe 並列に実行できるらしく、加算で Cortex-A15 のおよそ 2倍。これは AArch32 mode でも有効なので、ARMv7A でビルドしたバイナリでも 64bit CPU の方が高速に演算できることになります。

倍精度でも少々面白い結果になっています。AArch64 には倍精度浮動小数点演算の NEON 命令があるものの SIMD でも 2並列です。Cortex-A72 は 64bit x 2pipe なので、ピーク性能において NEON とスカラーの差がなくなっています。

AArch32 でも同じなので、倍精度 NEON 命令が使えない ARMv7A もピーク速度が落ちておらず AArch64 の NEON 相当の速度を維持しています。

下記は倍精度のみの抜粋です。AppleA7/TegraK1 は AArch32 と AArch64 で差が開いていますが Cortex-A72 はスコア差がありません。A7/K1 比でピーク速度で負けているものの AArch32 では逆転していることがわかります。

SoC CPU clock AArch DP DP-MT
MT8173C Cortex-A72 2.0GHz x2 AArch64 7.946 15.882
MT8173C Cortex-A72 2.0GHz x2 AArch32 7.934 15.885
SoC CPU clock AArch DP DP-MT
AppleA7 Cyclone 1.3GHz x2 AArch64 10.313 20.480
AppleA7 Cyclone 1.3GHz x2 AArch32 4.038 8.021
SoC CPU clock AArch DP DP-MT
TegraK1 Denver 2.3GHz x2 AArch64 8.762 17.601
TegraK1 Denver 2.3GHz x2 AArch32 4.297 8.702

CPU の浮動小数点演算能力の詳細


関連エントリ
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
iPad Air 2 (Apple A8X) の浮動小数点演算能力
Android x86 Binary Translator を試してみる
iPhone 5s A7 CPU の浮動小数点演算速度 (2) (arm64/AArch64/64bit)
VFP Benchmark 関連


新しい Apple TV は Apple A8 搭載で Android TV や Fire TV 同様アプリケーション走らせることができるようになっています。vfpbench を試してみました。clock 数から計算すると Apple TV の CPU は 1.4GHz だと思われます。

ARCH: ARMv8A
FPU: AArch64 NEON
SingleT SP max: 22.197 GFLOPS
SingleT DP max: 11.105 GFLOPS
MultiT  SP max: 44.331 GFLOPS
MultiT  DP max: 22.084 GFLOPS
CPU core: 2

詳細は下記に追加しています。

VFP Benchmark Log

同等の TV 用プレイヤーデバイスとの比較。

device CPU SP DP SP-MT DP-MT
Apple TV Cyclone 1.4GHz 2 22.2 11.1 44.3 22.1
Fire TV 2015 Cortex-A72/A53 2.0GHz 2+2 15.9 7.9 31.8 15.9
Nexus Player ilvermont 1.8GHz 4 8.7 2.7 33.9 10.7
(SP/DP/SP-MT/DP-MT の単位は GFLOPS, 数値が大きい方が高速)

GPU は下記の通り

device SoC GPU API ASTC
Apple TV Apple A8 PowerVR GX6450 ES3.0/Metal Y
Fire TV 2015 MT8173C PowerVR GX6250 ES3.1 Y
Nexus Player Atom Z3560 PowerVR G6430 ES3.1 N

SoC/CPU core が異なるもののなぜか GPU はみな PowerVR です。動作クロックは不明ですが型番上は Apple TV の GPU が一番性能が高いことになります。

なお Android TV は Nexus Player 以外にも存在しているため性能にはばらつきがあります。例えば NVIDIA SHILED も Android TV です。

下記ページも更新しました。

Video Game Console スペック一覧

いずれも GameController に対応しており Game Console のような使い方も可能となっています。

Nexus Player, Fire TV は純正の Wireless Game Contoller が用意されていますし、Android に対応した Game Pad を USB 接続することも可能です。特に Fire TV はフルサイズの USB コネクタなので変換アダプタも不要。Apple TV は iOS 仕様の Bluetooth ゲームパッドを使うことができます。

device RAM ROM LAN USB SD 電源
Apple TV 2GB 32/64GB Y Type-C -- 内蔵
Fire TV 2015 2GB 8GB Y USB2.0 microSDXC 専用ACアダプタ
Nexus Player 1GB 8GB N microUSB -- 専用ACアダプタ


apple_tv01.jpg

↑左上から AppleTV, Fire TV, Nexus Player

Apple TV は厚みがある代わりに AC アダプタが不要です。

apple_tv02.jpg

↑付属リモコン 左から Nexus Player, Fire TV, Apple TV

充電式で乾電池が不要な分だけ Apple TV のリモコンは薄型です。Nexus Player, Fire TV はどちらもリング状の方向キーでセンターが決定、左下に Back キー。Apple TV はカーソルの代わりにタッチパッドがついており押し込みで決定。MENU がバックキー相当です。


関連エントリ
ARM Cortex-A72 の浮動小数点演算速度 (Amazon Fire TV)
Amazon Fire TV と OpenGL ES 3.1, TV Stick の OS
Nexus Player を GamePad&Mouse で使う、他
Android 5.0 Nexus Player x86 と対応 ABI