OpenCLのお勉強3
いいかげんいままでまったくコードが登場しなかったが、今回から若干登場し始める。
ちなみに、ここの内容は、英語力のない人間が、The OpenCL Specification Ver1.0 Rev3.3を読みながらなので、不審な点があるならばどんどん指摘してください。
OpenCLの初期化
まず、利用可能なデバイスの一覧を取得するにはclGetDeviceIDs()を使う。プロトタイプは
cl_int clGetDeviceIDs(cl_device_type device_type, cl_uint num_entries, cl_device_ids *devices, cl_uint *num_device);
で、device_typeのデバイスがnum_device個あり、その一覧がdevicesに格納される。num_entriesは渡す配列devicesの大きさを指定する。device_typeに渡せる定数は次の通り。
- CL_DEVICE_TYPE_CPU ホストプロセッサ。コア数によらずひとつとして認識される。
- CL_DEVICE_TYPE_GPU グラフィックプロセッサ。具体的にはOpenGLやDirectXが利用できるもの。
- CL_DEVICE_TYPE_ACCELERATOR Cell B.E.のSPEのようなアクセラレータ。おそらくDSPもここに含まれると思う。
- CL_DEVICE_TYPE_DEFAUTL システムでデフォルトとなっているデバイス。
- CL_DEVICE_TYPE_ALL OpenCLが走るすべてのデバイス。
戻り値はCL_SUCCESSで正常に取得できたことを示す。
取得したデバイスの持つ機能についてはclGetDeviceInfo()で取得できる。
cl_int clGetDeviceInfo(cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
これを実行すると、deviceの持つ機能等がaram_valueに格納される。param_nameが調べたい機能。param_value_sizeはparam_valueの格納可能なサイズを渡す。param_value_size_retには実際に書き込まれたサイズが入る。param_nameに指定できるものの一覧は原典を参照。あとで必要なときに登場するかも。
コンテキストの作成はclCreateContextで行う。
cl_context clCreateContext(cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (*pfn_notify)(const char *errinfo, const void *private_info, size_t cb, void *user_data), void *user_data, cl_int *errcode_ret);
clGetDeviceIDsで得られたデバイスIDの配列をdevicesに、その個数をnum_devicesにわたす。作成が成功するとerrcode_retがCL_SUCCESSとなる。基本的には他の引数はNULLでかまわない。
また、clCreateContextFromType()でも作成できる。
cl_context clCreateContext(cl_context_properties *properties, cl_device_type device_type, void (*pfn_notify)(const char *errinfo, const void *private_info, size_t cb, void *user_data), void *user_data, cl_int *errcode_ret);
こちらの場合、device_typeに指定した全てのデバイスを含むコンテキストが作成できる。