Archives

December 2010 の記事

Android 端末 ZEN Touch2 は低価格ながら i.MX51 を搭載しており
CPU core は ARM Cortex-A8 であることがわかりました。
ARMv7 アーキテクチャなので ARM11 (ARMv6) 系のスマートフォンより高速に
動作すると考えられます。

Creative ZEN Touch 2

ところが ZENTouch2 は armeabi-v7a で build した NDK のアプリケーションを
インストールすることができませんでした。
armeabi なら OpenGL ES 2.0 を使っていても実行出来ることが分かっています。


●NDK とアーキテクチャ

現在の Android NDK r5 は 2つの ARM アーキテクチャに対応しています。

・armeabi      ARMv5TE
・armeabi-v7a  ARMv7

armeabi (ARMv5TE) と比べた場合 armeabi-v7a (ARMv7) のメリットは下記の通り。

・1. VFP (fpu) が使用可能。ハードウエアによる浮動小数演算
・2. Thumb-2 命令セット対応
・3. NEON (SIMD) 命令を利用可能。
・4. ARMv6 以降の新しい命令が使用可能。

4. でいえば、例えばスレッド間の同期に使う ldrex, strex 命令があります。
Compare And Swap 等のアトミック命令を作成できるので、これを使って
様々な同期オブジェクトを作ります。

Thumb-2 は Thumb 同様コード容量を抑えつつも、浮動小数演算など ARM (32bit)
相当の命令が利用出来るよう拡張されています。

特にメリットあるのは VFP/NEON かもしれません。
Android でも VFP 前提でネイティブなコードを書くことが可能となります。


●NDK と ARMv7 の浮動小数演算

NDK では armeabi-v7a (ARMv7) の場合少なくとも VFPv3-D16 対応であると
みなしています。

VFPv3 には 2つのバリエーションがあります。

 ・VFPv3-D16
 ・VFPv3-D32

VFPv3 は 32個の単精度浮動小数レジスタを持っています。

・単精度 32bit レジスタ s0~s31
・倍精度 64bit レジスタ d0~d15

+---------+---------+---------+-  -+---------+
| d0      | d1      | d2      |    | d15     |
+----+----+----+----+----+----+ ~ +----+----+
| s0 | s1 | s2 | s3 | s4 | s5 |    | s30| s31|
+----+----+----+----+----+----+-  -+----+----+

↑倍精度レジスタと単精度レジスタは上記のように共有されます。

倍精度レジスタは 16個ですがレジスタフィールドは 5bit あるため
命令上は倍精度レジスタを 2倍に増やすことが可能です。

+---------+---------+-  -+---------+-   -+---------+---------+
| d0      | d1      |    | d15     |     | d30     | d31     |
+----+----+----+----+ ~ +----+----+ ~ -+---------+---------+
| s0 | s1 | s2 | s3 |    | s30| s31|
+----+----+----+----+-  -+----+----+

↑このように倍精度レジスタを 2倍に増やしたのが VFPv3-D32 となります。

NEON 命令を実装している場合 128bit の SIMD レジスタが 16個あります。
レジスタは VFP と共有されるため、NEON 命令が使える CPU では自然に
VFPv3-D32 相当となります。

+-------------------+-  -+-------------------+-  -+-------------------+
| q0                |    | q7                |    | q15               |
+---------+---------+    +---------+---------+    +---------+---------+
| d0      | d1      | ~ | d14     | d15     | ~ | d30     | d31     |
+----+----+----+----+    +----+----+----+----+   -+---------+---------+
| s0 | s1 | s2 | s3 |    | s28| s29| s30| s31|
+----+----+----+----+-  -+----+----+----+----+

よって Android NDK の場合は armeabi-v7a 選択時は下記の 2種類存在して
いることになります。

(1) VFP のみの場合は VFPv3-D16
(2) NEON 対応時の VFP は VFPv3-D32

実際に調べた結果は下記のとおり

(1) VFP のみ (VFPv3-D16)
 ・Tegra2 Cortex-A9 MPCore

(2) VFP+NEON (VFPv3-D32)
 ・Cortex-A8 各種
 ・Scorpion (Snapdragon)


●armeabi まとめ

abi          arch     浮動小数       SIMD
--------------------------------------------------
armeabi      ARMv5TE  なし           なし
armeabi-v7a  ARMv7    VFPv3-D16      なし
armeabi-v7a  ARMv7    VFPv3-D32      NEON

