GPU - 系统内存映射

15

系统内存(RAM)如何映射为GPU访问?我清楚地知道虚拟内存是如何为CPU工作的,但不确定当GPU访问GPU映射的系统内存(主机)时会如何运作。基本上涉及到数据如何从系统内存复制到主机内存,反之亦然。您能否提供有参考依据的解释?

1个回答

17

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

AMD融合APU上的内存系统:零拷贝的优势 Pierre Boudier OpenGL/OpenCL资深工程师,AMD公司 Graham Sellers OpenGL经理,AMD公司

AMD Fusion开发者峰会,2011年6月

然而需要注意的是,这是一个快速发展的领域。并不是在开发新概念,而是终于将诸如虚拟内存之类的概念应用到GPU上。让我来总结一下。

在旧时代,例如2010年之前,GPU通常是单独的PCI或PCI-Express卡或板。它们在GPU卡上有一些DRAM。这种内置DRAM非常快。它们也可以通过DMA复制引擎跨PCI访问CPU端的DRAM。这样的GPU对CPU内存的访问通常相当缓慢。

GPU内存没有分页。事实上,GPU内存通常是无缓存的,除了GPU内部的软件管理缓存,例如纹理缓存。 "软件管理"意味着这些缓存不是缓存一致性的,必须手动刷新。

通常,GPU仅访问CPU DRAM的一小部分,即光圈。通常,它被固定 - 不受分页的影响。通常,甚至不会受到虚拟地址转换的影响 - 通常虚拟地址=物理地址,再加上某些偏移量。

(当然,CPU内存的其余部分是适当的虚拟内存,被分页,肯定被转换和缓存。只是GPU无法安全地访问这些,因为GPU(以前)不能访问虚拟内存子系统和缓存一致性系统。

现在,以上方案可以运行,但很麻烦。在CPU内部然后在GPU内部操作某些内容非常缓慢、容易出错,而且还存在巨大的安全风险:用户提供的GPU代码通常可以(缓慢和不安全地)访问所有CPU DRAM,因此可能被恶意软件所利用。

AMD已宣布将更加紧密地集成GPU和CPU,其中第一步是创建了包含CPU和GPU的芯片"融合"APUs。(英特尔也使用Sandybridge做了类似的事情;我预计ARM也会这样做。)

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

朝着让GPU使用虚拟内存的方向迈出的一步是AMD IOMMU。英特尔也有类似的东西。尽管IOMMU更偏向于虚拟机而不是非虚拟机操作系统的虚拟存储器。

在CPU和GPU位于同一芯片的系统中,通常CPU和GPU访问同一个DRAM芯片。因此,现在没有了"On-GPU-Board"和"Off-GPU-CPU" DRAM。

但是,在系统主板上仍然存在DRAM的分区,主要用于CPU和主要用于GPU的内存。即使内存可能位于同一DRAM芯片内部,通常也有一个大块是"图形"的。在上面的论文中,出于历史原因,它被称为"本地"内存。 CPU和显卡内存可以调整不同的参数 - 通常GPU内存优先级较低,除了视频刷新,而且具有更长的突发时间。

在我所提到的论文中,有不同的内部总线:"Onion"用于系统内存,"Garlic"用于更快地访问图形内存分区。 Garlic内存通常是无缓存的。

我所提到的论文谈到了CPU和GPU具有不同的页表。它们的副标题"零拷贝的好处"是指将CPU数据结构映射到GPU页表中,这样就不需要复制它。

等等。

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

(a) 软件希望统一访问CPU和GPU内存 - 包括虚拟内存和可缓存性

但是

(b) 尽管硬件试图提供(a),但特殊的图形内存功能几乎总是使专用图形内存更快或更省电,即使只是相同DRAM的一个分区。
尽管差距正在缩小,但每当你认为这种差距即将消失时,又会有其他硬件技巧出现。
——
顺便说一下,这个2012年的答案应该更新 - 我是在2019年写的。很多仍然适用,例如CPU/GPU内存区别。GPU内存仍然具有更高的速度,但现在通常情况下数据中心DL系统中GPU内存比CPU内存更多。在家庭PC上可能不是那么明显。此外,GPU现在支持虚拟内存。这并不是完整的更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接