Memory 为什么将OpenCL内核排队等待执行会导致程序';内存使用量增加了吗?

Memory 为什么将OpenCL内核排队等待执行会导致程序';内存使用量增加了吗?,memory,asynchronous,opencl,Memory,Asynchronous,Opencl,我正在使用OpenCL对英特尔CPU的所有核心进行模拟。主进程代码由一个循环组成,在该循环中重复调用opencl内核。没有在循环内分配内存,也没有使用事件。但是,在模拟过程中,程序的内存使用会稳步增加,除非我定期调用clFinish()和clFlush() 有人能解释一下这里发生了什么吗?因为这是我在这里提出的问题的答案: 如果以非阻塞方式将OpenCL调用排入循环队列。然后这些呼叫队列必须存储在某个地方。这会占用内存,直到您clflush()到GPU,或者等待它clFinish()。但是,它不

我正在使用OpenCL对英特尔CPU的所有核心进行模拟。主进程代码由一个循环组成,在该循环中重复调用opencl内核。没有在循环内分配内存,也没有使用事件。但是,在模拟过程中,程序的内存使用会稳步增加,除非我定期调用
clFinish()
clFlush()


有人能解释一下这里发生了什么吗?

因为这是我在这里提出的问题的答案:


如果以非阻塞方式将OpenCL调用排入循环队列。然后这些呼叫队列必须存储在某个地方。这会占用内存,直到您
clflush()
到GPU,或者等待它
clFinish()
。但是,它不应该无限期地增长,因为驱动程序应该在某个时候处理它。

您是否收到任何呼叫返回的事件?如果是这样,你有责任发布它们。谢谢!但我没有使用任何事件,如果您以非阻塞方式将OpenCL调用排入循环队列(假设一个内核有1000000x个队列)。然后这些队列必须存储在这里。这会占用内存,直到您
clflush()
到GPU,或者等待它
clFinish()
。但是,它不应该无限期地增长,因为驾驶员应该在某个时候照顾它。这是我最好的猜测。我同意黑暗的零度。在编辑之前,它常说您使用了阻塞调用(我假设是读/写缓冲区或映像),这也应该阻止队列增长。但是如果您没有,那么您应该不时地clFinish/clFlush,或者使用事件来确保您不会排得太远。您是对的。我在中发现“泄漏”的情况是省略了阻塞mem copy命令。当我意识到这一点时,我编辑了这个问题@如果你把你的评论作为回答,我会接受的。非常感谢你们两位的帮助。不是无限期的,但无论Intel以何种方式存储这些东西似乎效率都不高:)在我能够停止之前,它消耗了8 gb的ram和大量的交换。规范中没有说明它不会无限期增长,我也没有看到任何供应商这样做。我认为OPs证据表明至少有一个驱动程序没有限制主机端队列的大小。一个简单的解决方案是每队列中的N个作业调用clFinish。如果您真的担心队列永远不会为空,那么在内核中使用固定数量的事件,并且只在最旧的事件完成后才对新的事件进行排队。