2012年1月12日木曜日

SpMVの実装

ランダムグラフだが、正規化されたcsr(非圧縮)の行列生成スクリプトをPerlで構築した。
簡単なコードだが、文字列の打ち間違いという痛恨のミスでなかなか時間を取られてしまった。
行数とエッジファクタが指定できるようにしたので、今後の実験に役立ちそうだ。

正規化の方法などはG君が色々アドバイスをくれたので、お陰でうまく生成できた。
現在n=8192、エッジファクタが16程度だと7分程度で生成できている。
n=65536、エッジファクタが19程度では22分かかってしまう。(共にPhenom 2.5GHzでの結果)

Perlのprintでいちいち標準出力経由でファイル書き込みしているため非常に遅いが、
実験で使いそうな範囲なら問題なく出力できそうなので高速化は考えないでおく。

CUDA, OpenCLそれぞれのSpMVを生成した行列を使ってテストしてみたが、
CUDAはOpenCLよりもやはり圧倒的に速い。OpenCLはメモリがボトルネックになっているようだ。
CUDAで実行すると、n=8192では5.11倍、n=65536だと37.00倍もの高速化がなされている。
アルゴリズムはどちらにも大して最適化されていないのもなのに、どうしてここまで差がつくのだろうか。
不思議だ。

0 件のコメント:

コメントを投稿