0

我有一个运行 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 的内存,默认工作集就可以工作。

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

4

1 回答 1

2

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

于 2013-06-14T18:08:56.060 回答