メモリの使い方を大幅に変えてみた。
- CELL 特有の処理を極力行わず、float 型を使い、最適化はコンパイラオプションに任せる。(870.21 ms)
- マルチコアに拡張する。(299.61 ms, 2.9 倍速くなった)
- いまここ→メモリフローを改善する。
- SIMD 化する。
- 大きくアンロールする。
- アセンブラでガリガリ。
SPU_4x4_C3.elf 2231895520 clk, 2.08 clk/FP // 697.47 ms
SPU_4x4_C3.elf 586392800 clk, 0.55 clk/FP // 183.25 ms
SPU_4x4_C3.elf 477887000 clk, 0.45 clk/FP // 149.34 ms
SPU_4x4_C3.elf 442559320 clk, 0.41 clk/FP // 138.30 ms
見ての通り、6 個で 6 倍速とまではいかないものの、5 倍速くなり、SPU の個数に応じてスケールするようになった。
この後で更に『SPU をベンチマーク(その3)』の時のような MFC を非同期に行う方法を試してみたが、変化無し。演算ネックなのかもしれない。
入力データのうちの半分は全 SPU 共通なので、本来はメモリ転送を行わずとも SPU 間通信で賄えるが、プログラムが複雑になるのとメモリの非同期アクセスで改善しなかった事からメモリネックでは無いとして保留にし、次に進む事にする。