Opencl 订单队列是否需要clWaitForEvents?

Opencl 订单队列是否需要clWaitForEvents?,opencl,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

我已经创建了一个顺序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);
    }
queue=clCreateCommandQueue(cl.context,cl.device,0,&cl.error);
对于(i=0;i
内核[0]的输出被输入到内核[1]。内核[1]的输出被输入到内核[2],依此类推

因为我的命令队列是顺序队列,所以我假设内核[1]只有在内核[0]完成后才会启动

  • 我的假设有效吗
  • 我应该使用
    clWaitForEvents
    来确保前一个内核在排队等待下一个内核之前完成吗
  • 有没有办法将多个内核堆叠到队列中&只需将输入传递给内核[0]&直接从最后一个内核获取输出?(无需逐个将每个内核排队)

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

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

    至于另一个问题:是的,您需要将要显式运行的每个内核排队。认为这是好事,因为没有神奇的事情发生。
    当然,您总是可以用C/C++(或您正在使用的任何主机语言)编写自己的帮助程序来简化这一过程,并可能隐藏繁琐的内核调用。或者使用一些GPGPU抽象库来做同样的事情。

    非常感谢您在文档中指出这一点。我第一次看的时候错过了这个细节,我的错。再次感谢你。