15

如何映射系统内存 (RAM) 以进行 GPU 访问?我很清楚虚拟内存如何为 cpu 工作,但不确定当 GPU 访问 GPU 映射的系统内存(主机)时它会如何工作。基本上与数据如何从系统内存复制到主机内存有关,反之亦然。你能提供参考文章支持的解释吗?

4

1 回答 1

17

我发现以下幻灯片非常有用:http: //developer.amd.com/afds/assets/presentations/1004_final.pdf

FUSION APUS 上的内存系统 零拷贝的好处 Pierre Boudier AMD OpenGL/OpenCL 研究员 Graham Sellers AMD OpenGL 经理

AMD Fusion 开发者峰会 2011 年 6 月

但是请注意,这是一个快速发展的领域。与其说是开发新概念,不如说是(最终)将虚拟内存等概念应用于 GPU。让我总结一下。

在过去,比如 2010 年之前,GPU 通常是单独的 PCI 或 PCI-excpress 卡或板卡。他们在 GPU 卡上安装了一些 DRAM。这种板载 DRAM 非常快。他们还可以访问 CPU 端的 DRAM,通常是通过 PCI 上的 DMA 复制引擎。像这样 GPU 访问 CPU 内存通常很慢。

GPU 内存未分页。就此而言,GPU 内存通常是未缓存的,除了 GPU 内部的软件管理缓存,如纹理缓存。“软件管理”意味着这些缓存不是缓存一致的,必须手动刷新。

通常,GPU 只访问 CPU DRAM 的一小部分 - 一个光圈。通常,它是固定的 - 不受分页的影响。通常,甚至不受虚拟地址转换的影响 - 通常虚拟地址 = 物理地址,+ 可能是一些偏移量。

(当然,CPU 内存的其余部分是正确的虚拟内存,分页,当然翻译和缓存。只是 GPU 无法安全地访问它,因为 GPU 确实(没有)访问虚拟内存子系统和缓存相干系统。

现在,上述方法有效,但很痛苦。首先在 CPU 内部然后在 GPU 内部进行操作很慢。容易出错。还有一个很大的安全风险:用户提供的 GPU 代码通常可以(缓慢且不安全地)访问所有 CPU DRAM,因此可能被恶意软件使用。

AMD 宣布了更紧密集成 GPU 和 CPU 的目标。第一步是创建“Fusion”APU,即包含 CPU 和 GPU 的芯片。(英特尔在 Sandybridge 上也做了类似的事情;我希望 ARM 也会这样做。)

AMD 还宣布他们打算让 GPU 使用虚拟内存子系统,并使用缓存。

AMD IOMMU 是朝着让 GPU 使用虚拟内存的方向迈出的一步。英特尔也有类似的。尽管 IOMMU 比非虚拟机操作系统的虚拟内存更面向虚拟机。

CPU 和 GPU 在同一芯片内的系统通常让 CPU 和 GPU 访问相同的 DRAM 芯片。所以不再有“on-GPU-board”和“off-GPU--CPU”DRAM。

但是系统主板上的DRAM通常还是有一个分裂,一个分区,主要是CPU使用的内存,和GPU主要使用的内存。尽管内存可能存在于相同的 DRAM 芯片中,但通常一大块是“图形”。在上面的论文中,由于历史原因,它被称为“本地”内存。CPU 和图形内存可以进行不同的调整 - 通常 GPU 内存的优先级较低,视频刷新除外,并且具有更长的突发。

在我参考的论文中,有不同的内部总线:洋葱用于“系统”内存,“大蒜”用于更快地访问图形内存分区。Garlic 内存通常是未缓存的。

我参考的论文讨论了 CPU 和 GPU 如何具有不同的页表。他们的副标题“零复制的好处”是指将 CPU 数据结构器映射到 GPU 页表中,这样您就不需要复制它了。

等等等等,

系统的这一领域正在迅速发展,因此 2011 年的论文已经几乎过时了。但你应该注意趋势

(a) 软件想要统一访问 CPU 和 GPU 内存 - 虚拟内存和可缓存

(b) 尽管硬件试图提供 (a),但特殊的显存特性几乎总是使专用显存(即使只是相同 DRAM 的一个分区)显着更快或更节能。

差距可能正在缩小,但每次您认为它即将消失时,都可以玩另一个硬件技巧。

——

顺便说一句,应该更新 2012 年的这个答案 - 我在 2019 年写这个。很多仍然适用,例如 tge CPU/GPU 内存区别。GPU 内存的速度仍然更高,但现在 GPU 内存通常比 CPU 多,至少在数据中心 DL 系统中是这样。在家用电脑中没有那么多。此外,GPU 现在支持虚拟内存。这绝不是一个完整的更新。

于 2012-08-06T23:23:08.810 回答