C++ 如何将结构中的数组传递给内核?

C++ 如何将结构中的数组传递给内核?,c++,opencl,C++,Opencl,我需要向内核输出一个结构数组,其中将有一个数组。但最终,数据有点正确,但在某种程度上是错误的。 我在主机上有这个代码 struct myStruct { int a; double b; double c[5]; }; myStruct *result = new myStruct[countOptim]; for (int i = 0; i < countOptim; i++) { result[i].a = 5; result[i].b =

我需要向内核输出一个结构数组,其中将有一个数组。但最终,数据有点正确,但在某种程度上是错误的。 我在主机上有这个代码

struct myStruct
{
    int a;
    double b;
    double c[5];
};

myStruct *result = new myStruct[countOptim];

for (int i = 0; i < countOptim; i++)
{
    result[i].a = 5;
    result[i].b = 11.5;
    for (int j = 0; j < 5; j++)
    {
        result[i].c[j] = j;
    }
}

// Make kernel
Kernel kernel(program, "vector_add");

Buffer bufferResult = Buffer(context, CL_MEM_READ_WRITE, countOptim * sizeof(myStruct));

queue.enqueueWriteBuffer(bufferResult, CL_TRUE, 0, countOptim * sizeof(myStruct), result);


kernel.setArg(0, bufferResult);


// Run the kernel on specific ND range
NDRange global(countOptim);
queue.enqueueNDRangeKernel(kernel, NULL, global);
在控制台中显示以下内容:

也许问题在于记忆


好的,这是通过在内核中指定数组的大小来修复的。但是,在内核中不设置数组大小是否可行?

两个结构的大小不同,因此它可能会读取垃圾(这与输出模式相匹配)<代码>双c[]与
双c[5]不同,第一个是指针的大小,第二个是五个双精度的大小-我不知道您是否可以在OpenCL中实现后者。@MaxLanghof我已经认为我们将只设置最大可能的大小,但我将使用我在输入参数中指定的大小。这是我看到的唯一解决方法如果您想使用固定大小的
c
,它的大小必须在编译时设置(即在声明中),因为
double c[]
会导致与
double c[5]
不同的(不兼容)结构。或者,您可以将所有
c
数据存储/传输到某个地方的单个缓冲区中,只需将索引(和长度)存储到
myStruct
中的该缓冲区中即可。
struct myStruct
{
    int a;
    double b;
    double c[];
};
typedef struct myStruct myStruct;

__kernel void vector_add(__global myStruct *result) 
{


   // Get the index of the current element to be processed
   int id = get_global_id(0);

   printf("a - %d, b - %f, c[0] - %f",result[id].a, result[id].b, result[id].c[0]);
}