当前位置:  开发笔记 > 编程语言 > 正文

OpenCL内核是否异步执行?

如何解决《OpenCL内核是否异步执行?》经验,为你挑选了1个好方法。

对于CUDA,我知道在向默认流(空流)发出启动命令后,它们是异步执行的,那么在OpenCL中呢?示例代码如下:

cl_context context;
cl_device_id device_id;
cl_int err;
...
cl_kernel kernel1;
cl_kernel kernel2;
cl_command_queue Q = clCreateCommandQueue(context, device_id, 0, &err);
...
size_t global_w_offset[3] = {0,0,0};
size_t global_w_size[3] = {16,16,1};
size_t local_w_size[3] = {16,16,1};
err = clEnqueueNDRangeKernel(Q, kernel1, 3, global_w_offset, global_w_size, 
                             local_w_size, 0, nullptr, nullptr);
err = clEnqueueNDRangeKernel(Q, kernel2, 3, global_w_offset, global_w_size, 
                             local_w_size, 0, nullptr, nullptr);
clFinish(Q);

命令排队后是否会kernel1kernel2异步执行?(即执行重叠)

更新
按照OpenCL的参考,这似乎是一套propertiesCL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLEclCreateCommandQueue能满足我的需要。但是,out_of_order是否意味着异步?



1> 小智..:

out_of_order是否意味着异步

“乱序”队列表示内核可能以与排队时不同的顺序执行(如果事件/数据相关性允许的话)。它们也可以同时执行,但不是必须执行。

同样,异步执行意味着执行重叠之外的其他东西(称为并行执行或并发)。异步执行意味着设备上的内核代码独立于主机代码执行-在OpenCL中始终如此。

获取并发(执行重叠)的简单方法是在同一设备上使用> 1个队列。即使在不具有乱序队列功能的实现上也可以使用。它不能保证执行重叠(因为OpenCL可以在比CUDA上更多的设备上使用,并且在某些设备上您一次不能执行1个以上的内核),但是根据我对大多数GPU的经验,您应该至少获得一些交叠。但是,您需要注意内核在单独队列中使用的缓冲区。

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有