「OpenCLのC++ Bindingsを使ってみる - その1」、「OpenCLのC++ Bindingsを使ってみる - その2」、「OpenCLのC++ Bindingsを使ってみる - その3」、「OpenCLのC++ Bindingsを使ってみる - その4」、「OpenCLのC++ Bindingsを使ってみる - その5」とOpenCL C++ Bindingsを使ってみたが、やはり計算を始めるまでの処理があれやこれやと長々と続くので、ある程度クラスでラップしてみた。このクラスがある前提で、「OpenCLのC++ Bindingsを使ってみる - その5」のコードを書き換えると、次のようになる。
#define __CL_ENABLE_EXCEPTIONS #include "OpenCL.hpp" #include <iostream> const int nElements = 9000000; float input1[nElements]; float input2[nElements]; float output[nElements]; int main(int argc, char* argv[]) { std::string addVector( "__kernel void\n\ addVector(__global const float *input1,\n\ __global const float *input2,\n\ __global float *output)\n\ {\n\ int index = get_global_id(0);\n\ output[index] = sin(input1[index]) * sin(input2[index]);\n\ output[index] = cos(output[index]);\n\ output[index] = pow(output[index], output[index]);\n\ }\n"); for(int i = 0; i < nElements; i++){ input1[i] = (float)i * 10.0f; input2[i] = (float)i / 20.0f; output[i] = 0.0f; } try{ DECS::OpenCL ocl; ocl.setSource(addVector); ocl.buildProgram(); ocl.setKernel(std::string("addVector")); ocl.setKernelInputArgument(0, input1, nElements); ocl.setKernelInputArgument(1, input2, nElements); ocl.setKernelOutputArgument(2, nElements); ocl.enqueueNDRange(nElements); ocl.readBuffer(2, output, nElements); for(int i = 0; i < 20; i++){ std::cout << "input1[" << i << "], input2[" << i << "], output[" << i << "] : "; std::cout << input1[i] << ", " << input2[i] << ", " << output[i] << std::endl; } }catch(cl::Error err){ std::cerr << "ERROR: " << err.what() << "(" << err.err() << ")" << std::endl; } return 0; }
こんな具合でかなり短くなった。そして、今回作ったOpenCL.hppとOpenCL.cppはこれ( DECS_OpenCLをダウンロード)。前回までのOpenCL部分をクラス内部に入れただけなので、まだまだいけてない部分が多い。特に次にあげる部分は何とかしないとあまり使えないと思う。
- デバイス選択ができず先頭のデバイス固定なところ
- コマンドキューが一つしか持てないところ
- バイナリからプログラムが用意できないところ
- カーネル引数がfloat型固定なところ
- イベントを考慮していないところ
- タスク分割型を考慮していないところ
- Bufferまわりに柔軟性が全くないところ
- OpenCLソースを外部ファイルから読み取れないところ
などなど、まだまだ足りない部分だらけなので、少しずつ足していこうかと思う。
Y&A0608 > ありがとうございます。何かの助けになれば幸いです。
投稿情報: INCHOKI | 2012/03/24 04:58
こんにちは、はじめまして!
これぞまさしく‘IT技術’といったブログで、さすがです!!
私は技術者ではないのですが、WEBを勉強しているので、PHPとか少しかじっているので(昨年学校を途中退校したので…)懐かしさ反面、もっと勉強せねばという感じがしています。
参考にさせていただきます。ポチ(*´・∀・)ホォホォ♪
投稿情報: Y&A0608 | 2012/03/23 15:50
参考になりそうですね♪
投稿情報: ハーバードナンパスクール佐藤エイチ | 2012/03/21 18:00