首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当多个GPU由独立的中央处理器进程控制时,即使存在足够的内存,cudaMallocPitch也会失败

当多个GPU由独立的中央处理器进程控制时,即使存在足够的内存,cudaMallocPitch也会失败
EN

Stack Overflow用户
提问于 2017-09-30 21:57:21
回答 1查看 127关注 0票数 -3

当使用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。

请给我建议。

EN

回答 1

Stack Overflow用户

发布于 2017-10-17 12:19:15

找到了问题的根源:

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

正因为如此,CUDA驱动程序无法进行任何类型的GPU物理内存分配。

这里的复杂性在于找出为什么在存在足够的GPU物理内存的情况下此API失败(由cudaMemGetInfo API检查)。

我开始分析两点:

  1. 为什么我的PC没有足够的虚拟内存?通过执行以下链接指令,我更改了它的大小,问题消失了:
  2. Why我的进程消耗了大量操作系统虚拟内存?在过去,我认为为了在处理时间内有更好的性能,我应该在一开始只分配一次所需的GPU物理内存,因为分配操作需要花费大量的时间,这取决于所需的内存大小。由于我使用的帧分辨率约为70M字节,并且我的处理逻辑需要大量的辅助缓冲区,因此需要分配大量的图形处理器和中央处理器内存区,从而清空操作系统的虚拟内存可用区域。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46503389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档