Archives

November 2014 の記事

10月に Android 4.4W.2 への更新が行われ、Android Wear に音楽再生機能が付きました。
ところが説明通りに行っても、Google Play ミュージック ではアカウントの制限なのか
設定が見当たらずデータを転送することができませんでした。
せっかく Bluetooth ヘッドホンをペアリングしたのに活用できなかったので、
簡単な音楽再生アプリを作ってみました。

Music Player for Android Wear (Google Play)
Music Player for Android Wear (詳細説明)

任意のファイルを Android Wear デバイスに転送して音楽を再生することができます。
一度データを転送してしまえば親機 (スマートフォンやタブレット) が無くても
構いません。時計 (Androd Wear) だけでプレイヤーになります。

動作確認は LG G Watch (LG-W100) で行っています。


● 再生するまで

Andorid Wear デバイスにはヘッドホン端子が無いため Bluetooth 接続になります。
Bluetooth スピーカーか Bluetooth ヘッドホンが必要です。
あらかじめペアリングしておいてください。


● 転送方法

アプリをインストールしたら、スマートフォン(タブレット) 側で
「Music Player for Android Wear」を起動します。

端末内の音楽ファイルを選択してアップロードリスト(同期リスト)に加えます。

同期リストに登録するとバックグラウンドで転送が行われます。
Google Play のシステムサービスを利用しているためアプリを閉じても構いません。

Bluetooth なのでデータの転送にはかなり時間がかかります。
大量のファイルを追加せず、最初は 1~2 ファイルでテストしてみることを
おすすめします。


● 再生

Android Wear (Wearable) 側で「Muisc Player for Android Wear」を
立ち上げてください。

機能は最小限です。
常にシャッフル再生となり順番を指定したりデータを選択することができません。

同期リストに加えても、実際の転送が完了するまで再生できないのでご注意ください。
追加のファイルを転送している途中も再生ができなくなります。

もし Play を押しても鳴らないようならしばらく時間を置いてみてください。
新規転送したリストを取得するには、一旦 Stop してから Play し直してください。


関連エントリ
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


OS の更新が始まり、端末によっては使える API が増えています。
Nexus 10 (Exynos 5 Dual 5250) は Android 5.0 で OpenGL ES 3.1 が
使えるようになりました。
Tegra K1 と違い AEP には対応しておりません。

GL_VERSION: OpenGL ES 3.1
GL_RENDERER: Mali-T604
GL_VENDOR: ARM
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10

詳細は Extension のページ↓に追加しました。

CPU/GPU OpenGL ES Extension (Mobile GPU)

下記は手持ちの端末で調べたものです。

Nexus の OpenGL API
Nexus         SoC       GPU          Android 4.4     Android 5.0
----------------------------------------------------------------------
Nexus 7 2012  Tegra 3   ULP GeForce  OpenGL ES 2.0   OpenGL ES 2.0
Nexus 7 2013  APQ8064   Adreno320    OpenGL ES 3.0   OpenGL ES 3.0
Nexus 5       MSM8974   Adreno330    OpenGL ES 3.0   OpenGL ES 3.0
Nesus 10      Exynos 5D Mali-T604    OpenGL ES 3.0   OpenGL ES 3.1
Nesus 9       Tegra K1  Kepler       --              OpenGL ES 3.1 AEP

Amazon Kindle Fire も Fire OS 4 への更新が行われており、
Android 4.4 ベースとなりました。
GPU が対応している場合は OpenGL ES 3.0 が使えるようになっています。

Amazon Fire の OpenGL API
Fire               SoC       GPU          FireOS 3       FireOS 4
----------------------------------------------------------------------
Kindle Fire HDX 7  MSM8974 Adreno 330     OpenGL ES 2.0  OpenGL ES 3.0
Fire HD 6          MT8135  PowerVR G6200  --             OpenGL ES 3.0


関連エントリ
Nexus 9 Tegra K1 と ARM 64bit Denver
(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
iPad Air 2 (Apple A8X) の GPU
NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
Extension で記事検索


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 関連


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)


Amazon の新しい Tablet である Fire HD 6 は、Android 4.4 ベースの
Fire OS 4.1 を搭載しています。
Android 4.4 、API Level 19 になったことで GPU が対応していれば
OpenGL ES 3.0 が使えるようになりました。

下記は Fire HD 6 の結果です。

