c++ - OpenCL 内核是异步执行的吗?
问题描述
对于 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);
kernel1
命令入队后是否会kernel2
异步执行?(即执行重叠)
根据OpenCL Reference更新,似乎设置properties
为CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
inclCreateCommandQueue
可以满足我的需要。但是, out_of_order 是否意味着异步?
解决方案
out_of_order 是否意味着异步
“乱序”队列意味着内核可能以与排队时不同的顺序执行(如果它们的事件/数据依赖关系允许的话)。它们也可以同时执行,但不是必须的。
此外,异步执行意味着执行重叠以外的其他内容(称为并行执行或并发)。异步执行意味着设备上的内核代码独立于主机代码执行——这在 OpenCL 中总是如此。
获得并发(执行重叠)的简单方法是在同一设备上使用 >1 个队列。这甚至适用于没有乱序队列功能的实现。它不能保证执行重叠(因为 OpenCL 可以在比 CUDA 更多的设备上使用,并且在某些设备上你根本不能一次执行 >1 个内核),但根据我对大多数 GPU 的经验,你应该至少得到一些重叠。但是,您需要注意内核在单独队列中使用的缓冲区。
推荐阅读
- angular - Angular 9 取消 HTTP 请求
- kubernetes - 预检 (OPTIONS) 返回 403,CORS
- python - 使用 meshlabxml remiss.simplify 进行网格简化
- amazon-elasticache - 如何检查 AWS Elasticache(REDIS) 中的 if config 命令名称是否已更改
- javascript - 自定义类型作为函数:从 JavaScript 中的另一个命名函数构造函数
- kubernetes - 在 Gcp 中使用 helm 安装 ibm mq chart 版本 1.2.0,在创建 Pod 时出现错误“Creashloopbackoff”
- postgresql - Postgres9.5 分区
- .htaccess - 使用 .htaccess 将特定页面阻止到 Pinterest
- python - 将包括工作表在内的多个 excel 文件导入 1 个 excel 文件
- c# - C# - 为什么在播放 2 个声音时我的表单最小化?