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 機能比較表にも追加しました
GPU は Unified Shader で FragmentShader も highp 対応。
テクスチャ圧縮フォーマットは DXT1/3/5 (S3TC)、
24bit depth に対応しており depth_texture もあります。
Vertex の Stream 入力が若干少なめ。
レンダリングは 2048 までですが使えるテクスチャサイズが
8192 と突出しています。
NDK を使って実際にシェーダーを走らせてみました。
下記のベンチマーク結果の表に追加しています。
公式スペックもフィルレートがあまり高くなかったので、
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 が無くなりました)
記事を見て早速mipsとx86対応をやってみました。実機が無いのでテストしていませんが。
Novo7 Paladinのベンチマークを拝見しました。Tegra2より速いんですね。なかなか侮りがたい性能です。ただ問題は今後どれだけ対応ソフトが増えるかですね。開発者としてはテストしなければならないハードがさらに増えて手間が増えそうです。
http://chototsumoushinp.dip…
ベンチマークの表は上から速い順に並べてあります。
Pixel Shader の方が重いので、fps よりも pix/sec の
方が重要です。
Adreno 200 よりは速いですが、フィルレートが低く面積が
増えるとかなり遅くなります。
Tegra2 の半分くらいでしょうか。
でも価格を考えればよく動いています。
MIPS DSP ASEと呼ぶとMIPS社のものになるかと思いますが、JZ4770のSIMDユニットはIngenic社のMXUという独自のものですね。gccでは対応していないので、使う場合はインラインアセンブラ+独自の前処理awkスクリプトを通してasに渡す形になります。
あとpaladinのROMは実際にはmips-r2でbuildされていると思います。build.propはro.product.cpu.abi=mipsですが、例えばlibc.soは
"libc.so: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, with unknown capability 0xf41 = 0x756e6700, stripped"
とrel2となっています。
(1/30付けの最新のROMで確認しましたが、-r2でbuildされてないver.がある可能性は否定できません)
chototsu さん
apk 動いたので build は成功しているようです。
ただし
・起動時に「データ読み込み中」で一分以上かかる
・加速度センサーが反応せず頭上のアングルのみ
・2fps
CPU が遅く処理落ちしているような感じです。
fukaumi さん
指摘ありがとうございます。
mips は情報が少なく助かります。
4.0.3 に upgrade してみましたがやはり NDK では mips しか
ロードできませんでした。
Creative ZEN Touch 2 の 2.1 と同じかもしれません。
これも Android 2.1 の時は ROM が armeabi-v7a で
build されているのに NDK では armeabi しか読み込めませんでした。
oga様
テストして頂き恐縮です。
動きましたか。ただパフォーマンスは思った程ではないですね。でも動いただけ凄いです。
全然MIPSとは関係無いですが今回のアップデートでT01Cなどでフリーズやリブートするとの報告を受けました。
軽いモデルに差し替えると動くようですのでおそらくメモリー不足だと思うのですが、メモリー不足で端末がフリーズしたりリブートするものなのでしょうか。
例外も出ずにOSごと落ちてしまうようでアプリ側でどう対処すればいいのか分からず困っています。
ロードできませんでしたか、失礼いたしました。手元ではNDKではなくplatformのsourceからbuildしたr2向けバイナリは試した事があるのですが、NDKのアプリだと何か別のお作法があるんですかね…
そういえば手元にMali-400の(たぶんシングルコアの)とかGC800が載った中華padがあるのですが、ogaさんのベンチマークを使わせて頂く事は可能でしょうか?
あ、すみません、Mali-400/GC800はARMのCPUなのでオフトピでした…
oga様のベンチマークはNDKを使用されているのですよね。
私のアプリは基本的にJavaで動いていますので(さすがに物理演算はC++ですが)、その違いがあるのかもしれません。
MIPS版dalvikの性能はどの程度あるのでしょうか。
chototsu 様
T01C は Adreno200 なので十分可能性あります。
EGL の Config 設定を間違えただけで再起動することもあるため
ドライバレベルで問題が発生しているのではないかと思います。
Adreno205/220 では今のところそのような症状には
遭遇したことがありません。
fukaumi さん
本当に Mali-400 single ならおそらく速度 1/4 です。
ベンチは毎回手でシェーダーやソースを書き換えつつ
条件を変えて走らせてる状態なので、
残念ながらお出しできる出来ではありません。
余裕ができたら何とかしたいとは思っているのですが。
RenderScript の方も 3.0 (API11), 4.0 (API14) 双方で
走らせるために Manifest 書き換えて再コンパイルしたり
NEON を on/off して再コンパイルしたりとかなり人力です。