GPU - 系统内存映射

Abh*_*nav 10 architecture hardware io gpu computer-architecture

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

Kra*_*lew 14

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

存储系统FUSION APUS零拷贝的好处Pierre Boudier AMD OpenGL/OpenCL Graham卖方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的分区,也明显更快或更节能.

差距可能正在缩小,但每次你认为它即将消失时,可以播放另一个硬件技巧.