在 OpenCL 中,是否可以使用内核参数更新 GPU 上分配的内存位置?

问题描述

我已经在 GPU 内存上分配了一个 OpenCL 缓冲区(有限数组)。现在我想在每个内核执行中更新该数组的特定索引(内存位置)(同一个内核有多个内核执行)。我可以将新值作为内核参数传递并在内核内部进行更新吗?一旦我更新了值,在下一次内核调用中,更新是否可用?

解决方法

您的要求不是 100% 清楚,但是:

  • 是的,内核可以对使用 CL_MEM_WRITE_ONLYCL_MEM_READ_WRITE 分配的缓冲区中的内存位置执行任意写入。
  • 您可以将使用相同缓冲区的多个内核运行加入队列。根据 OpenCL 的内存模型规则,缓冲区内容将被持久化。
  • 如果任何写入或混合读取和写入到同一内存位置的工作项可以安排并发运行,您将需要使用某种形式的同步。

请注意,正如@SKO 在他们的回答中指出的那样,是否可以安排多个内核排队并发运行取决于它们是否提交到同一个队列以及该队列是有序的还是并发的。 如果您将 2 个内核运行批次排入同一个有序队列,则在第一次运行中对读写缓冲区执行的任何更新都将在第二次运行中可用。(假设此类更新良好-定义。)

,

您可以将索引(以及值)作为内核参数传递。
假设您将内核排入一个特定的有序队列,更新应该在下一次内核执行时可用。