我有一个运行 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 的内存,默认工作集就可以工作。
有人对这种行为有解释吗?