OpenCL 1.1规范中提到:
cl_int clEnqueueBarrier(cl_command_queue command_queue)
clEnqueueBarrier是一个同步点,确保在下一批命令开始执行之前,command_queue中的所有排队命令都已经执行完毕。
cl_int clFinish(cl_command_queue command_queue)
阻塞直到command_queue中先前排队的所有OpenCL命令都被发送到关联设备并完成。clFinish不会返回,直到command_queue中的所有排队命令都已被处理和完成。clFinish也是一个同步点。
这与顺序执行或乱序执行有关,但我看不出区别。如果我已经进行了顺序执行,它们是否真的需要?目前我做的类似于:
...
for(...){
clEnqueuNDRangeKernel(...);
clFlush(command_queue);
clFinish(command_queue);
}
...
在Nvidia GPU上。欢迎提出任何相关评论。