cudaHostAlloc限制

时间:2013-06-13 15:07:40

标签: memory-management cuda

我有一个运行Windows Server 2012的系统。系统有128 GB的内存和6个Nvidia K10 GPU,内存为8 GB。

我为所有设备使用固定主机内存(大约47 GB,每台设备12 * 3.92 GB)。我想使用固定内存的原因是我的应用程序运行大约12到15次,因为我可以使用异步内存传输。

我在每台设备上都有3.92 GB内存。如果我使用cudaHostAlloc并尝试分配3.92 GB,当我尝试为第二个设备分配主机内存时,我会得到cudaErrorMemoryAllocation。我使用cudaHostAlloc和cudaHostAllocDefault默认标志。

如果用3.79 GB(而不是3.92)调用cudaHostAlloc,那么一切都按预期工作,因此我可以为所有12个设备分配3.79 GB的固定内存。

我不明白这个限制,我尝试使用VirtualAlloc,VirtualLock和cuMemHostRegister但是在调用cuMemHostRegister时遇到了同样的问题。我确保工作集足够,VirtualAlloc,VirtualLock组合与指定的工作集一起工作。 cudaHostAlloc似乎并不关心我使用的工作集。只要我不尝试使用cudaHostAlloc每个设备使用3.79 GB以上的内存,默认工作集就可以正常工作。

有人对这种行为有解释吗?

1 个答案:

答案 0 :(得分:2)

我认为问题是固定内存是否已锁定页面。 “页面锁定主机内存是一种稀缺资源,因此页面锁定内存中的分配将在可分页内存中的分配之前很久就会失败。此外, 减少操作系统可用于分页的物理内存量, 消耗过多的页面锁定内存会降低整体系统性能。“您可以在Cuda编程指南中的3.2.4中找到更多详细信息