【问题标题】:Sharing OpenCL Kernel Data共享 OpenCL 内核数据
【发布时间】:2013-07-30 03:34:47
【问题描述】:

我有 2 个 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 循环将内核排入我的命令队列。显然,这一定不是正确的方法。我将如何使两个内核能够共享数据?

【问题讨论】:

    标签: c opencl


    【解决方案1】:

    听上去,您希望能够将run_kernel 的重要输出附加到d_vertexBuffer 的末尾。您可以使d_vertexBuffer 足够大以存储正常输入值 (vertexBufferSize) 以及来自run_kernel 输出的额外顶点。 run_kernel 将其输出中对apply_kernel 重要的部分复制到d_vertexBuffer 以上vertexBufferSize 的部分中

    【讨论】:

    • 问题是d_vertexBuffer 包含float4 元素,我需要为两个内核的每次迭代编辑每个元素。如果我只是在每次迭代中添加新元素,它就会变得不合理。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      相关资源
      最近更新 更多