評価準備
というわけで評価の準備に入る。数回に分けて。
newlib
spuではnewlibを使う。プラットフォームの抽象化は主にnewlibのlibglossによって行われ、これによってspuの方からopenとかcloseが呼べるようになっている。
int write (int file, const void *ptr, size_t len) { syscall_write_t sys; sys.file = file; sys.ptr = ( unsigned int )ptr; sys.len = len; return __send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_WRITE, &sys); }
例えばwriteはこんな調子。SPE側でこれらの要求を処理するのではなく、PPE側に要求を転送する。もちろん、これらの要求はPPE側のプログラムでhandleする必要は有るが、これはlibspe2などが勝手にやってくれるので特に意識する必要はない。
newlibをビルドする必要はない。gccのソースツリーにnewlibとlibglossをサブディレクトリとしてコピーしておけば、gccのビルド時に自動的にビルドされる。
gcc
../gcc-4.4.0/configure --prefix=/opt.cell --target=spu-elf --with-newlib --enable-languages=c
いつものごとく、展開したソースと同じレベルに空のディレクトリを作りそこにcdした上でconfigureする。今回の目的にはC++は不要なのでCだけを入れている。
gcc 4.4からはGRAPHITE最適化パスが有るが、CloogやPPLのコンパイルを256MのRAMでやるのは面倒なので今回は採用しなかった。今回の目的においてはgcc側の(レジスタ割り付け以外の)最適化には期待していない。
spu-tools
SPU向けのtopやpsが有る。大概のLinuxにはパッケージがあるが、無ければsf.netのlibspeから入手できる。(外部観察のサンプルとしても興味深い)
ちょっと試す
libspe2を導入し、elfspeコマンドを入手する。簡単なプログラムであれば、libspeを使ってPPE側で動作するドライバを書かなくても、elfspeコマンド経由で実行するだけでチェックできる。
oku@ps3-gentoo ~/proj/test $ cat hello.c #include <stdio.h> int main(int ac,char **av){ printf("Hello, World!\n"); } oku@ps3-gentoo ~/proj/test $ spu-elf-gcc hello.c oku@ps3-gentoo ~/proj/test $ elfspe a.out Hello, World!
Hello, World!はSPEプログラムからPPE側を叩いて出力させている。