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.ダブルバッファを用いた高速化。
■扱うサイズ : 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.ダブルバッファを用いた高速化。