当使用cudaMallocPitch应用程序接口与GeForce GTX 1080 TI和\或GeForce GTX 1080 GPU(这是包括4个GPU (1 1080 TI和3 1080)和两个CPU)的整个PC服务器的一部分时,我得到'out of memory‘错误。
每个GPU都由一个专用的CPU线程控制,该线程在开始运行时使用正确的设备索引调用cudaSetDevice。
基于配置文件信息,应用程序知道应该创建多少CPU线程。
我也可以将我的应用程序作为一个独立的进程运行几次,每个进程都将控制不同的GPU。
我使用的是OpenCV 3.2版本,以便执行图像背景减法。
首先,使用以下方法创建BackgroundSubtractorMOG2对象:cv::cuda::create SubtractorMOG2,然后调用其apply方法。
第一次调用apply方法时,所有需要的内存都被分配一次。
我的图像大小是10000个列和7096行。每个像素都是1B (灰度)。
当我将我的应用程序作为一个有多个线程(每个线程对应一个图形处理器)的进程运行时,一切都运行得很好,但是当我作为一个独立的进程(每个进程对应一个图形处理器)运行4次时,由于cudaMallocPitch‘内存不足’故障,OpenCV应用函数开始失败。
对于所有的GPU,在apply第一次被激活之前,我被验证是否有足够的可用内存。据报道,对于1080,我有大约5.5 TI,对于1080 TI,我有大约8.3 TI,请求的大小是:宽-120000字节,高-21288字节-~2.4 TI。
请给我建议。
发布于 2017-10-17 12:19:15
找到了问题的根源:
GPU返回值为cudaErrorMemoryAllocation
,这是因为当进程对cudaMallocPitch
物理内存执行读/写访问时,没有可用的操作系统虚拟内存供操作系统使用。
正因为如此,CUDA驱动程序无法进行任何类型的GPU物理内存分配。
这里的复杂性在于找出为什么在存在足够的GPU物理内存的情况下此API失败(由cudaMemGetInfo
API检查)。
我开始分析两点:
https://stackoverflow.com/questions/46503389
复制相似问题