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

OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)

DXT(S3TC/BC) 等、テクスチャ圧縮は基本的に 4×4 pixel 単位で行います。
DXT1~5 (BC1~3) では代表色 2色を RGB565 で格納し、その補間値
3~4 level に対して 2bit の index を持ちます。
これを 4×4 = 16 pixel 分格納します。

代表色 2色   16bit x 2色     = 32bit
Index         2bit x 16pixel = 32bit

16pixel 分の情報が 64bit で収まります。

DXT1(BC1)    64bit    4bpp
RGB565      256bit   16bpp
RGB888      384bit   24bpp

1pixel あたり 2bit の選択しか出来ないので、4×4 block 単位で最大
4種類のカラー値に変換していることになります。
これはその他のテクスチャ圧縮フォーマットでもほぼ同等の制約です。

色変化の差が激しい画像など、4種類のカラー値で表現しきれない場合は
ブロックノイズとして目立つことになります。
これらの欠点を無くするために、後発のフォーマットでは様々な工夫が
行われています。

高画質化のための方針の一つがモード分岐です。
対象とする画像に応じてブロック単位に圧縮アルゴリズムそのものを
変えてしまうわけです。

特に、以前解説した BC6H/BC7 (OpenGL では BPTC) 圧縮フォーマットに
至っては、8または 14 通りものモード分岐が存在しています。
block 分割 mode を含めれば種類はもっと多くなります。

Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (1)
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)

Mobile 系 GPU 、Android 等で使われている ETC1 では、各ブロックをさらに
4×2 のサブブロックに分割します。
各ブロック単位で代表色 1色 + 4段階補間が可能なので、4×4 単位で 8種類の
カラー値を持つことができます。

その代わり色解像度は 4×2 ブロック単位となるため、元画像よりもおよそ
1/8 に低下します。分割方向は block 単位で縦横選べますが、YUV のように
色情報を 4×2 block で共有しているようなものです。

そのため色変化が激しい画像では 4x2block の大きなノイズが生じます。
特にはっきりとした 2色の境界線では ETC1 の劣化が目立ちます。
DXT1 の方がずっと綺麗に出ます。 (2012/08/23追記 実例を載せました)

OpenGL ES 3.0 ではこれらの欠点を克服するために ETC2 が採用されました。

● ETC2 の改善点

(1) ETC1 の block ノイズが出やすいケースを軽減、高画質化
(2) DXT5/3DC-X/3DC-XY (BC3/BC4/BC5) のようなフォーマットバリエーションの追加

(1) 高画質化

ETC1 に対するモード分岐の追加です。
もともとカラー値には 2通りの格納方法がありましたが合計 5 mode 分岐に
増えました。

ETC2 の特徴の一つが ETC1 の上位互換で、bit フォーマットは完全に
互換性があります。
ETC1 の差分 mode のオーバーフローを利用して、存在し得ない bit 並び
になたっときに ETC2 とみなします。

ETC1  444(x4 LV) + 444(x4 LV)      table 3+3 = 30+32= 62bit (4x2 block)
ETC1  555(x4 LV) + diff 333(x4 LV) table 3+3 = 30+32= 62bit (4x2 block)
ETC2  444(x3 LV) + 444             dist  3   = 27+32= 59bit (T-Mode)
ETC2  444(x2 LV) + 444(x2 LV)      dist  3   = 27+32= 59bit (H-Mode)
ETC2  676 + 676 + 676                        = 57bit        (Planar)

ETC1 の上 2つは 4×2 サブブロック分割があり、分割方向を選ぶことができます。
ETC2 の T-Mode/H-Mode はサブブロック分割がありません。
そのため 4×4 block 内で 4値の選択となります。

ETC2 の最後の Planar は 4×4 block で 3色を直に格納します。
index がなく単純なグラデーションのみとなります。
ポリゴンの頂点カラーをグーロー補間するような感じです。

まだ実際に画像で試していませんが、サブブロック分割が無くなったため
斜め線など 2色の境界は表現できるようになっているようです。

(2) フォーマットバリエーションの追加

ETC1 は RGB しか格納できず alpha カラー値が含まれる場合 GPU
固有の圧縮フォーマットを用いる必要がありました。
ETC2 は 単チャンネル圧縮フォーマット EAC との組み合わせで DXT5(BC3)
のような使い方ができます。

