GPGPUで整数計算(1)

GPGPUというのは、General Purpose GPUの略で、
本来CGに使うGPUを汎用的に使おうという話。


GPUは使いにくい面はあるが、CPUより圧倒的に速い。
革命的に速くなる。


しかし、整数計算ではまだあまり使われていないのではないだろうか。
(私も仕事では浮動小数点計算しかしていない)
そのへんができるように今から考えていきたい。



今使っているグラフィックボードは、
NVIDIA GeForce 8800 GTX
というもので、
ちょうど新しい世代のGPUが出てきたところなので、
一世代古いものだということになる。
これと、C++WindowsとVCで話を進めていく。

GPGPUの概要

GPUによる計算というのは、
画像を入力して新しい画像を出力する、
ということになる。
画像というのは、ピクセルごとのデータのことで、
(これ以外にもあるらしいがおいといて)
ピクセルごとにRGBA(Aは透過度を表すアルファ)の値を持つから、
1ピクセルに4つの浮動小数点数を持つ。


画像の幅をnWidth、高さをnHeightとすると、
floatの配列で、nWidth * nHeight * 4の大きさのものを用意する。
幅と高さは2のべきでなければならない。
ここに値を入れて、GPUに転送する。


その前にGPU用のプログラムをGPUに転送する。
このプログラムはCのような文法で書けるものである。
そうすると、GPUのほうでコンパイルし、
ピクセルごとに並列で処理を実行する。
実際には並列で走るのは100前後のようだが、
みかけ上は全てのピクセルで並列に走る。
プログラムも、ピクセルごとの処理しか書かない。
処理した結果は、再びピクセルごとのRGBAとして出力する。


CPUのほうで、先ほどと同じ大きさのfloatの配列を用意しておき、
これに結果を受け入れる。


実際のコードは次回以降。