これが使えるのと使えないのでは、画像や動画のデコード性能が随分違うはずだと思うので、ググってみた。
どうも QI のメーリングリストの情報が 一番整理されているようだ。
- 簡単な紹介
mxu_user_guide_EN.pdf - jz-crosstools
jz-crosstools-src.tar.bz2 - jpeg6b ( jz_mxu.h が含まれている )
jpeg-6b-idctmxu-jz4740-080422.tgz- jz_mxu.h を使っているのは、jfdctint.c のみ。
- jz_mxu.h を使っているのは、jfdctint.c のみ。
- MPlayer
MPlayer-1.0rc2-20090218.tar.bz2
mplayer-1.0rc2-jz47-20100415.tar.bz2- libavcodec の jzmedia.h に MXU 命令が定義されていて、それを使っているのは、vc1dsp.c h264idct.c dsputil.c h264disputil.c simple_idct.c 。
- libavcodec の jzmedia.h に MXU 命令が定義されていて、それを使っているのは、vc1dsp.c h264idct.c dsputil.c h264disputil.c simple_idct.c 。
どうもこれが ingenic が公開しているすべてらしく、どういう 命令があるのか 一覧すら公開されていない。
命令の 一部の名前は分かったので、それでググってみると ..
- http://dingoowiki.com/index.php?title=Development:MXU
- http://www.gp32x.com/board/index.php?/topic/50216-jzsimd-mxu-instructions-list/
がヒットした。
dingoowiki.com の方を見ると 一覧と MXU 命令を 使うために すべきことの情報がある。
gp32x.com には、よくわからない 一覧になっているが、mxu_as (という awk スクリプト)を解析して どのように変換しているかの情報になっているらしい。
これらの情報をみても、それぞれの MXU 命令がどういう動作をするのかはっきりとは理解できない。
定義を理解するには、jz_mxu.h を見るのが一番のように思う。
jz_mxu.h には、命令に 1:1 に対応したマクロが定義されている。MXU を使う場合は、asm 命令を使用するが、MXU なしだとそれに相当する C コードにする。
これをみれば、どうやって使うのかは分かる。あとは、mxu_as 。これは、jz-crosstools-src.tar.bz2 に含まれているらしいのだが ... 66MB もある。このなかの misc/mxu_as だけを見れば良い。
とりあえず、mxu_as と jz_mxu.h を 以下に置いておく。
さて、まずは、mxu_user_guide_EN.pdf と Development:MXUをあわせて 見てみる。
- 60 の SIMD 命令セットがある。(SIMD 命令は全部で 60なのはマニュアルに書いてあった)
- xr0 - xr16 の 17 個の XMU レジスタがある。それぞれは 32bit 。
- xr0 は、zero レジスタで 常に 0 。xr16 は コントロールレジスタ。
- XMU 命令を使うためには xr16 の bit0 を 1 にしなくてはならない。
- mxu-instructions-listの方は 58命令分しか解析していない。足りないのは、D16ABS , S32ABS 。
- Jz4755 などで拡張された SIMD2 命令セットは、114 命令 (差分 54命令)だが、どうも mxu_as に拡張部分も定義されているようだ。
jz_mxu.h には、SIMD(無印) の分しか定義されておらず、分かるのは拡張された命令の名前だけ。
- mxu-instructions-listの方は 58命令分しか解析していない。足りないのは、D16ABS , S32ABS 。
ということらしい。
で? 60 個もあるという 命令はどんなものなのだろう?
まずは、Development:MXU を見ると
- ロード・ストア 10 種類
- 加減算 12 種類
- 乗算 9 種類
- その他の算術演算 11 種類
- シフト・シャッフル命令 16 種類
60 種類にはなっておらず 合計 58 種類が記載されている。でもよくよく見ると モードがいくつかあるようで、別々の命令として考えると種類は爆発的に増える。
それはともかく、いったいどれぐらい加速されるのだろう。あまりSIMD 命令は知らないのだが、1 命令での結果の数でカウントしてみることにする。
加減算系統だと、Q16 とか Q8 とかがあって たぶん 最大 4 つ。32bit でも D32 とかあるから 加速されるようだ。
乗算系だと D16 とか Q8 があるから 一応最大 4 つ。ただし、乗加算もあるから x2 と考えると 8つ。
1 クロックで実行できるものなのかどうか不明だが、一応 通常命令より 8 倍ぐらい高速化できるものだという風に思うことにしよう。
ところで、簡易アセンブラしかないような状況というのは分かったが、Linux での対応はどんな感じなのだろう?
見てみたのだが、どうも MXU レジスタのセーブ・リストアするようなところはないように思う。
たぶん、MXU 命令を使うプロセスを 1 つに制限しないと誤動作する。PMP だし 普通はそんな心配はいらないわけだが、うっかりするとまずいかも。