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 グラフィックプロセッサ。具体的にはOpenGLDirectXが利用できるもの。
  • 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に指定した全てのデバイスを含むコンテキストが作成できる。