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より心持ち速くなっています。いいこっちゃ。