関数の速度(12)

(いろいろ修正)

ここ3日くらいは、GPGPUをやっていた。
GPGPUGeneral Purpose GPUの略で、
GPUは本来グラフィックの処理をやらせるものを、
それ以外のことでも使おうということ。
なぜなら、GPUのほうがCPUより圧倒的に速いから。
多くのデータを並べておいていっせいに処理する。
いっせいにといっても、演算ユニットは数十だから、
それよりは多く並列で走らないが、
見かけ上は何万というデータをいっせいに処理する。
それに、それ用のプログラミングをしなければならない。


データを画像に見立てて処理する。
具体的には、
ある大きさのテクスチャを用意する。
(縦横それぞれ2のべきでないといけない)
その一つ一つのピクセルをデータと見る。
実際には一つのピクセルにRGBとA(アルファ)があるので、
4つのfloatを入れられる。


256×256のテクスチャを用意して、
256×256×4のfloatの配列を用意して、
そこに値を適当に入れる。
それをGPUに転送して、sin計算をさせた。
転送込みで約5msで返ってきた。
一つのsinの計算あたり約20nsということになって、
一つのCPUの計算より約2.5倍速いことになる。


GPUの処理を制御するのにシェーダ言語と呼ばれるものを使う。
具体的にはGLSLなどを使うが、
ここでは、GLSLには一つのことしかやらせていない。
もっと複雑なことをやらせれば、
オーバーヘッドの分が相対的に減って、
もっとCPUより速くなる。
たくさんのポリゴンと衝突判定をやらせたら、
CPU一つの12倍の速度が出た。


逆に、処理量が減るとオーバーヘッドが相対的に大きくなり、
GPUを使う意味がなくなってしまう。
上のsinは、帰り間際の10分でちゃちゃっと書いたので、
どれくらいのデータがあればGPUが有効なのかわからない。
来週調べよう。


ある程度データがまとまっていて、相互干渉がない、
というのがもちろん条件だが、
やってみると色々弱点が見えてくる。
どうやらピクセルあたりの処理があまりに時間がかかりすぎると、
途中で仕事を投げ出して返ってくるらしい。
それから、ビット演算がまだないらしい。
まだ整数演算は苦手なようだ。
そのへんは、CPUといっしょに、弱点を補いながらうまく使っていくのだろう。


今日はコードがない。
家にもGPUつきボードがあれば試せるが、
まあ、安くなれば。

(追記)
上で試したのは一世代前のGPUだった。
最新のものはビット演算もサポートしている。
途中で投げ出す、ということも今のところ遭遇していない。


しかし、デバッグしにくいし、まだまだ組みにくい。