【发布时间】:2014-08-27 23:46:49
【问题描述】:
我有以下 OpenCL 内核:
//OPENCL KERNEL
struct MyStruct
{
float A;
float B;
float C;
float D;
float E;
};
__kernel void kernelMain(struct MyStruct* outputBuffer)
{
size_t idx = get_global_id(0);
//Do some stuff here with the outputBuffer
outputBuffer[idx].A = 42.0;
}
如您所见,它定义了一个自定义类型,称为 MyStruct。
在主机端,我有相同的结构定义(复制粘贴):
//HOST SIDE
struct MyStruct
{
float A;
float B;
float C;
float D;
float E;
};
我正在尝试为内核数据的写入创建一个缓冲区,同样是主机端代码:
//HOST SIDE
cl::Buffer outputBuffer(clContext, CL_MEM_READ_WRITE, (size_t)numElements * sizeof(MyStruct));
clKernel.setArg(0, outputBuffer);
当我调用 clKernel.setArg 时出现问题。它失败并显示错误代码 -51,根据 OpenCL 文档,这是内核无效参数大小错误。
我尝试使用 openCL 数据类型,将结构的主机定义重写为:
struct MyStruct
{
cl_float A;
cl_float B;
cl_float C;
cl_float D;
cl_float E;
};
但这也会报错。
我的问题是: 为使用自定义结构创建 OpenCL 缓冲区的正确方法是什么?
【问题讨论】:
-
尝试 __kernel void kernelMain(__global struct MyStruct* outputBuffer) 或只是 __kernel void kernelMain(__global MyStruct* outputBuffer)
-
使用
typedef struct {...} MyStruct;和内核参数__kernel void kernelMain(__global MyStruct* outputBuffer)