我在将向量结构传递给 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);