cudaMallocPitch失败,而多GPU由独立的CPU进程控制,尽管存在足够的内存

时间:2017-09-30 13:57:21

标签: opencv cuda multiprocessing multiprocess

我在使用cudaMallocPitch API与GeForce GTX 1080 TI和/或GeForce GTX 1080 GPU时出现“内存不足”错误,这些GPU是包含4个GPU(1 1080 TI和3 1080)的整个PC服务器的一部分两个CPU。

每个GPU都由一个专用的CPU线程控制,该线程在运行开始时使用正确的设备索引调用cudaSetDevice。

根据配置文件信息,应用程序知道应创建多少CPU线程。

我也可以多次运行我的应用程序作为一个独立的进程,每个进程将控制不同的GPU。

我正在使用OpenCV 3.2版来执行图像背景减法。

首先,你应该使用这个方法创建BackgroundSubtractorMOG2对象:cv :: cuda :: createBackgroundSubtractorMOG2然后你应该调用它的apply方法。

第一次调用apply方法时,所有必需的内存都被分配一次。

我的图片尺寸为10000 cols和7096行。每个像素为1B(灰度)。

当我将我的应用程序作为一个具有多个线程的进程运行时(每个GPU都有一个),一切正常但是当我作为一个独立的进程(每个GPU的每一个)运行4次时,OpenCV应用函数开始由于cudaMallocPitch'没有足够的内存'故障而失败。

对于所有GPU,我确认在第一次激活应用之前我有足够的可用内存。对于1080,据报道我有~5.5GB,对于1080 TI我有~8.3GB,请求的大小是:宽度 - 120000bytes,高度 - 21288bytes - ~2.4GB。

请指教。

1 个答案:

答案 0 :(得分:1)

发现问题来源:

cudaMallocPitch API返回值为cudaErrorMemoryAllocation,因为当进程对GPU物理内存执行读写访问时,操作系统没有可用的OS虚拟内存。< / p>

因此,CUDA驱动程序无法通过任何类型的GPU物理内存分配。

这里的复杂性是弄清楚为什么这个API在存在足够的GPU物理内存时失败(由cudaMemGetInfo API检查)。

我开始分析两点:

  1. 为什么我的电脑中没有足够的虚拟内存? 通过执行以下链接指令,我改变了它的大小,问题就消失了: https://www.online-tech-tips.com/computer-tips/simple-ways-to-increase-your-computers-performace-configuring-the-paging-file/

  2. 为什么我的进程消耗了大量的OS虚拟内存? 在过去我发现,为了在处理时间内获得更好的性能,我将在开始时仅分配所有所需的GPU物理内存一次,因为分配操作需要花费大量时间取决于所需的内存大小。 由于我正在使用~70Mbytes的帧分辨率并且我的处理逻辑需要大量的辅助缓冲区,因此需要分配大量的GPU和CPU内存区域,以清空OS虚拟内存可用区域。 / p>