libspe2化
あいかわらず時間がかかりましたが、libspe2対応にしました。サンプルコードやMigration Guideを見ながらコードを変更。ppuとspuとの同期にmailboxとeventを使っていたけど、libspe2だとeventがちょっとわかりにくかったのでmailboxだけにしてみた。が、ここではまった。
作りとしては、spu側はin_mboxから実行パラメータへのポインタが来るのを待ち、ppuは実行パラメータへのポインタをin_mboxへ書き込むだけ。以下の様に。
spe_in_mbox_write(spe_context,&arg,1,SPE_MBOX_ALL_BLOCKING);
で、argへのポインタをmailboxに書き込みたかったのです。が、このコードにはバグがある。この関数の2つ目のパラメータはmboxへ書き込むデータの配列なのだ。本当は3つ目のパラメータはこの配列の大きさを意味する。だから正しくは以下のようにする必要がある。
unsigned int mbox = &arg; spe_in_mbox_write(spe_context,&mbox,1,SPE_MBOX_ALL_BLOCKING);
という不具合に気がつくのに2週間かかりました。
結果詳細は書きませんが、libspe1より心持ち速くなっています。いいこっちゃ。