OpenCL内核是否异步执行?

Are OpenCL kernels executed asynchronously?(OpenCL内核是否异步执行?)
本文介绍了OpenCL内核是否异步执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于CUDA,我知道它们是在向默认流(NULL流)发出启动命令后异步执行的,那么在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 Reference,似乎properties设置为clCreateCommandQueue中的CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE可以满足我的需要。但是,乱序是否意味着异步?

推荐答案

在当前代码中:

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);

kernel1先完成,然后执行kernel2

使用


clCreateCommandQueue(context, device_id, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);

您可以同时执行多个不同的内核,尽管它没有得到保证。

但请注意,并非所有OpenCL实现都支持CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE。这也意味着您无法保证kernel1将在kernel2之前完成执行。如果kernel1输出的任何对象在kernel2中需要作为输入,则可能会失败。

还可以创建多个命令队列并将其与命令一起排队,它们存在的原因是因为您希望解决的问题可能涉及主机中的一些(如果不是全部)异构设备。它们可以表示不共享数据的独立计算流,也可以表示每个后续任务依赖于前一个任务的依赖计算流(通常,数据是共享的)。但是,如果没有数据共享,这些命令队列将在没有同步的情况下在设备上执行。如果数据是共享的,则程序员需要使用OpenCL规范中的同步命令确保数据同步。

这篇关于OpenCL内核是否异步执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Qt Calling External Python Script(Qt调用外部Python脚本)
QTableView/QTableWidget grid stylesheet - grid line width(QTableView/QTableWidget网格样式表-网格线宽)
QML opens GUI window and console(QML打开图形用户界面窗口和控制台)
How to nicely quot;castquot; qint64 to int for QProgressBar(如何为QProgressBar巧妙地将qint64转换为int)
Is it possible to use an underlined letter as keyboard shortcut in Qt?(Qt中可以使用带下划线的字母作为键盘快捷键吗?)
How to disable selection highlighting in a QTableWidget(如何在QTableWidget中禁用选定内容突出显示)