ベクターの構造体を OpenCL カーネルに渡す際に問題が発生しています。
簡単に言うと、C 構造体を渡すことができることがわかりました。
typedef struct {
cl_float4 vec;
} my_type;
. . . カーネルに、次のように宣言すると:
typedef struct { float s[4]; } my_float4;
typedef struct { my_float4 vec; } my_type; //use custom float4
__kernel void function(const my_type test) {}
. . . しかし、次のように宣言した場合はそうではありません:
typedef struct { float4 vec; } my_type; //use built-in float4
__kernel void function(const my_type test) {}
私の質問は、float4 の違いと特別な点は何ですか? 2 番目の例では、clSetKernelArg で CL_INVALID_ARG_SIZE を取得します。ホスト コードでは cl_float4 を使用していますが、これはカーネルで float4 とペアになっているはずではありませんか?
編集: リクエストにより、clSetKernelArg コード (エラー処理がトリミングされています):
template <typename type_data> void set_argument(int arg_index, const type_data* data) {
cl_int err = clSetKernelArg(kernel,arg_index,sizeof(type_data),data);
if (err!=CL_SUCCESS) throw "ERROR"; /*simplified*/
}
上記とまったく同じように宣言された構造体で関数を呼び出します。
my_type test;
my_kernel->set_argument(0,&test);