評価準備

というわけで評価の準備に入る。数回に分けて。

spuのbinutils

./configure --prefix=/opt.cell --target=spu-elf

特に何も。binutilsは何が無くとも先にビルドする必要がある。

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側を叩いて出力させている。

ディスクイメージ領域の準備

iSCSIでエクスポートする領域として40GBを準備した。このためroot-fsがHDDに収まらなくなったので、root-fsをNFSマウントし、本体側のHDDにはカーネルとswapだけを置く。