l'essentiel est invisible pour les yeux

Saturday, January 13, 2007

[Cell] SPUプログラムをスタンドアロンで実行する。(spulets)

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)