DMAコマンドを使って同期処理を行う
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
ここではDMA転送を使った簡単な1対1の同期の方法を提示します。
- PPE側でバッファとフラグ領域をメモリに確保、0で初期化
- SPEを起動
- SPEでバッファとフラグを読み込んで修正
- SPEでバッファとフラグを書き戻す
- PPE側でフラグの変更を検出して終了
といった手順で行います。
メインメモリにバッファを書き込んだ後フラグを書き込みますが、この順序を保証するためにMFC_SYNC_CMDを使用しています。
おおよそのプログラムの流れは下記のようになっています。 PPEとSPEでbufをやり取りしていますが、PPE側ではこのbufのDMA転送の終了をflag=1になるまで無限ループで待っています。
実行結果は下記のとおりです。
$ ./ppe.out ppe: buf is ppe: buf[0] = 0 ppe: buf[1] = 0 ppe: buf[2] = 0 Sarah: setup 1 spe threads ppe: flag will be changed by spe... spe: start spe: change flag ppe: flag has been changed by spe ppe: buf is ppe: buf[0] = 0 ppe: buf[1] = 1 ppe: buf[2] = 2 Sarah: waiting all spe threads end... spe: end Sarah: delete all spe threads
ポイントはbufを転送した後のDMA_SYNC_CMDでDMA転送の終了を待ってからflagをDMA転送していることです。 こうする事でbufとflagのメモリへの書き込み順が保障されます。

