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は、前の下みっつで使われるホスト上のメモリへのポインタとなる