armeabi と armeabi-v7a はバイナリを分けることが可能です。
両方のバイナリを含んでいる実行ファイルは fat binary と呼ばれているようです。
ARMv7 時に NEON 命令対応かどうかの判定は x86 の SSE のように実行時に行います。


●abi の指定方法

NDK を使ったコードは、プロジェクトの jni フォルダに配置します。
ここに c/cpp コードと Android.mk を置いて NDK 付属の ndk-build コマンドを
実行します。

例えば NDK 付属サンプルをビルドするなら下記のように実行します。
(Windows + cygwin 利用時に NDK を c:/sdk/android-ndk-r5 に展開したと仮定)

 $ cd /cygdrive/c/sdk/android-ndk-r5
 $ cd samples/hello-gl2
 $ ../../ndk-build

armeabi-v7a を指定するには下記のようにします。

 $ ../../ndk-build TARGET_ARCH_ABI=armeabi-v7a

jni フォルダに Application.mk を作成し、下記の 1行を書いておけば
無指定でも armeabi-v7a になります。

# Application.mk

APP_ABI := armeabi-v7a

下記のように記述すれば両対応の fat binary になります。

# Application.mk

APP_ABI := armeabi armeabi-v7a

NEON 対応で build するには Android.mk に "LOCAL_ARM_NEON := true" を加えます。

Windows 上の cygwin 経由だと make が遅いので、自分で build system を
構築するのもありかもしれません。


●互換性

ARMv7 アーキテクチャの端末でも ARMv5TE の armeabi のバイナリを実行できます。
上位互換性が保たれています。

1. もし armeabi-v7a の lib があればそれを使う。
2. なければ armeabi の lib を読み込む。

ARM11 のように ARMv6 アーキテクチャの場合は常に armeabi (ARMv5TE) が
選択されます。残念ながら ARMv6 の命令や機能は利用できません。

例えば ARM11 の CPU Core で VFP を搭載していたとしても VFP 命令を
活用できないことになります。

同じ ARM11 で比べた場合、c/cpp コード移植時は VFP が使える iOS の方が
高速に動作する可能性があります。

ただしこれはあくまで Android の NDK を使ったアプリケーションの話です。
カーネルや Java コードが ARMv6/VFP の機能を活用していないわけではありません。


●CPU Features

NDK には ARMv7 向けに NEON 対応などの CPU Feature を判定するコードが
付属しています。

ソースを見ると、単に /proc/cpuinfo を読み出して Features の行を見ているだけ
であることがわかります。
"vfp" や "neon" といった文字列そのもので判断しています。


●ZEN Touch2

ZEN Touch2 は Cortex-A8 搭載ですが cpuinfo の Features に "vfp" は
あるものの "neon" が含まれていません。

同じ i.MX51 を搭載している NetWalker も全く同様で "neon" がありませんが
NEON 命令をコンパイルすると実行することが出来ます。
(過去のエントリ参照)

よって ZEN Touch 2 も NEON 命令自体には対応していると考えられます。
Features に "neon" が含まれていないのは i.MX51 の何らかの事情によるもの
でしょうか。

また ZENTouch2 で armeabi-v7a のバイナリを install 出来ない理由も
分かっていません。


関連エントリ
Android ZEN Touch 2 の CPU/GPU その2
Creative ZiiO 7 ZMS-08 GPU と OpenGL ES 2.0
Tegra2 Cortex-A9 と浮動小数演算
Snapdragon と浮動小数演算速度
ARM Cortex-A8 の NEON と浮動小数演算最適化
NetWalker PC-Z1 Cortex-A8 (ARM) 浮動小数演算の実行速度


以前 Netwalker に似ていると書きましたが本当に Freescale i.MX51 でした。

CPU: Cortex-A8 800MHz
GPU: AMD Z430 166MHz
RAM: 256MB?

RAM 容量は "192MB total" と書かれてますが、同じ i.MX51 の Netwalker の
場合は VRAM を除いた値となっており、かつ meminfo と差が少ないことから
他に VRAM 分確保されている可能性があります。
確証はありません。


