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

在OpenCL中,是否可以使用内核参数更新GPU上分配的内存位置?,opencl,nvidia,Opencl,Nvidia,我在GPU内存上分配了一个OpenCL缓冲区(有限数组)。现在我想在每次内核执行中更新该数组的一个特定索引(内存位置)(同一个内核有多个内核执行)。我可以将新值作为内核参数传递并在内核内部进行更新吗?更新值后,在下一次内核调用中,更新是否可用?您可以将索引(以及值)作为内核参数传递。 比方说,您将内核放入一个特定的顺序队列中,更新应该在下一次内核执行时可用。您的要求不是100%清楚,但是: 是的,内核可以对使用CL\u MEM\u WRITE\u ONLY或CL\u MEM\u READ\u

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

您可以将索引(以及值)作为内核参数传递。

比方说,您将内核放入一个特定的顺序队列中,更新应该在下一次内核执行时可用。

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

  • 是的,内核可以对使用
    CL\u MEM\u WRITE\u ONLY
    CL\u MEM\u READ\u WRITE
    分配的缓冲区中的内存位置执行任意写入
  • 您可以将使用同一缓冲区的多个内核运行排队。根据OpenCL内存模型的规则,缓冲区内容将被持久化
  • 如果对同一内存位置进行写操作或混合读写操作的任何工作项都可以计划并发运行,则需要使用某种形式的同步

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

您能更好地描述一下您到底想做什么吗?对我来说,更新一个特定的索引意味着什么并不完全清楚。比如更新从全局ID到内存位置的偏移量?可能提供一些代码或伪代码。谢谢您也可以将新值作为内核参数传递。@pmdj感谢您指出它