GPU - 系统内存映射

时间:2012-07-06 03:27:49

标签: architecture io hardware gpu computer-architecture

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

1 个答案:

答案 0 :(得分:11)

我发现以下幻灯片非常有用: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-excpress卡或板。他们在GPU卡上有一些DRAM。这种板载DRAM非常快。他们还可以通过PCI上的DMA复制引擎访问CPU端的DRAM。像这样GPU访问CPU内存通常很慢。

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

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

(当然,剩余的CPU内存是正确的虚拟内存,分页,肯定已翻译和缓存。只是GPU无法安全地访问它,因为GPU确实(没有)访问虚拟内存子系统和缓存一致性系统。

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

AMD宣布了一个更紧密集成GPU和CPU的目标。其中一个步骤是创建“Fusion”APU,芯片包含CPU和GPU。 (英特尔与Sandybridge的做法类似;我希望ARM也这样做。)

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

向GPU使用虚拟内存的方向迈出的一步是AMD IOMMU。英特尔有类似的。虽然IOMMU更倾向于虚拟机而不是非虚拟机操作系统的虚拟内存。

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

但是系统主板上的DRAM通常仍然存在分裂,分区,主要由CPU使用的内存,以及主要由GPU使用的内存。即使存储器可能存在于相同的DRAM芯片内,通常大块也是“图形”。在上面的论文中,由于历史原因,它被称为“本地”存储器。 CPU和图形内存可能会有不同的调整 - 通常GPU内存的优先级较低,但视频刷新除外,并且突发时间较长。

在我引用的文章中,有不同的内部总线:“系统”内存的洋葱,以及“大蒜”,可以更快地访问图形内存分区。大蒜记忆通常是未缓存的。

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

等等,

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

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

(b)虽然硬件试图提供(a),但特殊的图形存储器功能几乎总是制造专用的图形存储器,即使只是相同DRAM的分区,也要快得多或节能。

差距可能正在缩小,但每当你认为它即将消失时,可以发挥另一种硬件技巧。