SPU で動くようにしてみた。
- いまここ→CELL 特有の処理を極力行わず、float 型を使い、最適化はコンパイラオプションに任せる。
- マルチコアに拡張する。
- メモリフローを改善する。
- SIMD 化する。
- 大きくアンロールする。
- アセンブラでガリガリ。
simple 26660013720 clk, 24.83 clk/FP, 8220.00 ms
FPU_1x1_C 7503533880 clk, 6.99 clk/FP, 2308.00 ms
FPU_2x2_C 9337129560 clk, 8.70 clk/FP, 2888.00 ms
FPU_4x4_C 6507395720 clk, 6.06 clk/FP, 2012.00 ms
VEC_1x1_C 7086177200 clk, 6.60 clk/FP, 2188.00 ms
VEC_1x1_C2 4503501400 clk, 4.19 clk/FP, 1384.00 ms
VEC_4x4_C 1988643400 clk, 1.85 clk/FP, 616.00 ms
SPU_1x1_C.elf 9893432560 clk, 9.21 clk/FP, 0.00 ms
SPU_4x4_C.elf 2784683680 clk, 2.59 clk/FP, 0.00 ms
アライメントの処理を端折ってるのと転送 16 KB の制限も無視している関係上サイズが 4 の倍数かつ 1024 以下でないと動かない手抜き設計。
SPU で処理した時間が何故か測れていないけど、クロック数は正しいので実際には SPU_1x1_C が 3091.69 ms で SPU_4x4_C が 870.21 ms。
やべー。意外に速いんじゃね!? やっぱレジスタが多いのと、後は gcc の -ftree-vectorize がうまく動いているのかもしれない。