PPUプログラムからSPUプログラムへのアクセス
PPUプログラムからSPUプログラムにアクセスする方法には、PPUプログラム内で明示的に行う方法と実行時OSによりロードする方法の二つがある。どちらの方法でも初めにSPUプログラムをグローバルな実効アドレスにメモリマップされなければならない。
マップされたアドレスはPPUから利用することが出来る。メモリマップされた実効可能SPUイメージはSPUローダーを通して、SPEのローカルストレージにDMA転送され実行される。そしてSPE実行イメージはPPU中のシンボルを通して参照可能になる。
SPUプログラムからPPUシンボルへのアクセス
SPEプログラムでは、共用されるシンボル領域を持たないため、SPUプログラム中からPPU中のシンボルを参照することは出来ない。このためSPUではPPUからEA(Effective Address)を受け取りDMAオペレーションを利用してデータを転送する。しかし、この操作は実行時オーバヘッドをうみやすく、エラーが混在しやすい。
そこでCESOF中では、EA(実効アドレス)を扱うEAR(Effective Address Reference)と呼ばれる新しいタイプの64bit変数(unsigned long long)を使用してPPU中のシンボルを参照可能にする。このシンボルはPPU中のグローバルスコープで宣言された変数名に_EAR_のプレフィックスを付けた名前にネームマングリングされる。
[Cell] CESOFを使用してPPU/SPU間で変数を相互に参照する
でEARを利用した簡単なプログラムを書いた。
実行可能SPUイメージがどのようにPPUプログラム内にロードされるか
PPUプログラム内でSPUイメージを明示的にメモリマップするには、libspe.hで提供されるspe_open_image関数を使用する方法である。次の場合、spe_handle_t型の変数spe_handleでSPU実行イメージの参照が可能である。
spe_program_handle_t *spe_handle;
speid_t spe_id;
spe_handle = spe_open_image(SPU_FILE_NAME);
spe_id = spe_create_thread(0, &spe_handle, NULL, NULL, -1, 0);
図 Separatted PPE and SPE code module life cycles.
OSによりメモリマップする方法は、CESOF(Cell Embeded SPU Object Format)を利用する。リンク可能なSPUオブジェクトを作成する方法は次の記事で紹介。
[Cell] PPUプログラムにSPUプログラムを組み込む
embeded-spuは実行可能SPUをリンク可能なCESOFに埋め込んでラップしたオブジェクトを作成する。リンク可能なCESOFは次のような構造を持つ。
図 CEOF linkable layout
先ほどのソース中のspe_program_handle_t型は、次のような構造体で.dataセクション中に配置される。
typedef struct spe_program_handle {
unsigned int handle_size;
void *elf_image;
void *toe_shadow;
} spe_program_handle_t;
- ハンドラのサイズ
- 実行イメージへのポインタ
- Shadow SPU TOE領域(Table of EARs)
(Shadow SPU TOEの良い訳語がみつからなかったのでこのままで)
CESOFがどのように組み込まれて動作するのかを見ていく。
1. 実行可能SPUイメージのロードとシンボル作成
実行時に、SPU実行イメージがSPEローダーによりLS(ローカルストア)中の.rodata.speelfと呼ばれる特別なセクションにロードする。embedespuは、SPU実行イメージをポインタで参照するためのPPEシンボル(ファイル名と同じ)を作成する。構造体のメンバの(void *elf_image)は、.rodata.speelf中にロードされた実行可能SPUイメージへのポインタである。
% spu-readelf -S spu/spu_hello-embed.o | grep speelf
[ 2] .rodata.speelf PROGBITS 00000000 000080 004080 00 A 0 0 128
%
.rodata.speelfセクションは名前の通り読み込み専用である。これは、同一マシン上で実行中の複数のCBEアプリケーションによりSPE実行イメージが共用される可能性があるためである。
2. Shadow SPU TOE領域
Shadow SPU TOE領域は、実行可能SPU上に埋め込まれたTOEセグメントをミラーリングするための領域である。TOE(Table of EARs)セグメント中には、EARが集められていてembededspuはそれぞれのEARに一致するPPEシンボル参照を作成する。(_EAR_プレフィックスを取り除いたシンボル名)
また、spu_program_handle構造体は、図 CEOF linkable layoutへのポインタ(void *toe_shadow)を持つ。
3. SPEプログラムの扱い
CESOFはCESOF情報を持つデータ構造を実行時に提供する。このデータ構造は二つのポインタから構成されており、一つは組み込まれた実行可能SPEイメージを指し、もう一つはShadow領域を指す。この二つのポインタの値はPPEリンカーがリンク可能なCESOFを最終の実行イメージにリンクした場合のみ解決される。
embedspuがしてくれること
- .rodata.speelfと.data.spetoeへのポインタを持つspe_program_handle_t型の構造体の変数を定義する。
- .rodata.speelfにSPE実行イメージをロードする。(by .incbin)
- SPUバイナリ中の_EAR_を持つシンボル名を抜き出し、.data.spetoeに対応するPPEシンボルのアドレスを格納する。
CESOFの基本的な仕組みを学んだ。
低レベルのアーキテクチャから並列処理・SIMDにいたる深くて広い知識を理解したうえでプログラミングテクニックを展開しないと、ハイスピードなプログラムが書けないというエンジニアにとってとても挑戦的なプロセッサがCell. PPEリンカの動作などを理解しているというにはまだまだ程遠いが、次はCell上でのオーバーレイを試す。
参考
Programming the Cell Broadband Engine
IC 2006 新しいマルチコアプロセッサ Cell で遊ぼう