B.31. カーネル引数設定

B.31.1. clSetKernelArg

表B.81 表:clSetKernelArg

関数

cl_int

clSetKernelArg (
    cl_kernel kernel,
    cl_uint arg_index,
    size_t arg_size,
    const void *arg_value
)

kernelの特定の引数に対して引数値を設定。

引数

kernel

有効なカーネル
オブジェクトを指定。

arg_index

引数の添字(インデックス)
を指定。

カーネルが宣言している
引数の数をnとした場合、
左端の引数を0で始めて
n - 1 までの添字で
カーネルの引数の番号
を指定。

一例として、以下の5つ
の引数をもつカーネル
を考察する。

__kernel void image_filter (
    int n,
    int m,
    __constant float *filter_weights,
    __read_only image2d_t src_image,
    __write_only image2d_t dst_image)
{
    ...
}

引数のインデックスは、
引数nが0、引数mが1、
引数filter_weightsが2、
引数src_imageが3、
引数dst_imageが4となる。

arg_value

arg_indexで指定した
引数に、カーネルの引数
値として渡したいデータ
へのポインタを指定。

arg_valueが指す引数
データは複製され、
clSetKernelArg()が戻
った後にアプリケーション
はarg_valueポインタを
再利用可能。

指定した引数値は、
clSetKernelArg() を
呼び出して kernel の
引数値を変更するまで、全
てのカーネルを挿入する
API(clEnqueueND
RangeKernel() および
clEnqueueTask())の呼
び出しで使用。

引数がメモリオブジェクト
(バッファオブジェクトや
イメージオブジェクト)
である場合、arg_value
にはバッファ・イメージ・
イメージ配列オブジェクト
へのポインタを指定。指定
するメモリオブジェクトは、
kernelと関連付けられた
OpenCLコンテキスト上で
生成される必要がある。

引数がバッファオブジェク
トの場合、NULL値を指定
できる。またはNULL値に
ポインタを指すことができ、
その際、カーネル内で
__globalもしくは
__constant メモリへの
ポインタとして宣言された
引数への値としてNULL値
が設定される。

引数が__local修飾子付
で宣言された場合、
arg_valueにはNULL値を
指定する必要がある。引数
型がsampler_tである場合
は、arg_valueエントリは
サンプラーオブジェクトへ
のポインタを指定する
必要がある。

引数が組み込み、または
グローバル・コンスタント
アドレス空間内のユーザ定
義型へのポインタであると
き、引数値として指定する
メモリオブジェクトはバッ
ファオブジェクト(または
NULL)である必要がある。
引数が`__constant`修飾
子付で宣言された場合、
メモリオブジェクトのバイ
トサイズは CL_DEVICE_
MAX_CONSTANT_BUFFER_
SIZEの値を超えることはで
きない。また、
__constant修飾子付で
宣言できる引数の数は
CL_DEVICE_MAX_
CONSTANT_ARGSの値を
超えることはできない。

引数型がimage2d_tの
場合、引数として指定す
るメモリオブジェクトは
2Dイメージオブジェクト
となる必要がある。

引数型がimage3d_tの
場合、引数として指定する
メモリオブジェクトは3D
イメージオブジェクトと
なる必要がある。

引数型がimage1d_
buffer_tの場合、引数
として指定するメモリオ
ブジェクトは1Dイメージ
オブジェクトとなる必要
がある。

引数型がimage1d_
array_tの場合、引数と
して指定するメモリオブ
ジェクトは1Dイメージ
配列オブジェクトと
なる必要がある。

引数型がimage2d_
array_tの場合、引数と
して指定するメモリオ
ブジェクトは2Dイメージ
配列オブジェクトとな
る必要がある。

他の全てのカーネル引
数については、
arg_valueに引数値と
して実際に使用される
データへのポインタを指
定する必要がある。

arg_size

引数値のサイズを指定。

引数がメモリオブ
ジェクトの場合、サイズ
はバッファ・イメージ
オブジェクト型のサイズ
となる必要がある。

`__local`修飾子付で
宣言された引数につい
ては、指定したサイズは
、__local 引数のため
に割り当てるバッファの
バイトサイズとなる。

引数型がsampler_tで
ある場合、arg_sizeに
指定する値は
sizeof(cl_sampler)
と等しくなる。他の全て
の引数については、引数
型のサイズを指定。

成功した場合の戻り値

CL_SUCCESS

失敗した場合の戻り値

CL_INVALID_ KERNEL

kernelが有効なカーネル
オブジェクトでない場合。

CL_INVALID_ ARG_INDEX

arg_indexで指定した引
数のインデックスが適切
でない場合。

CL_INVALID_ ARG_VALUE

arg_valueで指定した
引数が有効な値でない
場合。


CL_INVALID_ MEM_OBJECT

メモリオブジェクトと
宣言された引数に対して
arg_valueで設定した
引数値が有効なメモリオブ
ジェクトでない場合。

CL_INVALID_ SAMPLER

 sampler_t型を指定
するように宣言された
引数に対してarg_value
で設定した引数値が有効
なサンプラーオブジェク
トでないとき。

CL_INVALID_ ARG_SIZE

メモリオブジェクトで
はない引数に対して
arg_sizeが引数型と
一致しない場合。

引数がメモリオブジェクト
で、arg_sizeがsizeof
(cl_mem)と一致しない
場合。

引数が`__local`修飾
子付で宣言され、
arg_zeroが0の場合。

引数がサンプラーオブ
ジェクトで、arg_size
がsizeof(cl_sampler)
と一致しない場合。

CL_INVALID_ ARG_VALUE

引数がread_only修飾子
で宣言されたイメージで、
arg_valueがcl_mem_
flagsでCL_MEM_WRITE
を指定したイメージオブ
ジェクトを参照する場合。

イメージ引数がwrite_
only修飾子で宣言され、
arg_valueがcl_mem_
flagsで CL_MEM_READ
を指定したイメージオブ
ジェクトを参照する場合。

CL_OUT_OF_ RESOURCES

デバイス上のOpenCL
実装が必要とする
リソース確保に失敗
した場合。

CL_OUT_OF_ HOST_MEMORY

ホスト上のOpenCL
実装が必要とする
リソース確保に失敗
した場合。

Copyright 2018-2019, by Masaki Komatsu