共享OpenCL内核数据

3
我有两个 OpenCL 内核,分别是 run_kernelapply_kernel,我想让它们按顺序运行几次。其中 run_kernel 的输出包含一些 apply_kernel 的输入,但我不确定如何实现这一点。
目前,我有一个名为 d_vertexBuffer 的单个 cl_mem 缓冲区,我用要传递给 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循环将内核入队到命令队列中。显然这不是正确的做法。我该如何使两个内核能够共享数据?
2个回答

1
根据您的描述,您希望能够将run_kernel的重要输出附加到d_vertexBuffer的末尾。您可以使d_vertexBuffer足够大,以存储正常输入值(vertexBufferSize)和run_kernel的额外顶点的输出。run_kernel将其对于apply_kernel有用的输出复制到d_vertexBuffer上方的vertexBufferSize部分。

问题在于 d_vertexBuffer 包含 float4 元素,而我需要在两个内核的每次迭代中编辑每个元素。如果我只是为每次迭代添加新元素,它将变得不合理地大。 - K. Barresi

1
问题最终与此无关;我在apply_kernel中意外使用了一个2索引的全局工作大小,而我只需要1个,因此它会抛出NaN。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接