gpt4 book ai didi

c++ - OpenCL 内核是异步执行的吗?

转载 作者:行者123 更新时间:2023-12-02 03:28:45 24 4
gpt4 key购买 nike

对于 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 Reference ,看来在clCreateCommandQueue中将properties设置为CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE可以满足我的需求。但是,out_of_order 是否意味着异步?

最佳答案

Does out_of_order mean asynchronization

“无序”队列意味着内核可能以与排队不同的顺序执行(如果它们的事件/数据依赖性允许)。它们也可能同时执行,但不一定。

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

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

关于c++ - OpenCL 内核是异步执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58946050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com