系统内存(RAM)如何映射为GPU访问?我清楚地知道虚拟内存是如何为CPU工作的,但不确定当GPU访问GPU映射的系统内存(主机)时会如何运作。基本上涉及到数据如何从系统内存复制到主机内存,反之亦然。您能否提供有参考依据的解释?
系统内存(RAM)如何映射为GPU访问?我清楚地知道虚拟内存是如何为CPU工作的,但不确定当GPU访问GPU映射的系统内存(主机)时会如何运作。基本上涉及到数据如何从系统内存复制到主机内存,反之亦然。您能否提供有参考依据的解释?
我发现下面的幻灯片集非常有用: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的一个分区。