Worldお久しぶりです。@jirohclです。Calenderの季節になりました。Calender@3日目となります。この記事は温故知新と聞こえの良い事を言いつつ、ネタが思い浮かばなかった苦肉の策、タイトルの通り古臭いGPGPUをやってみようと思います。古臭いGPGPUとは何かと言うと、プログラマブルシェーダ、特にピクセルシェーダを用いて汎用計算をやってみましょうというアレです。これを知ることでCUDA/OpenCL等は裏側で一体何をしているのか押し知ることが出来、また効率的な実装の方法も見えてくるはず。(建前)まず、GPGPUをするために何が必要かというとご存知の通り1.デバイスへの入力2.処理関数3.ホストへの出力これら3つ。1の入力はテクスチャを使うのがポピュラーな方法です。次に2の処理関数に関してはフラグメントシェーダーで頑張ります。3はglReadPixels等のレンダリング後の画像を読み込む関数を使うことで結果を取り出します。デバイス側のコード(行列積)を見てみましょう。vec4(result,1.f);}バーテクスシェーダ自体は何も特別なことは行わず、フラグメントシェーダで積を演算しています。ここでフラグメントシェーダでの演算ですが実は一つ大きな問題があり、フラグメントシェーダー内での処理には時間制限があるために行列のサイズが大きくなると計算が正常に終了しなくなります。OpenCLを使ったことがある方はきっと身に覚えがあるかと思います。0);::glDisableClientState(GL_VERTEX_ARRAY);::glDisableClientState(GL_TEXTURE_COORD_ARRAY);::glFlush();::glReadPixels(0,0,mat_size,mat_size,GL_RGBA,GL_FLOAT,result);デバイスへのデータ転送、カーネルの実行する”だけ”でもこれだけの決まりごとの命令が必要になります。この他にもシェーダの初期化、ユニフォーム、イン/アウトへの関連付け、等々面倒くさい作業が目白押しとなっております。