内核之间的 OpenCL 数据依赖关系



我需要编写一个 OpenCL 程序,用于将大型缓冲区(数百万个浮点数(减少为单个浮点数。为了问题的简单性,我在这里假设我需要计算所有浮点数的总和。

所以我写了一个内核,它以浮点缓冲区作为输入,并用 64 的数据包对其进行求和。它将结果写入小 64 倍的缓冲区。然后,我迭代此内核的调用,直到数据足够小,可以复制回主机上并由 CPU 求和。

我是 OpenCL

的新手,我是否需要在每个内核之间设置屏障以便它们按顺序运行,或者 OpenCL 是否足够智能以检测到第 n 个内核传递正在写入用作 n+1 个内核输入缓冲区的输出缓冲区?

还是有更聪明的方法?

如果您为所有

内核启动使用单个按顺序的命令队列(即不使用 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 属性(,则每个内核调用将在下一次开始之前运行完成 - 您不需要任何明确的障碍来强制执行此行为。

如果使用无序命令队列或多个队列,则可以通过使用 OpenCL 事件强制实施数据依赖关系。每次调用clEnqueueNDRangeKernel都可以选择返回一个事件对象,该对象可以作为依赖项传递给后续命令。

最新更新