古くはi386のmmxやamd64のsseやarmのneonのようにmipsにもase dspという命令があります。ase dspに最初のレビジョンとレビジョン2があります。またこれより後にリリースされたMSA(MIPS SIMD Architecture)というのあるようです。DSPは64BitでMSAは128Bitでまったく別物です。
ase dspは2005年くらいに24KEでサポートされました。
これらはConfig3レジスタでサポートの確認ができます。
10ビットが最初のレビジョンで11ビットがレビジョン2になります。
RalinkのRT3050は24KEでDSPPが1でサポートがありました。Atherosの24Kはサポートがありません。AtherosもMediatek(Ralink)も74KはDSPP,DSP2Pの両方サポートがあります。
Vendor | 4K | 24K | 74K |
---|---|---|---|
Atheros | × | × | DSPP,DSP2P |
Ralink | × | DSPP | DSPP,DSP2P |
ちなみにFPUはすべてのチップで未搭載のようです。
コードの書き方は
Effective DSP Programming using MIPS® DSP Application Specific Extensions
が参考になりそうです。
実際のコードはqeumにテストコードがありました。
またcairoなどで使われているpixmanにもDSP2Pの最適化コードがあります。
またセルビアの大学の方が"Graphic Library Optimization for MIPS Architecture"という論文でlibpngの最適化コードの事を書かれています。
これを確認していて気がついたのですが、CPUの情報が含まれてるdmesgとそうでないものがあります。確認してみたところ、おそらく13-CURRENTの頃に下記の修正が入り、dmesgに含まれるようになったものの、12-STABLEにはMFCされてないようです。MFCってのはCURRENTから過去のSTABLEに反映する対応なんですが、14-CURRENTの現在sys/mipsは消されてしまったので、MFCができません。
勝手に自分のブランチ(ZRouter:freebsd-src:zrouter_yamori813)にMFCしました。
gccのオプションは-mdspと-mdspr2になります。
FreeBSDのコマンドのビルドにmdspをつけても有効にならないようです。
Assembler messages:
Warning: mips3 ISA does not support DSP ASE
marchをmips32にするとワーニングがでなくなりますが、リンクでエラーになります。
sin.o: linking mips:isa32 module with previous mips:4000 modules
ZRouterの設定を修正してmdspオプションが使えるようにしました。
RISCアーキテクチャってのは、コンパイラーの最適化でパフォーマンスが出せるように、インストラクションを簡素にするってアプローチですが、SIMDは人力でアセンブラを書き最適化するという手法により高速化しています。
本来MIPSアーキテクチャとSIMDは対極にあると思うのですが、綺麗ごとばかりも言ってられないってことなのかもしれません。
なぜこれを調べたかというとmpg123にMIPSのSIMDコードがなかったので、どうなってるのか知りたかったためです。74Kくらいのパフォーマンスがあればとくに問題なくネットラジオの再生はできていますが、せっかくなのでffmpegのコードをぱちってくるのが良いような気がします。
また、FreeBSDのsoundドライバーはどうも24Kでは処理ができないぽいので、SIMDが使えればとおもいました。RalinkはDPSが使えますがAtherosは使えないので、微妙です。
MIPS社からFive Methods of Utilizing the MIPS® DSP ASEというドキュメントが出ています。これに5つのDSPサポートの方法が書いてあります。そのなかにあるMIPS DSP Libraryというのがあるのですが、どこにも見当たりません。fdk-aacで使っているのですが、コンパイルできません。 PIC32のレポジトリにありました。ZRouterのportsもどきにはライブラリコードを入れてビルドするようにしてあります。
- アセンブラで書く
- Cのインラインで書く
- gccのビルドイン関数を使う
- MIPS社のライブラリを使う
- 固定小数点を使う
などのようです。
fdk-aacではビルドイン関数も使っていて、-mdspオプションでビルドする必要がありました。