ETC2 RGB                 4bpp    DXT1/BC1
ETC2 RGB + Alpha 1bit    4bpp    DXT1/BC1
ETC2 RGB + Alpha EAC     8bpp    DXT5/BC3
EAC                      4bpp    3DC-X/BC4
EAC + EAC                8bpp    3DC-XY/BC5

DXT1 は Alpha 1bit のあり無しを 4×4 block 単位で選ぶことができました。
ETC2 では別フォーマット扱いとなります。
ETC1 互換モードの mode 選択 bit を流用するため ETC1 時に 1 mode 減ります。
EAC は BC4/5 同様 pixel あたり 3bit の情報を持ち、8段階選択できます。
ただしベース値を元に 11bit 相当の補間が可能となっているようです。

●その他の新テクスチャフォーマット

・PVRTC2 (PVRTCII)

ETC2 同様に PVRTC とほぼ互換性を保ちつつ、ほとんど使われることが
なかった bit を利用してモード分岐が追加されています。
4 mode あるようですが詳しい構造はわかりません。
すでにツールがあるので比較できますが、従来苦手だった画像でも良くなっており
かなり画質向上が見込めるようです。

・ASTC

ETC2 とそのバリエーションによって OpenGL ES 3.0 では S3TC(DXT) BC1~5
相当をカバーできるようになりました。
ASTC はさらにその上を狙ったもので、HDR対応などを考えるとおそらく
BC6H/BC7 (BPTC) の対抗フォーマットではないかと思います。

圧縮サイズの単位が 128bit なのも BC6H/BC7 (BPTC) と同じです。

block 圧縮のテクスチャフォーマットの方向性の一つがモード分岐の
増加ですが、ASTC はさらにブロックサイズが可変となりました。

PVRTC の 2bpp mode は、通常 4×4 サイズであるブロックを 8×4 に拡張する
ことで実現しています。8×4 = 32block では index が足りないため、
実質 32pixel で 2色の選択になります。

ASTC では可変 block サイズを汎用化しており、mode 分岐だけでなく
より効率の良い 8bpp 未満の圧縮率も同時に実現しているようです。

後ほどもう少し詳しく調べてみたいと思っています。

(2012/08/23追記 :OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC)

関連エントリ
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (1)
OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
OpenGL の圧縮テクスチャ (2) 法線圧縮
Android OpenGL ES 2.0 の圧縮テクスチャ

OpenGL ES 2.0/3.0 Emulator

OpenGL 4.x の GL_ARB_ES2_compatibility を用いる場合 Windows では
WGL との組み合わせになります。

AMD の GPU は OpenGL ES 2.0 driver を提供しており、GL ES2 API を
native に呼び出すことが可能です。
Emulator 系 lib と同じように EGL を利用できるため、互換性を保ちやすくなります。

x64 でも動くので以前から試していますが、より便利な lib (SDK) も提供されていました。

AMD OpenGL ES SDK

2012/08/13現在

GL4            ES2  WGL   x86/x64
GL4.4          ES3  WGL   x86/x64
AMD            ES2  EGL   x86/x64   libEGL/libGLESv2
Angle Project  ES2  EGL   x86/x64   libEGL/libGLESv2
PVR Emu        ES2  EGL   x86/x64   libEGL/libGLESv2
Adreno Emu     ES2  EGL   x86       libEGL/libGLESv2
Adreno Emu     ES3  EGL   x86       libEGL/libGLESv3
Mali Emu       ES2  EGL   x86       libEGL/libGLESv2
Mali Emu       ES3  EGL   x86       libEGL/libGLESv2
Tegra Emu      ES2  EGL   x86       libGLESv20

GL4 ES2/3 と Tegra Emu 以外は ABI が同一なので libEGL/libGLESv2 を
取り替えて使うことができます。

Angle Project の新しいバージョンは GL_ANGLE_depth_texture が
追加されており shadow map も使えるようになりました。

angleproject

Angle を VisualStudio 2010 で x64 向けにビルドすると size_t のキャストで
エラーが出ます。
このエラーは Disable Specific Warnings に 4267 を追加してとりあえず
無視することができます。
Debug 版だと log を出力するため低速です。
利用する場合は必ず Release ビルドにしておきます。

関連エントリ
Desktop の OpenGL ES 2.0 実行環境
GeForce/RADEON で OpenGL ES 2.0 を動かす
OpenGL ES 2.0 Emulator

OpenGL 4.3 と GL_ARB_ES3_compatibility

NVIDIA の beta driver 305.53 で OpenGL 4.3 を試してみました。
以下は GL_ARB_ES3_compatibility を走らせた結果です。
すでに ETC2/EAC が利用可能となっていることがわかります。

GL_VERSION: OpenGL ES 3.0 305.53
GL_RENDERER: GeForce GTX 560 Ti/PCIe/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00

TextureFormat 23
tc[00]=83f0  GL_COMPRESSED_RGB_S3TC_DXT1_EXT
tc[01]=83f2  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
tc[02]=83f3  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
tc[03]=8b90  GL_PALETTE4_RGB8
tc[04]=8b91  GL_PALETTE4_RGBA8
tc[05]=8b92  GL_PALETTE4_R5_G6_B5
tc[06]=8b93  GL_PALETTE4_RGBA4
tc[07]=8b94  GL_PALETTE4_RGB5_A1
tc[08]=8b95  GL_PALETTE8_RGB8
tc[09]=8b96  GL_PALETTE8_RGBA8
tc[10]=8b97  GL_PALETTE8_R5_G6_B5
tc[11]=8b98  GL_PALETTE8_RGBA4
tc[12]=8b99  GL_PALETTE8_RGB5_A1
tc[13]=9274  GL_COMPRESSED_RGB8_ETC2
tc[14]=9275  GL_COMPRESSED_SRGB8_ETC2
tc[15]=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
tc[16]=9277  GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
tc[17]=9278  GL_COMPRESSED_RGBA8_ETC2_EAC
tc[18]=9279  GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
tc[19]=9270  GL_COMPRESSED_R11_EAC
tc[20]=9271  GL_COMPRESSED_SIGNED_R11_EAC
tc[21]=9272  GL_COMPRESSED_RG11_EAC
tc[22]=9273  GL_COMPRESSED_SIGNED_RG11_EAC

ちなみに 305.53 の OpenGL 4.3 でも ETC2/EAC は有効です。

GL_VERSION: 4.3.0
GL_RENDERER: GeForce GTX 560 Ti/PCIe/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: 4.30 NVIDIA via Cg compiler

pconst=2048 vconst=4096 vin=16 vout=124 ptex=32 vtex=32 combotex=192 maxrender=16384 maxtexsize=16384 cubetexsize=16384 viewdims=16384
blocks ver=14 frag=14   blocksize=65536 combined=84
geometry  const=2048 tex=32 block=14  out=1024 outT=1024  comb=231424
tess ctrl const=2048 tex=32 block=14  out=128 outT=4216 in=128 comb=231424
tess eval const=2048 tex=32 block=14  out=128 patch=120 in=128 comb=231424

TextureFormat 23
tc[00]=83f0  GL_COMPRESSED_RGB_S3TC_DXT1_EXT
tc[01]=83f2  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
tc[02]=83f3  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
tc[03]=8b90  GL_PALETTE4_RGB8
tc[04]=8b91  GL_PALETTE4_RGBA8
tc[05]=8b92  GL_PALETTE4_R5_G6_B5
tc[06]=8b93  GL_PALETTE4_RGBA4
tc[07]=8b94  GL_PALETTE4_RGB5_A1
tc[08]=8b95  GL_PALETTE8_RGB8
tc[09]=8b96  GL_PALETTE8_RGBA8
tc[10]=8b97  GL_PALETTE8_R5_G6_B5
tc[11]=8b98  GL_PALETTE8_RGBA4
tc[12]=8b99  GL_PALETTE8_RGB5_A1
tc[13]=9274  GL_COMPRESSED_RGB8_ETC2
tc[14]=9275  GL_COMPRESSED_SRGB8_ETC2
tc[15]=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
tc[16]=9277  GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
tc[17]=9278  GL_COMPRESSED_RGBA8_ETC2_EAC
tc[18]=9279  GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
tc[19]=9270  GL_COMPRESSED_R11_EAC
tc[20]=9271  GL_COMPRESSED_SIGNED_R11_EAC
tc[21]=9272  GL_COMPRESSED_RG11_EAC
tc[22]=9273  GL_COMPRESSED_SIGNED_RG11_EAC

ETC2 は ETC1 と上位互換なので、Desktop GPU でも ETC1 による描画が
可能となります。

