CUDA和cudaMalloc分配大块内存失败

3
我有一张2GB内存的GTX570显卡,但是当我尝试在一个cudamalloc调用中分配超过804MB的内存时,就会出现问题。有人知道这是为什么吗?这是我的第一次调用,所以我怀疑这不是碎片化造成的问题。
没问题:
Memory avaliable: Free: 2336116736, Total: 2684026880
requesting 804913152 bytes
no error
Memory avaliable: Free: 1531199488, Total: 2684026880
requesting 804913152 bytes
no error
Memory avaliable: Free: 726286336, Total: 2684026880

问题:

Memory avaliable: Free: 2327601152, Total: 2684026880
requesting 805306368 bytes
out of memory
Memory avaliable: Free: 2327597056, Total: 2684026880
requesting 805306368 bytes
out of memory
Memory avaliable: Free: 2327597056, Total: 2684026880

http://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html 上的发布说明中的一项,位于“已知问题”部分、“Windows”子部分的第二个要点可能适用:在 Windows 下使用 WDDM 驱动程序时,设备分配的最大大小可能会受系统内存大小的限制。 - njuffa
我正在运行于Windows 8 x64,拥有12GB的RAM,大约有9GB可用,并且正在运行CUDA 5。好主意,我也会检查发布说明。 - Aktaeon
1个回答

1

这是由Windows WDDM子系统施加的限制引起的。对可以分配多少内存有一个硬性限制,计算方法如下:

MIN ( ( System Memory Size in MB - 512 MB ) / 2, PAGING_BUFFER_SEGMENT_SIZE )

对于桌面Windows,PAGING_BUFFER_SEGMENT_SIZE大约为2Gb IIRC。您有两个选项来解决此问题:

  1. 获取Telsa卡并使用专用的Windows TCC模式驱动程序,该驱动程序将设备的内存管理从WDDM中取走,消除了限制。
  2. 安装Linux或使用适用于GPU计算的CUDA感知实时发行版。 Linux驱动程序在除设备可用空闲内存容量之外没有内存分配限制。

嗯,感谢指出这个问题,看到很多人都有同样的问题。但是,由于我有大约12GB的系统内存,限制因素应该是PAGING_BUFFER_SEGMENT。如果2GB是正确的数字,那么我的代码应该能够分配比840MB更多的内存。或者我有什么遗漏吗? - Aktaeon
1
根据公式,在具有4.5GB以上内存的任何机器上都应该可以分配2GB(假设PAGING_BUFFER_SEGMENT_SIZE为2GB)。如果你很有冒险精神,你可以修改你的显卡来绕过NVIDIA在非特斯拉卡上的TCC模式人为限制 - Roger Dahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接