我在将向量结构传递给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变得与众不同?在第二个示例中,我在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);
答案 0 :(得分:3)
这听起来像是您的实现的错误 - 您应该能够将该用户定义的类型传递给内核而不会出现问题。您使用的是什么平台/ SDK?我能够在主机代码中成功声明这种类型:
typedef struct _mytype {
cl_float4 val;
} mytype;
......然后再使用它:
mytype t;
status = clSetKernelArg(kernel, argc++, sizeof(mytype), &t);
check_status("clSetKernelArg:mytype t", status);
check_status执行您期望的操作:检查非CL_SUCCESS
返回值。
内核看起来像这样:
typedef struct _mytype {
float4 value;
} mytype;
kernel void do_it(/* ... */, const mytype test) { /* ... */ }
编译并执行,在CPU设备上给出正确的结果。