Memory management cudaHostAlloc限制

Memory management cudaHostAlloc限制,memory-management,cuda,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,那么当我尝试为第二个设备分配主机内存时,我会得到cudaErrorMemoryAllocat

我有一个运行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 GB)调用cudaHostAlloc,那么一切都会按预期工作,因此我可以为所有12个设备分配3.79 GB的固定内存

我不理解这个限制,我尝试过使用VirtualAlloc、VirtualLock和cuMemHostRegister,但在调用cuMemHostRegister时遇到了相同的问题。我已经确保工作集足够,并且VirtualAlloc、VirtualLock组合可以与指定的工作集一起工作。cudaHostAlloc似乎并不关心我使用什么工作集。只要我不尝试使用cudaHostAlloc为每个设备使用超过3.79 GB的内存,默认工作集就可以工作


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

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

,因为@Rakkun建议这可能是一个32位问题。但这可能是操作系统的限制,如中所述。最好也检查一下,包括内存池限制。也检查一下。它包含一些关于cudaMallo限制的信息。您是否对.gpu使用tcc模式?这是一个64位应用程序,是的,我正在使用tcc并禁用ECC。不过,我会按照建议阅读发行说明和勘误表。我很久以前(我想是CUDA3.2)在WindowsVista上也遇到过同样的问题。这个问题没有解决方案,因为问题是Windows而不是Cuda。可能仍然有效,即使是Windows Server…@kunzmi:如果设备运行TCC驱动程序,WDDM分配大小限制不应适用,因此您的问题可能与此不同。原则上我同意。但是,我可以使用VirtualAlloc和VirtualLock更改工作集并分配和锁定所需的内存,但cuMemHostRegister仍然失败。我不明白分配12倍3.92不起作用与分配12倍3.79起作用的区别