OpenCLのお勉強4

OpenCLの初期化2

各デバイスに命令キューを作成する。

cl_command_queue clCreateCommandQueue(cl_context context,
                                      cl_device_id device,
                                      cl_command_properties properties,
                                      cl_int *errcode_ret);

作りたいもののデバイスIDと、その所属するコンテキストを渡せばよい。propertiesには次のものが渡せる。

  • CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE キューのアウトオブオーダー実行を有効にする。
  • CL_QUEUE_PROFILING_ENABLE プロファイリングを有効にする。

また、次の関数で設定を変更できる。

cl_int clSetCommandQueueProperty(cl_command_queue command_queue,
                                 cl_command_queue_properties properties,
                                 cl_bool enable,
                                 cl_command_queue_properties *old_properties);

メモリの確保

ホスト上でデバイスに確保できるメモリには二種類ある。バッファ(buffer)とイメージ(image)だ。
バッファはいわゆる普通のメモリで一次元配列として確保される。そしてそのデータ型はなんでもかまわない。(スカラ、ベクトル、ストラクチャでも可)
それに対して、イメージは二ないし三次元でテクスチャやフレームバッファ、画像の格納に使う。そして各データの並びはあらかじめ設定されたフォーマットの内から選択する。そのデータの読み書きには専用の組み込み関数が用意されている。

バッファの作成には次の関数を使う。

cl_mem clCreateBuffer(cl_context context,
                      cl_mem_flags flags,
                      size_t size,
                      void *host_ptr,
                      cl_int errcode_ret);

flagsに指定できるのは以下の通り。

  • CL_MEM_READ_WRITE
  • CL_MEM_WRITE_ONLY
  • CL_MEM_READ_ONLY
  • CL_MEM_USE_HOST_PTR 実体はホスト上に置かれ、デバイス上にキャッシュされる。?
  • CL_MEM_ALLOC_HOST_PTR ホストからアクセス可能なデバイスメモリに置かれる。
  • CL_MEM_COPY_HOST_PTR デバイス上にメモリを確保し、host_ptrのデータをコピーする。

host_ptrは、前の下みっつで使われるホスト上のメモリへのポインタとなる