尽管存在足够的内存,但多GPU由分离的CPU过程控制时,Cudamallocpitch失败了



我在使用cudamallocpitch api和geforce gtx 1080 ti和 或geforce gtx 1080 GPU时,我会遇到'失败'错误,该gpus是整个PC服务器的一部分(包括4 GPUS(1 1080 Ti和3 1080)和两个CPU。

每个GPU都由专用的CPU线程控制,该线程在其运行开始时用正确的设备索引呼叫CudasetDevice。

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

我也可以多次运行我的应用程序作为一个分开的过程,每个过程都将控制不同的GPU。

我正在使用OpenCV版本3.2来执行图像背景扣除。

首先,您应使用以下方法创建背景subtractormog2对象:cv :: cuda :: createbackgroundSubtractorMog2,然后您应调用其应用方法。

第一次申请方法称为所有必需的内存一次。

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

当我运行应用程序作为一个一个过程时,该过程具有多个线程(每个GPU),一切正常,但是当我将其运行4次作为一个分离的过程(每个GPU每个)时,OpenCV应用功能启动到由于cudamallocpitch而失败,"记忆不足"失败。

对于所有GPU,我都经过证实,在第一次激活申请之前,我有足够的可用内存。对于1080,据报道,我有〜5.5GB,对于1080 TI,我有〜8.3GB,所请求的大小为:宽度-120000 bytes,高度-21288Bytes -〜2.4GB。

请建议。

找到了问题来源:

cudaMallocPitch api返回值为 cudaErrorMemoryAllocation,这是因为当该过程执行read read read write访问GPU物理内存时,OS使用的OS虚拟内存没有可用。

因此,CUDA驱动程序失败了任何类型的GPU物理内存分配。

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

我开始分析两个点:

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

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

最新更新