GPU 可以使用主计算机 RAM(作为扩展)吗?

Sup*_*cia 26 gpu

我有一台配备专用 GPU 的笔记本电脑,Nvidia Quadro P3200。它有 6 GB 的 RAM。

笔记本电脑还有 32 GB 的“普通”(CPU?)RAM。

我计划使用 GPU 进行并行计算,运行物理模拟。其中一些涉及相当大的阵列。

我只是想知道,如果内核中的总内存(所有变量和所有数组)达到 6 GB 的 GPU RAM,我可以以某种方式使用 CPU 的内存吗?

在计算过程中我不会将笔记本电脑用于其他任何事情,因此主 RAM 不应该很忙。

Ps 我使用的是戴尔 Precision 7530,Windows 10。

Gor*_*bić 43

简短回答:不,你不能。

更长的答案:带宽,更重要的是,PCIe 总线上 GPU 和 RAM 之间的延迟比 GPU 和 VRAM 之间的延迟差一个数量级,因此如果您打算这样做,您可能会在中央处理器。

CPU 可以直接使用VRAM的一部分(映射到 PCI 孔径的部分,通常为 256MB)作为 RAM,但它会比普通 RAM 慢,因为 PCIe 是一个瓶颈。将它用于诸如交换之类的事情可能是可行的。

过去可以通过更改 GPU BIOS 上的带位来增加内存孔径大小,但自从 Nvidia Fermi (GeForce 4xx) GPU 以来,我还没有尝试过。如果它仍然有效,还需要您的 BIOS 能够完成映射大于标准孔径的任务(极不可能在笔记本电脑上进行过测试)。

例如,至强融核计算卡需要将其整个 RAM 映射到 PCI 孔中,因此它需要在主机中具有 64 位功能的 BIOS,该 BIOS 知道如何将孔映射到传统 4GB(32 位)边界之上。

  • 请注意,DDR5 每个模块的带宽约为 52GiB/s(假设 4 通道为 200GiB/s),PCIe 6.0 的 16x 带宽为 256GiB/s。所以 PCIe 不会成为瓶颈,RAM 本身会。GDDR 更快并且针对多个读取器进行了优化,因此它显然更快,但 RAM 仍可用作较慢的“缓存”(如 Optane DC 内存的工作原理),并且简单的预取可以*完全* 隐藏延迟(因为 GPU 与*流*任务,这很容易)。顺便说一句,GPU **可以**访问 RAM,除非禁用,否则每个 PCI(e) 设备都可以是主设备。这就是像 IOMMU 和 GART 这样的东西存在的原因。 (9认同)
  • 此外,“孔径”是 AGP/32 位的东西,具有 64 位地址空间,即使映射 1TiB 块也没有问题。不过,并非所有卡都允许映射其整个内存。 (2认同)
  • 我看到一位拥有第一手知识和多年经验的专家。我看到一篇使用截图的帖子并不能证明任何事情。我会相信有多年经验的人。 (2认同)
  • @MargaretBloom 不,PCIe 连接是一个瓶颈。在您给出的示例中,带宽可能很高(在当前主流 CPU 中不可用),但与直接访问内存相比,它具有令人难以置信的高延迟,并且与 VRAM 相比,带宽非常低。使用 GPU 等高吞吐量设备可能会隐藏延迟,但延迟比 VRAM 或常规 RAM 高得多(至少高 20-30 倍)。 (2认同)

Mok*_*bai 10

是的。这是 CPU 和 GPU 之间的“共享”内存,在 GPU 上传输数据时总是需要少量缓冲区作为缓冲区,但它也可以用作显卡的较慢“后备”与页面文件相同的方式是主内存的较慢后备存储。

您可以通过转到“性能”选项卡并单击您的 GPU,在内置的 Windows 任务管理器中找到正在使用的共享内存。

在此处输入图片说明

