SPUプログラムもスタンドアロンで実行可能にするには、crt(C RunTime Object)を合わせてリンクする必要がある。GCCでは-mstdmainオプションを付加することで、スタンドアロンで実行可能としてコンパイルできる。SPUプログラムのHello, Wolrdを単独で実行可能としてコンパイルする。
PPUから起動される場合と異なり、main()の引数がint argc, char **argvとなることに注意する。引数のアドレスはローカルストア上のアドレスを参照している。
hello.c
#include <stdio.h>
int main(int argc __attribute__((unused)), char **argv __attribute__((unused))) {
int i;
printf("Hello, world from SPE.\n");
for(i=0;i<argc;i++) {
printf("argv[%d]=%p\n", i, argv[i]);
}
return 0;
}
Makefileを作成する。Cell SDK 2.0に付属しているmakeファイルを使用する。LDFLAGS_gcc定数に-mstdmainを定義する。
PROGRAM_spu = hello
LDFLAGS_gcc = -mstdmain
include /opt/ibm/cell-sdk/prototype/make.footer
実行するとargv[1]の引数の値が0x3fff0に配置されていることが分かる。
# ./hello test
Hello, world from SPE.
argv[0]=0x3ffe8
argv[1]=0x3fff0
#
ローカル・ストレージは0x3fffd0を開始位置としてスタックポインタを初期化する。プログラムに渡されるコマンドライン引数は、0x3fff0のアドレスからスタックに詰まれる。メモリスタックの図をSPU Application Binary Interface仕様書より拝借した。
参考
SPU Application Binary Interface仕様書 (PDF)