我需要编写一个OpenCL程序,用于将大缓冲区(数百万个浮点数)减少到一个浮点数中。为了简化问题,我想在这里我需要计算所有浮点数的总和。
所以我编写了一个内核,它将浮点缓冲区作为输入,并将其与64的数据包相加。它将结果写入一个小64倍的缓冲区。然后我迭代调用这个内核,直到数据足够小,可以复制回主机并由CPU求和。
我是OpenCL的新手,我是否需要在每个内核之间设置一个屏障,以便它们按顺序运行,或者OpenCL是否足够智能以检测第n个内核传递是否正在写入用作输出的输出缓冲区第n + 1内核的输入缓冲区?
或者有更聪明的方法吗?
答案 0 :(得分:4)
如果您正在为所有内核启动使用单个有序命令队列(即您不使用CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
属性),那么每个内核调用将在下一次开始之前运行完成 - 您不需要任何明确的障碍来强制执行此行为。
如果您使用的是无序命令队列或多个队列,则可以通过使用OpenCL事件来强制实施数据依赖性。每次调用clEnqueueNDRangeKernel
都可以选择返回一个事件对象,该事件对象可以作为依赖项传递给后续命令。