虽然共享内存会比你的 GPU 内存慢,但可能比你的磁盘快。共享内存将是您的 CPU 内存,它在相当新的机器上的运行速度可能高达 30GB/s,但您的 GPU 内存可能能够达到 256GB/s 或更高。您还将受到 GPU 和 CPU(PCIe 桥接器)之间的链接的限制。这可能是您的限制因素,您需要知道您使用的是 Gen3 还是 Gen4 PCIe 以及它使用多少个通道(通常为“x16”)来找出 CPU 和 GPU 内存之间的总理论带宽。

  • 我想你会发现你倒退了。这是由 CPU 管理的缓冲区,用于将数据暂存进出 GPU 内存。它由 CPU 上运行的代码管理,对 GPU 中运行的代码不可见。 (5认同)
  • @SuperCiocia:如果 GPU 驱动程序允许您这样做,理论上可能是可行的,但是由于通过 PCIe 总线到达系统 DRAM 而不是通过非常快速/宽的 GDDR5 总线使用板载 DRAM,性能会急剧下降. 所以他们有充分的理由不让这成为可能,因为它通常不会有用。如果我们想要良好的性能,那么在什么时候管理 GPU 内存中的数据是我们可能会遇到的问题。这是显卡首先拥有自己的 RAM 的主要原因之一。 (4认同)
  • 关键是它是由 CPU 而不是 GPU 管理的。GPU 无法访问它,CPU 将其用作将数据推入和推出 GPU 的暂存区域。 (2认同)
  • *GPU 本身无法访问 CPU RAM* - 您确定这是真的吗?PCIe 设备可以执行从任何物理地址读取或写入 64 字节的事务。或者您是否区分了图形卡上的实际 GPU 处理芯片(具有直接连接到图形卡上的 DRAM 的内存总线)与必须为 CPU 物理内存的地址进行 PCIe 事务。(但是 GPU 自己的内部地址空间已配置。) (2认同)

Arm*_*era 10

据我所知,只要它是页锁定(固定)内存,您就可以共享主机的 RAM 。在这种情况下,数据传输会更快,因为您不需要显式传输数据,您只需要确保同步您的工作(cudaDeviceSynchronize例如,如果使用 CUDA)。

现在,对于这个问题:

我只是想知道,如果内核中的总内存(所有变量和所有数组)达到 6 GB 的 GPU RAM,我可以以某种方式使用 CPU 的内存吗?

不知道有没有办法“扩展”GPU内存。我不认为 GPU 可以使用比它自己更大的固定内存,但我不确定。我认为在这种情况下你可以做的是批量工作。您的工作是否可以分发,以便您一次只处理 6GB,保存结果,然后处理另一个 6GB?在这种情况下,分批工作可能是一个解决方案。

例如,您可以实现一个简单的批处理方案,如下所示:

int main() {

    float *hst_ptr = nullptr;
    float *dev_ptr = nullptr;
    size_t ns = 128;  // 128 elements in this example
    size_t data_size = ns * sizeof(*hst_ptr);

    cudaHostAlloc((void**)&hst_ptr, data_size, cudaHostAllocMapped);
    cudaHostGetDevicePointer(&dev_ptr, hst_ptr, 0);

    // say that we want to work on 4 batches of 128 elements
    for (size_t cnt = 0; cnt < 4; ++cnt) {
        populate_data(hst_ptr);  // read from another array in ram
        kernel<<<1, ns>>>(dev_ptr);
        cudaDeviceSynchronize();
        save_data(hst_ptr);  // write to another array in ram
    }

    cudaFreeHost(hst_ptr);

}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是错误的。使用固定内存,您确实需要显式传输数据。它更快,因为您告诉操作系统,出于优化原因,它不能移动内存,即“固定”到位,因此内存传输速度更快,因为它们不需要查询 CPU/操作系统来了解内存是否存在仍然在同一个地方。您可能会想到 CUDA 中的托管内存,您不需要显式移动它,但这并不会使其更快。是的,您可以固定整个 CPU 内存,无论其大小如何。在您的代码中,您显示托管内存,而不是固定内存 (2认同)