2013-07-29 186 views
3

我有2个OpenCL内核,run_kernelapply_kernel,我希望依次完成几次。 run_kernel的输出包含apply_kernel的一些输入,但我不确定如何实现此操作。共享OpenCL内核数据

目前,我有一个单一的cl_mem缓冲区名为d_vertexBuffer,我填写了我想给run_kernel的数据,并且它正确地完成了它的工作。我设置精氨酸这样的内核:

error = clSetKernelArg(run_kernel, 0, sizeof(cl_mem), (void*) &d_vertexBuffer); 

我已尝试设置apply_kernel使用相同d_vertexBuffer,但我猜这打乱了run_kernel访问到它,因为OpenCL的代码也越来越为NaN时,它试图访问缓冲区。我设置了apply_kernel这样的:

error = clSetKernelArg(apply_kernel, 0, sizeof(cl_mem), (void*) &d_vertexBuffer); 

我创建d_vertexBuffer这样的:

d_vertexBuffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, vertexBufferSize, h_vertexBuffer, &error); 

为了多次运行这些内核,我有一个for循环,排入内核在我的命令队列。显然这不是正确的做法。我将如何做到这一点,以便两个内核能够共享数据?

回答

1

该问题最终是不相关的;我偶然在apply_kernel中使用了一个2索引的全局工作大小,当我只想要1时,所以抛出了NaN,

1

通过它的声音,您希望能够将run_kernel的重要输出附加到d_vertexBuffer的末尾。您可以使d_vertexBuffer大到足以存储正常输入值(vertexBufferSize)加上run_kernel输出中的额外顶点。 run_kernel将其对于apply_kernel重要的部分输出复制到d_vertexBuffer以上的部分上面vertexBufferSize

+0

问题是'd_vertexBuffer'包含'float4'元素,我需要编辑每个元素用于两个内核的每次迭代的元素。如果我在每一次迭代中都要加入新的元素,它会变得不合理。 –