GL_VERSION: OpenGL ES 3.0 build 1.3@2876724
GL_RENDERER: PowerVR Rogue Han
GL_VENDOR: Imagination Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00 build 1.3@2876724

SoC は MediaTek MT8135 で、非対称の 4 core CPU に PowerVR G6200。
Extension と対応している圧縮テクスチャフォーマットは下記の通り。

Extension:
GL_OES_rgb8_rgba8
GL_OES_depth24
GL_OES_vertex_half_float
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_element_index_uint
GL_OES_mapbuffer
GL_OES_fragment_precision_high
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_required_internalformat
GL_OES_depth_texture
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_vertex_array_object
GL_OES_texture_npot
GL_OES_surfaceless_context
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_multisampled_render_to_texture
GL_EXT_shader_texture_lod
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_blend_minmax
GL_EXT_texture_rg
GL_EXT_occlusion_query_boolean
GL_EXT_color_buffer_float
GL_EXT_shader_framebuffer_fetch
GL_EXT_separate_shader_objects
GL_EXT_robustness
GL_EXT_draw_buffers
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_compression_pvrtc2
GL_IMG_texture_npot
GL_IMG_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_program_binary
GL_IMG_multisampled_render_to_texture
GL_KHR_debug

TextureFormat 17
00=8c01  GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
01=8c03  GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
02=8c00  GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
03=8c02  GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
04=9137  GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
05=9138  GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
06=8d64  GL_ETC1_RGB8_OES
07=9274  GL_COMPRESSED_RGB8_ETC2
08=9275  GL_COMPRESSED_SRGB8_ETC2
09=9278  GL_COMPRESSED_RGBA8_ETC2_EAC
10=9279  GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
11=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
12=9277  GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
13=9271  GL_COMPRESSED_SIGNED_R11_EAC
14=9270  GL_COMPRESSED_R11_EAC
15=9273  GL_COMPRESSED_SIGNED_RG11_EAC
16=9272  GL_COMPRESSED_RG11_EAC

ETC2/EAC だけでなく PVRTC2 (PVRTCv2) にも対応していることがわかります。
同じ Series 6 でも iOS では PVRTCv2 に対応していませんでした。
PVRTCv2 は ETC2 と同じように、上位互換性を保ちつつモード分岐による
画質の向上が施された 2世代目の圧縮フォーマットです。

1世代目   2世代目
-------------------
ETC1      ETC2/EAC
PVRTCv1   PVRTCv2

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

                          PVRTCv1  PVRTCv2  ETC1  ETC2/EAC
----------------------------------------------------------
Android PowerVR Series 5    Y        -       Y       -
Android PowerVR Series 6    Y        Y       Y       Y
iOS PowerVR Series 5        Y        -       -       -
iOS PowerVR Series 6        Y        -       Y*1     Y

 *1 ETC2 は ETC1 の上位互換性があるため ETC1 の読み込みも可能

CPU は Cortex-A15 x2 と Cortex-A7 x2 の big.LITTLE 構成です。
実際に試してみると、HMP が有効らしくアプリケーションからは 4 core と
認識されていることがわかります。
負荷をかけた状態は下記の通り。4 core ともアクティブです。

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

$ cat /proc/cpuinfo
Processor	: ARMv7 Processor rev 3 (v7l)
processor	: 0
BogoMIPS	: 31.81
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xc07
CPU revision	: 3

Processor	: ARMv7 Processor rev 3 (v7l)
processor	: 1
BogoMIPS	: 31.81
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xc07
CPU revision	: 3

Processor	: ARMv7 Processor rev 2 (v7l)
processor	: 2
BogoMIPS	: 35.06
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc0f
CPU revision	: 2

Processor	: ARMv7 Processor rev 2 (v7l)
processor	: 3
BogoMIPS	: 26.00
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc0f
CPU revision	: 2

Hardware	: MT8135
Revision	: 000f 000a
Serial		: 0000000000000000

ミドルクラスでも Cortex-A7 Quad の端末が増えている中、
価格帯 1万円前後ながら Cortex-A15 を搭載している点が大きな特徴と言えます。
Cortex-A15 と Cortex-A7 は数倍の性能差があるので、
HMP (GTS) ではスケジューラがどのようにタスクを割り振るのか興味あるところです。

下記ページを更新しました

CPU/GPU OpenGL ES Extension (Mobile GPU)


関連エントリ
OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)