我在使用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。
请指教。
答案 0 :(得分:1)
发现问题来源:
cudaMallocPitch
API返回值为cudaErrorMemoryAllocation
,因为当进程对GPU物理内存执行读写访问时,操作系统没有可用的OS虚拟内存。< / p>
因此,CUDA驱动程序无法通过任何类型的GPU物理内存分配。
这里的复杂性是弄清楚为什么这个API在存在足够的GPU物理内存时失败(由cudaMemGetInfo
API检查)。
我开始分析两点:
为什么我的电脑中没有足够的虚拟内存? 通过执行以下链接指令,我改变了它的大小,问题就消失了: https://www.online-tech-tips.com/computer-tips/simple-ways-to-increase-your-computers-performace-configuring-the-paging-file/
为什么我的进程消耗了大量的OS虚拟内存? 在过去我发现,为了在处理时间内获得更好的性能,我将在开始时仅分配所有所需的GPU物理内存一次,因为分配操作需要花费大量时间取决于所需的内存大小。 由于我正在使用~70Mbytes的帧分辨率并且我的处理逻辑需要大量的辅助缓冲区,因此需要分配大量的GPU和CPU内存区域,以清空OS虚拟内存可用区域。 / p>