前回のが思いっきりミスしてたので修正。
CUDAのスレッドってのはいわゆるSIMD。同じ処理を同時にやるだけ。探索で意味があるのは同時に別の処理を行える並列処理。前回のヤツだとうまく並列高速化ができていない。
っつーわけで修正。
GPUカーネルのthreadIdxをblockIdxに変更して、呼び出し側はthreadを1,1,1、gridをN,1,1に変更。
- 逐次実行N=12 9800msec
- 偽並列実行N=12 2300ms
- 真並列実行N=12 870ms
クソ速いな。
ちなみに実験機はQuadroFX4600、CUDAで言うところの「マルチプロセッサ」、要するに演算器のまとまりが12組ある。これは8800GTSと同数で、8800GTX/Ultraは16。そのためか、実装によってはN=13で実行するとうまくいかない。このへんの数の制限みたいなのはまだちょっと脳内で混乱が生じているので、ちゃんと把握しないといかんな。
それにしても、こんなに簡単に10倍以上の性能を拝めるのは、OpenMPプログラムをプロセッサ数16以上というややレアなスーパーコンで動かすときくらいのものだと思うのですよ。素晴らしいなぁ。