【发布时间】:2022-03-18 18:38:01
【问题描述】:
OpenCL clFinish() API 调用会阻塞,直到命令队列中的所有命令都完成执行。一个相关的函数,clFlush(),据说是
向与命令队列关联的设备发出命令队列中所有先前排队的 OpenCL 命令。
这是什么意思?它是否使这些命令跳过等待事件?这听起来不合理。在发出命令之前它会阻塞吗?可能不是,这就是clFinish() 所做的。似乎clFlush() 实际上不需要做任何事情。
我错过了什么?
【问题讨论】:
-
在主机端排队大量内核调用可能会消耗大量 RAM。
clFlush可用于立即将当前队列提交到设备。见this。 -
@doqtor: 但是如果这个提交是可能的,为什么还没有发生呢?即不向设备提交队列命令并等待有什么好处?此外 - 如果有人将数万或数十万个内核排入队列 - 那么我 100% 确定他们使用 OpenCL 是错误的(比如链接上的 OP,他应该使用一个内核进行一个副本上的所有扫描,或者一个内核用于扫描所有副本)。
-
与
clFinish不同,clFlush是异步的,这意味着您可以立即获得控制权,并且您可以在 GPU 计算某些内容时同时执行其他操作。 -
@doqtor:我意识到它是异步的,我只是不明白为什么 clFlush 可以做的任何事情在它被调用之前都不应该发生。
-
clFlush/clFinish开始执行clEnqueueNDRangeKernel这是惰性的(仅添加到队列中) - 只是clFlush以非阻塞方式执行。
标签: opencl