2008年1月9日水曜日

あへあへ3

cudaでのシミュレーションで、シナプスコンダクタンスの計算がバカみたいに時間がかかってたので、やりかたをちょっと変えてみた。

一般にシナプスコンダクタンス計算の実現方法はいろいろある。いちばん早いのはキャッシュに乗るようなテーブルを利用する方法なんだが、キャッシュに乗らないと使えない。

今回はShared memoryに乗るような状況だったので、それでやってたが、それがどうやら問題だったようだ。スレッドの数がめちゃくちゃ多いのでテーブルへのアクセスの競合が起きているようで、メモリの早さがいかされていなかったようだ。

そこで、テーブルを使わず、各スレッドでα関数(指数関数を含む)でそのつどシナプスコンダクタンス計算させて、メモリの競合などは起きない状況にするとかなり早くなった。

逆に余ったテーブル用のメモリをつかって、コンダクタンス計算の方法をちょっと変えてみたら、ばかっぱや!

結果として、Cellでやったときの約5倍の速度になった。すげー。
大体8800GTのカタログスペックはCellの倍だ。倍以上はやくなったのは、そもそもアルゴリズムが変わって、効率があがっているのと、SFUがあるせいかもしれない。Cellでの指数関数の計算コストはとにかくでかかったからなあ。

最適化はまだそんなに本格的にやってないので、きっとまだ速度はあがる。昨日、気づいたのだが、パイプラインを効率的に使うにはwarp8つ分のスレッドを実行しないと行けないらしい。今はwarp2個分しか使ってない。でもwarp8つ分でsm14個をフルに使うとなると、8*32*14=3584個のスレッドを同時実行することになる。ひえ〜。でもスレッドといってもデータスレッドであって、一般的なスレッドとは違うみたいだけど。

0 件のコメント: