OpenCL使用大量主机内存排队内核

时间:2015-08-10 17:29:10

标签: opencl

我正在使用OpenCL内核对我系统的一组副本执行monte carlo扫描。在初始调试阶段之后,我将一些参数增加到更实际的值,并注意到程序突然占用了大量的主机内存。我在大约4000个副本上执行1000次扫描,每次扫描包含2次内核调用。这导致大约800万次内核调用。

很容易找到内存使用的来源(见截图)。

  • 当内核执行入队时,内存使用率会上升。
  • 在内核执行时,内存使用量保持不变。
  • 一旦内核完成,使用率将降至原始状态。
  • 我没有分配任何内存,可以在内存快照中看到。

enter image description here

这意味着OpenCL驱动程序正在使用内存。我知道它必须保留内核调用的所有参数的副本以及全局和本地工作组大小,但这不会加起来。

峰值内存使用量为4.5GB。在排队内核之前使用了大约250MB。这意味着OpenCL使用大约4.25GB进行800万次调用,即每次调用大约半个千字节。

所以我的问题是:

  • 这种内存使用情况是否正常并且可以预期?
  • 是否有减少内存使用的好/已知技术?
  • 也许我不应该同时将这么多内核排入队列,但是如何在不引起同步的情况下这样做,例如:与clFinish()

1 个答案:

答案 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
}

我们应该等待的最佳内核调用次数可能与此处介绍的不同,因此需要针对给定的场景进行处理。