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]);
}