如何映射系统内存 (RAM) 以进行 GPU 访问?我很清楚虚拟内存如何为 cpu 工作,但不确定当 GPU 访问 GPU 映射的系统内存(主机)时它会如何工作。基本上与数据如何从系统内存复制到主机内存有关,反之亦然。你能提供参考文章支持的解释吗?
1 回答
我发现以下幻灯片非常有用: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 现在支持虚拟内存。这绝不是一个完整的更新。