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

内核之间的OpenCL数据依赖关系,opencl,Opencl,我需要编写一个OpenCL程序,将一个大缓冲区(几百万个浮点)缩减为一个浮点。为了问题的简单性,我在这里假设我需要计算所有浮点数的和 因此,我编写了一个内核,它以一个浮点缓冲区作为输入,并通过64个数据包对其求和。它将结果写入一个小64倍的缓冲区。然后我迭代这个内核的调用,直到数据足够小,可以复制回主机并由CPU求和 我是OpenCL新手,我是否需要在每个内核之间设置一个屏障,以便它们按顺序运行,或者OpenCL是否足够智能,能够检测到第n个内核过程正在写入用作第n+1个内核输入缓冲区的输出缓冲

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

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

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


或者有更聪明的方法吗?

如果您对所有内核启动都使用一个顺序命令队列(即,您不使用
CL\u队列\u OUT\u of\u order\u EXEC\u MODE\u ENABLE
属性),然后,每次内核调用都将在下一次调用开始之前运行到完成-您不需要任何明确的障碍来强制执行此行为


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

如果对所有内核启动使用单个顺序命令队列(即不使用
CL\u队列\u OUT\u of order\u EXEC\u MODE\u ENABLE属性),然后,每次内核调用都将在下一次调用开始之前运行到完成-您不需要任何明确的障碍来强制执行此行为

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