研究日誌。

大規模なグラフ処理に対してメモリ階層構造を考慮した高性能なソフトウェアを開発。

行列積演算3。

2007-09-15 05:22:00 | Weblog
Cell での行列積演算を扱ってきたが、Flag で同期をすることはやはりうまくいかない。とりあえず 2048 x 2048 に固定してされた行列積プログラムを作成してみて、その性能を検証してみた。前回のプログラムはかなり大きな行列 10,000 x 10,000 ~を想定していたのだが、そもそも PlayStation3 は 256MB しかメモリが持っていないので、ちょうどよい大きさにしてしまった。 16KByte(double型で2048要素) までは1度にDMA 転送できるので、Aの一部とBを1行ずつ、 GET(DMA 転送)してきて、結果を PUT(DMA 転送)する。この方法ならばPPEをできるだけ使わないで、処理できる。前回の Flag のうまくいかないところの原因は分かっていないが、そもそも各処理がほとんど同じくらいでは、Flagを使うことが有効ではないため、この方法を用いることがよいといえる。

■扱うサイズ : 2048 x 2048 (double, 100% 密)
■実験環境 gcc -O3
 [1] CPU : Core2Duo 2.4GHz, Mem : 768MByte
 [2] PPEのみ(PS3)
 [3] 6SPE (SIMDあり, Single Bufferのみ)
■実行結果
 [1] [2] [3]
 35940[ms] / 48737[ms] / 5266[ms]

倍精度演算は得意ではないが、それでも5秒強で実行し終わることができる。実行結果はそれぞれ平均実行時間である。[3] は SPE context などの準備時間もいれている。またダブルバッファを用いていないので、更に高速化は可能である。

○これからやること。
1.Mailbox 機能による同期処理。
2.アラインされた動的メモリ確保。
3.以前に行った任意精度を用いて、float-float 、 quad-float などの任意精度行列演算。
4.BLAS との比較。
5.ダブルバッファを用いた高速化。