PPU-SPU間の通信

前回SPUスレッドの非同期実行のためのクラスで、わざわざmailboxを用いた通信用のメソッドを用意した理由は、DMAを通じた通信よりもmailboxの方が早いだろうと目論んだからだ。しかしこれがくせ者で、mailboxは各SPUに32bit単位で1つしかなく、それが塞がっていると次のメッセージを送ることができずストールしてしまう。
この場合大変なのはPPU側で常にSPUのmailboxを監視して、メッセージがセットされたら空になるまでどんどん吸い出さないといけないことだ。その際、このメッセージを読んだら当分メッセージはないのか、あるいは続きがあるのかPPU側が把握していないといけない。
Mailboxを使おうとした時、私の念頭にあったのはSPUスレッドは実行したままで待機し、mailbox経由のコマンドで動作モードを変えたり終了したりするものだったのだが、複数の動作モードやメッセージのフォーマットがある場合にmailboxを使う事は思わぬバグを引き起こしかねない。
こういったオーバーヘッドとリスクを恐れて、私は結局mailboxを用いた通信は行わないことにした。

こうなるとPPU-SPU間の通信はDMAを使うことになるのだが、こちらでも問題が生じた。
私のコードが誤っている可能性も高いのだが、DMAに用いるメモリのアドレスがスタックにある場合、バスエラーでプログラムが異常終了してしまった。
メモリのアライメントが悪いのかとは思うのだが、今ひとつ原因が分からない。
仕方がないのでDMA用のメモリはヒープにとるようにした。