俺ベンチを使って SPU をベンチマークする為の計画を考える。
- CELL 特有の処理を極力行わず、float 型を使い、最適化はコンパイラオプションに任せる。
→よくあるオーソドックスな移植を想定。SPU 単体とコンパイラのお手並み拝見。 - マルチコアに拡張する。
→マルチコアプログラムの書き方の学習。 - メモリフローを改善する。
→MFC の勉強。 - SIMD 化する。
→下準備。ここから CELL の本領発揮。 - 大きくアンロールする。
→コンパイラオプション -funroll-loops が使い物になる場合は不要。 - アセンブラでガリガリ。
→気力との戦い。
まだ SPU を触った事が無い人間としての勝手な予想では、2, 3, 4, 5 がスピードに大きく影響すると考える。詳細な予想はこんな感じ:
2 はSPU が 6 つ使える為、メモリの帯域を無視すれば 6 倍速くなる。
3 は各 SPU で使う同じデータをメモリから読まず SPU 間で受け渡す事で、1 割くらい速くなる。これはアプリケーションによって異なり、同じデータを参照する事が多いアプリケーションでは大きなウエイトを占めるので学習は必須。ただし極めようと思うとキリが無いので、まずは学習出来たら切り上げる。
4 はメモリの帯域やストールを無視すれば 4 倍速くなる。SPU の LS がどれくらい速いのかが分らないけれど、実質 2 倍速くらいと予想。コーディング自体は AltiVec と SSE を散々扱っているので楽勝。
5 のアンロールは、4 で実質 2 倍速に留まっているであろうところを限りなく 4 倍速まで持っていく処理。SPU ではアンロールが x86 や PPC G4/G5 に比べて非常に重要だと考えている。CELL は処理がインオーダーなので、128 本のレジスタを余す所無く使ってレイテンシを隠滅する必要があるはず。
逆を言うと、いくらレジスタリネームがあるからと言ってプログラマからはレジスタが 8 本しか見えない Pentium 4 ではレイテンシを隠滅しきれないが、CELL では 3.2 GHz をまるまんま有効利用する事が可能なのではないかと淡い期待を抱いている。問題はパイプラインの段数がどれくらいあるのか、デコーダやスケジューラがどれくらいの命令を扱えるのか。知ってる人がいたらおせーて。
ペースとしては、週に 1 つずつこなせれば嬉しいなあ。んなうまくいかんだろうけど。
こんなにきちんと計画立てたのは我ながら珍しい。