【问题标题】:Is clWaitForEvents required for an in-order queue?有序队列是否需要 clWaitForEvents?
【发布时间】:2018-05-30 16:28:45
【问题描述】:

我创建了一个有序的 OpenCL 队列。我的管道将多个内核排入队列。

    queue = clCreateCommandQueue(cl.context, cl.device, 0, &cl.error);

    for(i=0 ;i < num_kernels; i++){
        clEnqueueNDRangeKernel(queue, kernels[i], dims, NULL, global_work_group_size, local_work_group_size, 0, NULL, &event);
    }

kernels[0] 的输出是 kernels[1] 的输入。 kernels[1] 的输出是 kernels[2] 的输入,以此类推。

由于我的命令队列是一个有序队列,我的假设是 kernels[1] 只有在 kernels[0] 完成后才会启动。

  1. 我的假设有效吗?
  2. 我是否应该使用clWaitForEvents 来确保在将下一个内核加入队列之前完成前一个内核?
  3. 有什么方法可以将多个内核堆叠到队列中,只需将输入传递给 kernels[0] 并直接从最后一个内核获取输出? (不必将每个内核一个一个地排入队列)

【问题讨论】:

    标签: opencl


    【解决方案1】:

    你的假设是正确的。您不需要在有序队列中等待事件。查看 OpenCL 文档:

    https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clCreateCommandQueue.html

    如果 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 属性 未设置命令队列,命令排队到命令队列 按顺序执行。例如,如果应用程序调用 clEnqueueNDRangeKernel 执行内核 A 后跟 a clEnqueueNDRangeKernel 执行内核 B,应用程序可以假设 内核 A 首先完成,然后内核 B 被执行。如果 内核 A 输出的内存对象是内核 B 的输入,然后是内核 B 将看到由执行产生的内存对象中的正确数据 内核 A. 如果 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 属性 commandqueue 已设置,则无法保证内核 A 将 在内核 B 开始执行之前完成。

    关于另一个问题:是的,您需要将要显式运行的每个内核排入队列。认为这是一件好事,因为没有魔法发生。

    当然,您始终可以使用 C/C++(或您使用的任何宿主语言)编写自己的帮助程序,以简化此操作,并可能隐藏繁琐的内核调用。或者使用一些 GPGPU 抽象库来做同样的事情。

    【讨论】:

    • 非常感谢您指出文档。我第一次浏览时错过了这个细节,我的错。再次感谢您。
    猜你喜欢
    • 2011-04-04
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2010-10-29
    • 1970-01-01
    • 2013-09-11
    • 2020-02-17
    相关资源
    最近更新 更多