struct - OpenCL floatn 与自定义结构有何不同

标签 struct opencl

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

最佳答案

这听起来像是您的实现中的错误 - 您应该能够毫无问题地将用户定义的类型传递给内核。您使用的是什么平台/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 设备上给出正确的结果。

关于struct - OpenCL floatn 与自定义结构有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11161650/

相关文章:

c++ - 将缓冲区写入设备时发生 OpenCL 访问冲突

c - 在结构中有一个不完整的数组是什么意思?

c - 存储 BMP 文件的像素值

c - 在 C 中创建函数指针结构时从未完成的类型错误

linux - openCL 和 openMP 教程——位置?

opengl - OpenCL - 压缩的 OpenGL 纹理

我可以使用 memcmp 检查结构中的非零成员吗?

C++:从映射文件中读取带有 vector 的结构

c++ - cl::Program::Sources 在哪里定义的?

OpenCL 在 GTX 760 上只显示 6 个并行计算单元?