Android 4.0 ainol Novo 7 Paladin、MIPS CPU の NDK と Vivante GPU

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 4.0 ainol Novo 7 Paladin、MIPS CPU の NDK と Vivante GPU」への11件のフィードバック

  1. chototsu

    記事を見て早速mipsとx86対応をやってみました。実機が無いのでテストしていませんが。
    Novo7 Paladinのベンチマークを拝見しました。Tegra2より速いんですね。なかなか侮りがたい性能です。ただ問題は今後どれだけ対応ソフトが増えるかですね。開発者としてはテストしなければならないハードがさらに増えて手間が増えそうです。

    http://chototsumoushinp.dip

  2. oga 投稿作成者

    ベンチマークの表は上から速い順に並べてあります。
    Pixel Shader の方が重いので、fps よりも pix/sec の
    方が重要です。
    Adreno 200 よりは速いですが、フィルレートが低く面積が
    増えるとかなり遅くなります。
    Tegra2 の半分くらいでしょうか。
    でも価格を考えればよく動いています。

  3. fukaumi

    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.がある可能性は否定できません)

  4. oga 投稿作成者

    chototsu さん
    apk 動いたので build は成功しているようです。
    ただし
    ・起動時に「データ読み込み中」で一分以上かかる
    ・加速度センサーが反応せず頭上のアングルのみ
    ・2fps
    CPU が遅く処理落ちしているような感じです。

  5. oga 投稿作成者

    fukaumi さん
    指摘ありがとうございます。
    mips は情報が少なく助かります。

    4.0.3 に upgrade してみましたがやはり NDK では mips しか
    ロードできませんでした。
    Creative ZEN Touch 2 の 2.1 と同じかもしれません。
    これも Android 2.1 の時は ROM が armeabi-v7a で
    build されているのに NDK では armeabi しか読み込めませんでした。

  6. chototsu

    oga様
    テストして頂き恐縮です。
    動きましたか。ただパフォーマンスは思った程ではないですね。でも動いただけ凄いです。
    全然MIPSとは関係無いですが今回のアップデートでT01Cなどでフリーズやリブートするとの報告を受けました。
    軽いモデルに差し替えると動くようですのでおそらくメモリー不足だと思うのですが、メモリー不足で端末がフリーズしたりリブートするものなのでしょうか。
    例外も出ずにOSごと落ちてしまうようでアプリ側でどう対処すればいいのか分からず困っています。

  7. fukaumi

    ロードできませんでしたか、失礼いたしました。手元ではNDKではなくplatformのsourceからbuildしたr2向けバイナリは試した事があるのですが、NDKのアプリだと何か別のお作法があるんですかね…

    そういえば手元にMali-400の(たぶんシングルコアの)とかGC800が載った中華padがあるのですが、ogaさんのベンチマークを使わせて頂く事は可能でしょうか?

  8. fukaumi

    あ、すみません、Mali-400/GC800はARMのCPUなのでオフトピでした…

  9. chototsu

    oga様のベンチマークはNDKを使用されているのですよね。
    私のアプリは基本的にJavaで動いていますので(さすがに物理演算はC++ですが)、その違いがあるのかもしれません。
    MIPS版dalvikの性能はどの程度あるのでしょうか。

  10. oga 投稿作成者

    chototsu 様
    T01C は Adreno200 なので十分可能性あります。
    EGL の Config 設定を間違えただけで再起動することもあるため
    ドライバレベルで問題が発生しているのではないかと思います。
    Adreno205/220 では今のところそのような症状には
    遭遇したことがありません。

  11. oga 投稿作成者

    fukaumi さん
    本当に Mali-400 single ならおそらく速度 1/4 です。
    ベンチは毎回手でシェーダーやソースを書き換えつつ
    条件を変えて走らせてる状態なので、
    残念ながらお出しできる出来ではありません。
    余裕ができたら何とかしたいとは思っているのですが。

    RenderScript の方も 3.0 (API11), 4.0 (API14) 双方で
    走らせるために Manifest 書き換えて再コンパイルしたり
    NEON を on/off して再コンパイルしたりとかなり人力です。

コメントは停止中です。