DMAコマンドを使って同期処理を行う

出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう

ここではDMA転送を使った簡単な1対1の同期の方法を提示します。

  1. PPE側でバッファとフラグ領域をメモリに確保、0で初期化
  2. SPEを起動
  3. SPEでバッファとフラグを読み込んで修正
  4. SPEでバッファとフラグを書き戻す
  5. PPE側でフラグの変更を検出して終了

といった手順で行います。

メインメモリにバッファを書き込んだ後フラグを書き込みますが、この順序を保証するためにMFC_SYNC_CMDを使用しています。

Media:dma_handshake.tar.gz

おおよそのプログラムの流れは下記のようになっています。 PPEとSPEでbufをやり取りしていますが、PPE側ではこのbufのDMA転送の終了をflag=1になるまで無限ループで待っています。

画像:dma_handshake.png

実行結果は下記のとおりです。

$ ./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のメモリへの書き込み順が保障されます。



Cellプログラミングのレシピに戻る

表示
個人用ツール
Open Source Projects