我正在使用OpenCL内核对我系统的一组副本执行monte carlo扫描。在初始调试阶段之后,我将一些参数增加到更实际的值,并注意到程序突然占用了大量的主机内存。我在大约4000个副本上执行1000次扫描,每次扫描包含2次内核调用。这导致大约800万次内核调用。
很容易找到内存使用的来源(见截图)。
这意味着OpenCL驱动程序正在使用内存。我知道它必须保留内核调用的所有参数的副本以及全局和本地工作组大小,但这不会加起来。
峰值内存使用量为4.5GB。在排队内核之前使用了大约250MB。这意味着OpenCL使用大约4.25GB进行800万次调用,即每次调用大约半个千字节。
所以我的问题是:
clFinish()
?答案 0 :(得分:1)
排队大量内核调用需要以位控制的方式进行,以便命令队列不会占用太多内存。首先,clFlush
可能在某种程度上有所帮助,然后clWaitForEvents
是必要的,以便在中间建立同步点,例如2000个内核调用被入队,clWaitForEvents
等待第1000个。设备不会暂停,因为我们已经预先批量调用了另外1000个工作。然后类似的事情需要一次又一次地重复。这可以通过这种方式说明:
enqueue 999 kernel commands
while(invocations < 8000000)
{
enqueue 1 kernel command with an event
enqueue 999 kernel commands
wait for the event
}
我们应该等待的最佳内核调用次数可能与此处介绍的不同,因此需要针对给定的场景进行处理。