基本的なDMA転送を実行する
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
SPEからDMA転送を行う基本的な手順は下記の通りです。
- MFCにDMA転送コマンドを送る
- 転送完了を待つ
コードはこのようになります。
DMA転送で使う定数はspu_mfcio.hで定義されているので、それをインクルードします。 基本的な転送手順は以下の通りです。
spu_mfcdma32 (&buf,
ea,
sizeof(buf),
tag,
MFC_GET_CMD);
spu_writech(MFC_WrTagMask, 1<<tag);
spu_mfcstat(MFC_TAG_UPDATE_ALL);
DMA転送を行うには最低限下記の事を知っている必要があります。
- DMAコマンドはタグと呼ばれる識別子を指定してグループ分けする事ができます
- DMAコマンドはキューイングされ順不同に実行されます
- DMA転送を行えるデータの配置アドレスとサイズには制限があります
[編集]
データの制限事項
DMA転送できるサイズは1,2,4,8,16バイトかそれ以上で16*1024バイトまでの16バイトの倍数です。アドレスは「自然なアライメント」でなければいけません。すなわち転送サイズが1,2,4,8,16バイトなら転送アドレスはそれぞれ1,2,4,8,16で割り切れ、なおかつ16バイト境界からのオフセットが一致(下位4ビットが一致)していなければいけません。 同様に転送サイズが16バイトの倍数の場合はアドレスが16で割り切れなければいけません。一回に転送できるサイズの最大は16*1024バイトです。
メインストレージとローカルストレージでアドレスの128バイト境界から数えたオフセットが一致していないと転送速度が半分程度に降下します。
直感的には最低16バイトに整列、ベストパフォーマンスには128バイトに整列、と覚えておけば問題ありません。
詳しくはCell Broadband Engine Programming Handbook の 19.2.1 DMA Commands の項をご覧ください。
整列したデータを確保する手法は別途解説があります。
[編集]
DMA転送に失敗したら
慣れないうちはMFCに不正なアドレスまたは不正なサイズを渡してしまいDMA転送を失敗するかもしれません.この時は通常
バスエラー
と表示されてプログラムが不正終了するのでデバッグの時の参考にしてください。
