x86 や PowerPC で動く俺ベンチは元々マルチコアに対応していて、スレッドを複数立ち上げ各スレッドから処理関数を呼び、終わるまで待っている。
そして SPU で動くようにした時に使っているのは libspe2 なので、spe_context_run で処理している。つまりブロッキング関数。
あ、マルチ SPU に対応する必要ねーじゃん。
ということで、かくして起動時の引数だけで使用コア数を変更出来てしまった。
- CELL 特有の処理を極力行わず、float 型を使い、最適化はコンパイラオプションに任せる。
- いまここ→マルチコアに拡張する。
- メモリフローを改善する。
- SIMD 化する。
- 大きくアンロールする。
- アセンブラでガリガリ。
SPU_1x1_C.elf 5528692000 clk, 5.15 clk/FP // 1727.72 ms
SPU_4x4_C.elf 1550003840 clk, 1.44 clk/FP // 484.38 ms
SPU_1x1_C.elf 4217805920 clk, 3.93 clk/FP // 1318.06 ms
SPU_4x4_C.elf 1383961840 clk, 1.29 clk/FP // 432.49 ms
SPU_1x1_C.elf 3469493880 clk, 3.23 clk/FP // 1084.22 ms
SPU_4x4_C.elf 958748360 clk, 0.89 clk/FP // 299.61 ms
SPU_1x1_C.elf 3121461600 clk, 2.91 clk/FP // 975.46 ms
SPU_4x4_C.elf 1222128320 clk, 1.14 clk/FP // 381.92 ms
SPU_1x1_C.elf 3045823880 clk, 2.84 clk/FP // 951.82 ms
SPU_4x4_C.elf 982901160 clk, 0.92 clk/FP // 307.16 ms
4 個までは速くなってるものの微々たるもので、数に比例して速くなっていない。理由はメモリ帯域の限界だと思う。
メモリ帯域を最適化すると 1 割改善すると予想したが、当初の予定よりも MFC の処理を端折っているので次の行程でもっと良くなるはず。