Cell Broadband Engineを利用したホログラム計算(後編)
3)メイン・メモリからの演算用データの読み込み
DMA転送を行うためには,まず,spu_mfcdma64関数にローカル・ストア側の転送に利用するメモリ領域の先頭アドレス,メイン・メモリ側のメモリ領域の先頭アドレス上位32ビット,メイン・メモリ側のメモリ領域の先頭アドレス下位32ビット,DMA転送するデータのサイズをバイト数で指定します.また,DMA転送を識別するタグ番号(このタグ番号を用いてDMA転送の完了を確認する),およびDMA転送の方向指定(ローカル・ストアへ転送する場合はMFC_GET_CMD,メイン・メモリへ転送する場合はMFC_PUT_CMD)を引き数として渡します.
次に,spu_writechマクロを利用してDMA転送の完了を待つタグ番号をMFCへ伝え,spu_mfcstat関数とspu_writechマクロで書き込まれたタグの値が更新されるのを待ちます.直前のspu_writechで書き込まれたすべてのタグの更新を待つには,MFC_TAG_UPDATE_ALLを指定します.spu_writechマクロとspu_mfcstat関数を組み合わせて呼ぶことで,任意のタグ番号のDMA転送の完了を待つことができます.
例えば,PPEプログラムで指定したSPEプログラムに渡された引き数を取得する場合は,リスト2(e)のようにします.
spu_mfcdma64(&dmaParams,mfc_ea2h(argp),mfc_ea2l(argp),
sizeof(DmaParams),1,MFC_GET_CMD);
spu_writech(MFC_WrTagMask,1 << 1);
spu_mfcstat(MFC_TAG_UPDATE_ALL);
4)SIMD演算の利用
また,SIMD演算の利用として加算を行う場合は,リスト2(f)のようにします.このほかにも,乗算や逆数,論理積など,さまざまな計算にSIMD演算を利用できます.
vector signed int va = (vector Signed int) { 1,2,3,4 };
vector signed int vb = (vector Signed int) { 5,6,7,8 };
vector signed int vc;
vc = spu_add( va,vc )?; // 1+5,2+6,3+7,4+8