2008年1月12日土曜日

2枚起動&CUDA+MPI

だいたいシミュレーションはできたので、ちがうことやろうと2枚ざし同時実行を試しにやってみた。cudaのsampleにmultiGPUというわかりやすいのがあったので、利用した。助かる〜。

結果、あまり苦もなく実行できた。ただ、GPU間の相互のデータ通信はなくて、単に2つ同じプログラムを実行しているだけ。データのやりとりはちょっとすぐにはできなそうだ。

まだ余力があったのでMPI実行できないかなと試してみた。WindowsでMPI実行するのは初めてだったんだが、インストールが超ー簡単だな。Linuxは偉い苦労した気がするけど。VC特有のエラーがちょっとでたが、結構簡単に実行できた。わーい。今のところ、通信のレイテンシは500μsまでは隠蔽できる予定なので、MPIでクラスタ組めば、性能はリニアにスケールする予感。あとはクラスタ組む程、金があればなあ…。

2008年1月10日木曜日

スレッド増量中

blockあたりのwarpを増やしてみた。8つまでふやすとよいという情報を信じてやってみたら、warpを7つまで増やすと、計算が落ちる。なんでだ?
でも6つまででも早くなる。早くなったけど、それを相殺するコードのミスが他にあって、結局とんとんになった。それにしても、2000近いスレッドが並列に走って早いというのはすごいなあ。

こんだけスレッドが多いと、いままでと世界がちょっと変わってくる。メモリのデッドロックの影響なんかはもろにでてくる。スレッド間のやりとりも、典型的なツリー構造の通信とかを本気でやる必要がでてくる。並列計算の本を見直さなきゃ〜。


PCは8800GTが2枚ざしなので、2枚並列演算もやりたいな。それができたらMPIかな。そろそろ個人のお金じゃきつくなってきたなあ…。

2008年1月9日水曜日

あへあへ3

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

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

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

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

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

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

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

あへあへ2

ちっと8800GTでのシミュレーションをいじくってたら、blockの同期がかなりまともな速さでできるようになった。どうも一つフラグのメモリ領域に、多数のスレッドからのアクセスが集中する状況になるようなあほコードに原因があった模様。あほあほ。アクセスがバラけるようにちこっと変えたら解決。こういうのはセオリーというか常識なんだろうか?うーむ。

blockの同期は全然いける。nvidiaさん、文句いってごめんなさい。こんなんできるということは、blockの同期用のAPIがひょっとして用意されてるのか?

ところで、シミュレーション時の浮動小数点数演算性能を軽く見積もってみた。結合はなし。指数関数をどう換算するかが難しいのだが、8倍のclock cycleがかかるので大雑把に10倍の10FLOPSとして計算した。そうすると約600GFLOPS。本当?そんな出てるの?

2008年1月7日月曜日

民主主義

NHKの民主主義というドキュメントを見た。何回かあって、どれも面白い。今日は中国の子供選挙。

誠実な女の子候補が最後に勝つのかと思っていたら、投票直前に買収をしかけた子が大差で勝った。これにはものすごいびっくりした。なにかの幻滅を一瞬感じたが、そうじゃない、これが民主主義の原理であるということを痛感した。

所詮、子供のリーダーにだれがなろうと、子供有権者の生存に直接どうこうするものじゃない。別にいいのだ。面白ければ。

これは子供だからとか、中国だからとか、そういう問題じゃない。自分に利するものに選択を行える。それが民主主義。当たり前のことだ。ただ、自分が何を利とするかが違うだけ。

民主主義って、並列処理だね。

2008年1月6日日曜日

あへあへ

あれよあれよと8800GTいろいろいじってしまった。こんなことしてる場合じゃないんですが…。

・単純な浮動小数点演算でCellの約2倍の性能がある。
超越関数専用演算器があるので、もっとあほ見たいに早くなってもおかしくないなと思っていたが、そこまではいかないよう。カタログスペックどおりの差。

・CUDAはCellに負けずに、かなり手がかかる。
GPUとGPUメモリ間の転送をしっかり手を入れてやらないとだめ。分岐が弱い。

まだろくに最適化してないけど、大変そう…。

G80って、特徴がほとんどCellと一緒。弱いところとか傾向はみんな同じ。
さて、これからどこまでやろう。あんまり報われない予感…。

2008年1月5日土曜日

実機で実行

8800GT搭載機がきた!GPGPU熱が下がり気味だったけど、せっかくなのでこれまでエミュどまりだったのを、遂に実機で実行することに!

しかし、まあこういうのは大概すんなりいかないもんだ。まず環境整備でつまづく。VS2008を実機にインストールするも、VS2005のプロジェクトがうまく実行できない。sampleもうまく実行できない。結局VS2005を入れ直す。

エミュを実行できるまで環境が整い、次に実機実行しようとすると、エミュ以外だめ!というエラーが続出。すっかり忘れてたー。

なおして、とりあえず実行してみた。できた!…みたい。まだ結果のデータを確認してないからわからんけど。

あとエミュでできなかった、block間の同期をとりあえず実行、終了はできた。えがった。


あれ、あんまはやくねえぞ…。最適化ほとんどしてないからこんなもんかな。まだCellよりおぞい。