ETC1 は 4×2 pixel あたり 1色しか使えませんでしたが、
ETC2 では DXT 同様 4×4 で 2色使えるよう拡張されています。
単純なグラデーション限定ですが独立した 3色の指定も可能です。

EAC との組み合わせでほぼ DXT1/DXT5/3DC の代用が可能なので、
今後は共通の圧縮テクスチャフォーマットとして ETC2 が使われて
いくのかも知れません。

より詳細な extension はこちらに追記しました。

Mobile GPU の OpenGL Extension
Desktop GPU の OpenGL Extension

GLSL の version は、OpenGL と OpenGL ES で見事に重ならないように
なっています。

OpenGL ES 2.0    GLSL ES 1.0     #version 100      (GLSL 1.1+)
OpenGL 2.0       GLSL 1.1        #version 110
OpenGL 2.1       GLSL 1.2        #version 120
OpenGL 3.0       GLSL 1.3        #version 130
OpenGL 3.1       GLSL 1.4        #version 140
OpenGL 3.2       GLSL 1.5        #version 150
OpenGL ES 3.0    GLSL ES 3.0     #version 300 es   (GLSL 3.3-)
OpenGL 3.3       GLSL 3.3        #version 330
OpenGL 4.0       GLSL 4.0        #version 400
OpenGL 4.1       GLSL 4.1        #version 410
OpenGL 4.2       GLSL 4.2        #version 420
OpenGL 4.3       GLSL 4.3        #version 430

OpenGL ES 3.0 Emulator も出ています。

Mali Developer Center: OpenGL ES 3.0 Emulator
QDevNet : Mobile Gaming & Graphics Optimization (Adreno™)

GL_VERSION: OpenGL ES 3.0
GL_RENDERER: OpenGL ES Emulator Revision r2p0-00rel0
GL_VENDOR: ARM Ltd.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00

pconst=512 vconst=1024 vin=16 vout=31 ptex=32 vtex=32 combotex=192 maxrender=16384 maxtexsize=16384 cubetexsize=16384 viewdims=16384

TextureFormat 10
tc[00]=9270  GL_COMPRESSED_R11_EAC
tc[01]=9272  GL_COMPRESSED_RG11_EAC
tc[02]=9274  GL_COMPRESSED_RGB8_ETC2
tc[03]=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
tc[04]=9278  GL_COMPRESSED_RGBA8_ETC2_EAC
tc[05]=9271  GL_COMPRESSED_SIGNED_R11_EAC
tc[06]=9273  GL_COMPRESSED_SIGNED_RG11_EAC
tc[07]=9279  GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
tc[08]=9277  GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
tc[09]=9275  GL_COMPRESSED_SRGB8_ETC2

Adreno は ETC2 がありませんでした。

GL_VERSION: OpenGL ES 3.0 Confetti Special Effects Build 01
GL_RENDERER: Qualcomm OpenGL ES 3.0 Emulator
GL_VENDOR: Qualcomm
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 3.00

pconst=224 vconst=256 vin=15 vout=8 ptex=8 vtex=1 combotex=9 maxrender=2048 maxtexsize=1024 cubetexsize=1024 viewdims=2048

TextureFormat 16
tc[00]=8c92  GL_ATC_RGB_AMD
tc[01]=8c93  GL_ATC_RGBA_EXPLICIT_ALPHA_AMD
tc[02]=87ee  GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD
tc[03]=87f9  GL_3DC_X_AMD
tc[04]=87fa  GL_3DC_XY_AMD
tc[05]=8d64  GL_ETC1_RGB8_OES
tc[06]=8b90  GL_PALETTE4_RGB8
tc[07]=8b91  GL_PALETTE4_RGBA8
tc[08]=8b92  GL_PALETTE4_R5_G6_B5
tc[09]=8b93  GL_PALETTE4_RGBA4
tc[10]=8b94  GL_PALETTE4_RGB5_A1
tc[11]=8b95  GL_PALETTE8_RGB8
tc[12]=8b96  GL_PALETTE8_RGBA8
tc[13]=8b97  GL_PALETTE8_R5_G6_B5
tc[14]=8b98  GL_PALETTE8_RGBA4
tc[15]=8b99  GL_PALETTE8_RGB5_A1

HONEY BEE 101K PowerVR SGX543MP2 SH-Mobile APE5R

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 をあまり活かしきれていないのが少々残念でした。

Android SXZ-PD10 Cortex-A5 の速度

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 の速度