我发现以下幻灯片非常有用:http://developer.amd.com/afds/assets/presentations/1004_final.pdf http://developer.amd.com/afds/assets/presentations/1004_final.pdf
Fusion APUS 上的内存系统
零拷贝的好处
皮埃尔·布迪埃
AMD
OpenGL/OpenCL 院士
格雷厄姆·塞勒斯
AMD
OpenGL 管理器
AMD Fusion 开发者峰会 2011 年 6 月
但请注意,这是一个快速变化的区域。与其说是开发新概念,不如说是(最终)将虚拟内存等概念应用到 GPU 上。让我总结一下。
在过去,比如 2010 年之前,GPU 通常是单独的 PCI 或 PCI-express 卡或板。他们的 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 芯片。因此不再有“GPU 板上”和“GPU-CPU 外”DRAM。
但通常系统主板上的DRAM仍然会被分割、分区为主要供CPU使用的内存和主要供GPU使用的内存。尽管内存可能位于相同的 DRAM 芯片内,但通常很大一部分是“图形”。由于历史原因,在上面的论文中,它被称为“本地”内存。 CPU 和图形内存的调整可能有所不同 - 通常 GPU 内存的优先级较低(视频刷新除外),并且具有较长的突发。
在我向您推荐的论文中,有不同的内部总线:洋葱用于“系统”内存,“大蒜”用于更快地访问图形内存分区。 Garlic 内存通常是未缓存的。
我参考的论文讨论了CPU和GPU如何具有不同的页表。他们的副标题“零复制的好处”是指将 CPU 数据结构映射到 GPU 页表中,这样您就不需要复制它。
等等等等,
该系统的这一领域正在迅速发展,因此 2011 年的论文几乎已经过时了。但你应该注意趋势
(a) 软件希望统一访问CPU和GPU内存——虚拟内存和可缓存
but
(b) 尽管硬件试图提供 (a),但特殊的图形内存功能几乎总是使专用图形内存(即使只是相同 DRAM 的一个分区)显着更快或更节能。
差距可能正在缩小,但每当你认为差距即将消失时,就可以玩另一个硬件技巧。
—-
顺便说一句,这个 2012 年的答案应该更新——我是在 2019 年写这篇文章的。很多内容仍然适用,例如 tge CPU/GPU 内存的区别。 GPU 内存的速度仍然更高,但现在 GPU 内存通常比 CPU 更多,至少在数据中心深度学习系统中是这样。在家用电脑中则不然。此外,GPU 现在支持虚拟内存。这绝不是完整的更新。