Linux version 2.6.28 (kernel@localhost.localdomain) (gcc version 4.1.2) #35
CPU: ARMv7 Processor [412fc085] revision 5 (ARMv7), cr=10c5387f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: ZEN Touch 2
Memory policy: ECC disabled, Data cache writeback
On node 0 totalpages: 49152
free_area_init_node: node 0, pgdat c04c7190, node_mem_map c0556000
  DMA zone: 96 pages used for memmap
  DMA zone: 0 pages reserved
  DMA zone: 12192 pages, LIFO batch:1
  Normal zone: 288 pages used for memmap
  Normal zone: 36576 pages, LIFO batch:7
  Movable zone: 0 pages used for memmap
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 48768
Kernel command line: console=ttymxc0,115200 init=/init androidboot.console=ttymxc0
MXC IRQ initialized
PID hash table entries: 1024 (order: 10, 4096 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 192MB = 192MB total
Memory: 189044KB available (4416K code, 757K data, 248K init)
SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Calibrating delay loop... 799.53 BogoMIPS (lpj=3997696)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 688 bytes
regulator: core version 0.5
NET: Registered protocol family 16
CPU is i.MX51 Revision 3.0
MXC GPIO hardware
Camera module power off
IRAM READY
mxc_pwm_device registered
GGC not detected
Using SDMA I.API
MXC DMA API initialized
~


*meminfo
MemTotal:         189648 kB
MemFree:           44072 kB
Buffers:            5488 kB
Cached:            60248 kB
SwapCached:            0 kB
Active:            39536 kB
Inactive:          75316 kB
Active(anon):      25152 kB
Inactive(anon):    41320 kB
Active(file):      14384 kB
Inactive(file):    33996 kB
Unevictable:         360 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         49488 kB
Mapped:            16036 kB
Slab:               5120 kB
SReclaimable:       2096 kB
SUnreclaim:         3024 kB
PageTables:         4380 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       94824 kB
Committed_AS:    1147952 kB
VmallocTotal:     647168 kB
VmallocUsed:       81060 kB
VmallocChunk:     540668 kB


*clocks
gpu3d_clk-0         axi_a_clk-0         ___TH_    1   166250000 (166MHz)
~
cpu_clk-0           pll1_sw_clk-0       ______    1   800000000 (800MHz)

周波数はおそらくこの辺。アイドル時 200MHz, 負荷をかけると 800MHz。


関連エントリ
Android ポータブルプレイヤー ZEN Touch 2 も使ってみた
Creative ZiiO 7 使ってみた
Creative ZiiO 7 ZMS-08 GPU と OpenGL ES 2.0
Android LuvPad AD100 を1日持ち歩いた


Tablet 型の ZiiO に対して ZEN Touch2 はポータブルプレイヤー型です。
言ってしまえば Android 版 iPod touch のようなもの。

Creative ZEN Touch 2

スペックは当初 ZMS-05 かと思って全く期待していなかったのですが、
どうやら違うようです。

android_tab.jpg
↑下から LuvPad AD100, ZiiO7, 上左DesireX06HT, 上右 ZEN Touch 2
Desire の方が一回り小さい。


●デバッガの接続

LuvPad や ZiiO7 と同じように直接 Android SDK の中の

usb_driver/android_winusb.inf

を書き換えました。3機種分の定義は下記のとおり。

;NVIDIA Tegra (LuvPad)
%SingleAdbInterface%        = USB_Install, USB\VID_0955&PID_7000
%CompositeAdbInterface%     = USB_Install, USB\VID_0955&PID_7100&MI_01
;
; Creative ZiiO7
%SingleAdbInterface%        = USB_Install, USB\VID_2350&PID_0102
%CompositeAdbInterface%     = USB_Install, USB\VID_2350&PID_0102&MI_01
;
; Creative ZEN Touch2
%SingleAdbInterface%        = USB_Install, USB\VID_041E&PID_4166
%CompositeAdbInterface%     = USB_Install, USB\VID_041E&PID_4166&MI_01

[Google.NTx86] と [Google.NTamd64] の最後に上の 11行を追加しています。


●GPU と CPU

ZMS-05 は ARM9 (ARMv5TE) dual のはずですが、ZEN Touch2 は
ARMv7 アーキテクチャ 800MHz のようです。

Processor       : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 199.88
Features        : swp half thumb fastmult vfp edsp
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x2
CPU part        : 0xc08
CPU revision    : 5

Hardware        : ZEN Touch 2
Revision        : 51030
Serial          : 0000000000000000

GPU も完全に予想外で AMD Z430 (Adreno 200) でした。

Mobile CPU/GPU

過去に調べた結果(上)と比較すると、Ubuntu 上ですが NetWalker
i.MX515 の結果によく似てます。
周波数から見ても CPU は Coretex-A8 の可能性が高いです。

RAM 容量はおそらく 256MB 程度と思われます。



●NDK

ARMv7 ですが march=armv7-a では apk が install できなかったので
armv5te でビルドを通しました。

メジャーな GPU なせいか、ZMS-08 と違いすんなり GLES 2.0 も動きました。

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: AMD Z430
GL_VENDOR: Advanced Micro Devices, Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00


Extension:
GL_AMD_compressed_3DC_texture
GL_AMD_compressed_ATC_texture
GL_AMD_performance_monitor
GL_AMD_program_binary_Z400
GL_AMD_tiled_rendering
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_type_2_10_10_10_REV
GL_EXT_bgra
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_compressed_paletted_texture
GL_OES_depth_texture
GL_OES_depth24
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_element_index_uint
GL_OES_fbo_render_mipmap
GL_OES_fragment_precision_high
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_rgb8_rgba8
GL_OES_standard_derivatives
GL_OES_texture_3D
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_vertex_type_10_10_10_2
GL_NV_fence 

TextureFormat 16
tc[00]=87f9  GL_3DC_X_AMD
tc[01]=87fa  GL_3DC_XY_AMD
tc[02]=8c92  GL_ATC_RGB_AMD
tc[03]=8c93  GL_ATC_RGBA_EXPLICIT_ALPHA_AMD
tc[04]=87ee  GL_ATC_RGBA_INTERPOLATED_ALPHA_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

ZiiO 7inch の結果はこちら
Creative ZiiO 7 ZMS-08 GPU と OpenGL ES 2.0


2010/12/29 3:29 追記: Freescale i.MX51 確定。Netwalker と同じです。


関連エントリ
Creative ZiiO 7 ZMS-08 GPU と OpenGL ES 2.0
OpenGL ES 2.0 世代の Mobile GPU
Android LuvPad AD100 を1日持ち歩いた


ZiiO 7inch 手に入れました。

Creative ZiiO 7

LuvPad のように回線契約なしに買える Android タブレットです。

特徴は比較的安価なこと。8GB モデルで 24800円。
その代わり抵抗膜式タッチパネルを使っておりマルチタッチも非対応です。

LuvPad と違い HOME 画面は独自で、さまざまな Zii アプリケーションが用意
されています。


●気がついたことなど簡単に

・HDMI端子あり
・Android マーケット無し
・ボタン類もタッチ式、抵抗膜パネルの一部
・タッチパネルのキャリブレーション
  設定 → サウンド&画面設定→ Touch screen calibration
・ZiiAcademy というブックリーダー付き。
・タスクマネージャーが最初から入ってる
・RAM 512MB
・タッチパネル反応は慣れると良好
使用感などは後ほど


●デバッガの接続

adb 接続は下記のページを参考にさせていただきました。

でじものがたり Creative ZiiO 7"のフォント変更(再度更新)

同様の手順を以前 LuvPad の時も行いました。下記のページも参考になります。

Developing on a Device


●NDK と GPU

CPU はごく普通の Cortex-A8 1GHz です。
もちろん NEON + VFPv3-D32 です。

GPU は ZiiLabs のオリジナル。
テストプログラムを走らせてみました。

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: ZMS-08
GL_VENDOR: ZiiLABS
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.0


Extension:
  GL_OES_read_format
  GL_OES_compressed_paletted_texture
  GL_OES_byte_coordinates
  GL_OES_fixed_point
  GL_OES_single_precision
  GL_OES_matrix_get
  GL_OES_point_size_array
  GL_OES_point_sprite
  GL_EXT_texture_compression_dxt
  GL_EXT_texture_compression_dxt1
  GL_ZIILABS_fog_mask
  GL_EXT_texture_lod_bias
  GL_EXT_blend_func_separate
  GL_OES_blend_func_separate
  GL_APPLE_texture_2D_limited_npot
  GL_OES_query_matrix
  GL_OES_draw_texture
  GL_OES_element_index_uint
  GL_OES_matrix_palette
  GL_OES_extended_matrix_palette
  GL_OES_compressed_ETC1_RGB8_texture
  GL_OES_framebuffer_object
  GL_OES_rgb8_rgba8
  GL_OES_depth32
  GL_OES_stencil8
  GL_OES_mapbuffer 


tc[00]=8b90  GL_PALETTE4_RGB8
tc[01]=8b91  GL_PALETTE4_RGBA8
tc[02]=8b92  GL_PALETTE4_R5_G6_B5
tc[03]=8b93  GL_PALETTE4_RGBA4
tc[04]=8b94  GL_PALETTE4_RGB5_A1
tc[05]=8b95  GL_PALETTE8_RGB8
tc[06]=8b96  GL_PALETTE8_RGBA8
tc[07]=8b97  GL_PALETTE8_R5_G6_B5
tc[08]=8b98  GL_PALETTE8_RGBA4
tc[09]=8b99  GL_PALETTE8_RGB5_A1
tc[10]=8d64  GL_ETC1_RGB8_OES
tc[11]=83f0  GL_COMPRESSED_RGB_S3TC_DXT1_EXT
tc[12]=83f1  GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
tc[13]=83f2  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
tc[14]=83f3  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT

Tegra2 のように DXT 対応です。
ETC も使えます。

VertexShader constant: 128
FragmentShader constant: 16

・頂点テクスチャあり
・shader binary format あり


自前のアプリを移植しましたがシェーダーを読み込んだところで止まります。
ndk サンプルの hello-gl2 も Shader の Link error が出て描画されず
まだうまく動いていません。

GL ES 1.1 のアプリは動いているようです。
速度はものすごく速いといった印象はないです。
OS の違いもあるかもしれません。


●GPU 等のまとめ

これまで試した GPU や CPU をまとめました。

OpenGL ES 2.0 モバイル GPU CPU

Android 端末の一覧をこちらに作ってみました。WindowsCE 一覧 の続きのようなもの。

Android 端末一覧


関連エントリ
OpenGL ES 2.0 世代の Mobile GPU
Android LuvPad AD100 を1日持ち歩いた


iOS, Android 共に数多くの端末が登場していますが、CPU は ARM アーキテクチャ、
GPU は OpenGL ES 2.0 世代でほぼ統一されています。

iOS の場合 ES 2.0 世代の GPU は 1種類のみ。
Android の場合は調べてみると予想以上に多彩なことがわかります。
完全に 2強(+1)のデスクトップ GPU と違い、まるで DirectX 初期の頃のように
さまざまなメーカーが参入しています。

iOS:
CPU
    Cortex-A8

GPU 
    PowerVR SGX 535


Android OS:
CPU
    ARM11      ARMv6 (MSM7227)
    Cortex-A8  ARMv7 (S5PC110/ZMS-08)
    Scorpion   ARMv7 (Snapdragon)
    Cortex-A9  ARMv7 (Tegra2)

GPU
    Adreno 200       (Snapdragon QSD8x50/MSM7227)
    Adreno 205       (Snapdragon QSD8x55)
    PowerVR SGX 540  (S5PC110)
    Tegra 250 GPU    (Tegra2)
    ZMS-08 GPU       (ZMS-08)

ATI/AMD のモバイルチップだった Imageon Z430/460 は、Qualcomm になってから
名称が変更されているようです。

Qualcomm Adreno developer
Wikipedia Imageon
Wikipedia Snapdragon (processor)

Adreno のステートを見ると、テクスチャの ATC サポートなど ATI の影響が
残っています。
現行のスマートフォンでは Adreno 200 を搭載した QSD8x50 が多いですが、
HTC Desire HD 001HT の QSD8255 など、今後 Adreno 205 搭載機も
増えてくると思われます。
Z430(200?) が思ったよりも速度を引き出しづらい特性だったので 205 には
期待しています。


昨日ニュースに出ていた Creative の ZiiO は独自のプロセッサ ZMS-08 を
採用しています。

クリエイティブ、Androidメディアプレーヤーを国内販売
Zii LABS

開発はあの 3DLABS (ZiiLABS) なので気になる存在です。


進化速度が速いので、モバイル向け GPU の 3D 性能も大きく向上していく
ものと予想されます。