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

问题描述 投票:-3回答:1

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

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

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

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

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

首先,您将使用此方法创建BackgroundSubtractorMOG2对象:cv :: cuda :: createBackgroundSubtractorMOG2然后您将调用其apply方法。

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

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

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

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

请指教。

opencv cuda multiprocessing multiprocess
1个回答
1
投票

问题来源被发现:

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

因此,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物理内存一次,因为分配操作需要花费大量时间取决于所需的内存大小。由于我正在使用大约70M字节的帧分辨率并且我的处理逻辑需要大量的辅助缓冲区,因此需要分配大量的GPU和CPU内存区域来清空OS虚拟内存可用区域。
© www.soinside.com 2019 - 2024. All rights reserved.