DMAコマンドのsyncとeieioを理解する
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
[編集]
DMA_SYNC_CMD
Cellはメインメモリに対する操作(DMA転送)の一貫性(コンシステンシ)のモデルとして、いわゆるウェイークコンシステンシモデルが採用されています。つまりメインメモリへの書き込みと読み込みは命令の発行順序どおりに実行、完了するとは限りません。 これは例え一つずつ適切にDMAコマンドの完了を待ったとしてもです。 従ってメインメモリへの書き込みの完了順序を保証する必要があるなら、プログラマーが明示的に指示する必要があります。この事は特に複数SPEの間で同期を取るときに問題となります。
例を下に示します。この例では2つのDMA転送を行い順番どおりDMA転送が実行され完了しますが、それでもメインメモリの書き込みの完了の順番は保障されていません。
spu_mfcdma32 (&data, ea_data, sizeof(data), 0, MFC_PUT_CMD); spu_mfcdma32 (&flag, ea_flag, sizeof(flag), 0, MFC_PUTF_CMD);
このような場合にメインメモリの書き込み順序を保障するにはDMA_SYNC_CMDを途中に挿入します。 DMA_SYNC_CMDはそれより前のDMAコマンドのメインメモリへの操作が完了していることを保障します。 これはデータがキャッシュ可能なときも含めてです。 従って他のプロセッサーから見た場合も含めてメインメモリへの書き込み完了順序は保障されます。
spu_mfcdma32 (&data, ea_data, sizeof(data), 0, MFC_PUT_CMD); spu_mfcdma32 (0, 0, 0, 0, MFC_SYNC_CMD); spu_mfcdma32 (&flag, ea_flag, sizeof(flag), 0, MFC_PUT_CMD);
MFC_SYNC_CMDは暗黙的にMFC_BARRIER_CMDを含んでいるため、後続のDMAコマンドではフェンス修飾が必要ありません。
[編集]
MFC_EIEIO_CMD
MFC_SYNC_CMDとほぼ同じですが、データのキャッシュコヒーレンシーを考慮しません。従ってキャッシュ禁止なデータに対してのみ使用できます。その分軽くなっているので例えばI/OアクセスなどMFC_EIEIO_CMDで十分な場合はこちらを使用してください。
