我已经创建了一个有序的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]完成后才会启动。
clWaitForEvents
来确保先前的内核已完成吗?答案 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抽象库来做同样的事情。