【问题标题】:OpenCL data dependency between kernels内核之间的 OpenCL 数据依赖关系
【发布时间】:2018-06-28 11:39:39
【问题描述】:

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

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

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

或者有更聪明的方法吗?

【问题讨论】:

    标签: opencl


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2016-09-10
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多