有序队列是否需要clWaitForEvents?

时间:2018-05-30 08:21:18

标签: opencl

我已经创建了一个有序的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]的输出是内核[1]的输入。内核[1]的输出被输入到内核[2],依此类推。

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

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

1 个答案:

答案 0 :(得分:1)

您的假设是有效的。您无需等待有序队列中的事件。看一下OpenCL doc:

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

  

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

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

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