2011-03-06 74 views
26

在CUDA中,我们可以使用固定内存更有效地将数据从主机复制到GPU,而不是通过主机上的malloc分配的默认内存。但是,有两种类型的固定内存默认固定内存零复制固定内存默认固定内存与零拷贝内存

固定内存拷贝从主机到GPU的数据快两倍的正常传输,所以肯定有优势(前提是我们有足够的主机内存页锁)

在不同版本的固定默认内存,即零拷贝内存,我们不需要将数据从主机复制到GPU的DRAM。内核直接从主机内存中读取数据。

我的问题是:哪种固定内存类型是更好的编程习惯。

回答

29

我认为这取决于你的应用程序(否则,为什么他们会提供两种方式?)

映射,固定内存(零拷贝)是有用的,当两种:

  • 的GPU本身没有内存,无论如何都使用RAM

  • 您只需加载一次数据,但您需要执行大量计算,并且希望通过它来隐藏内存传输延迟。

  • 主机端想改变/添加更多的数据,或者读取结果,而内核仍在运行(如通信)

  • 的数据不适合GPU内存

请注意,您也可以使用多个流来并行复制数据并运行内核。

牵制的,但不映射内存是更好:

  • 当加载或数据多次存储。例如:您有多个后续内核,分步执行工作 - 不需要每次都从主机加载数据。

  • 没有那么多的计算执行和加载延迟都不会被隐藏的很好

+0

是的。我在“CUDA by example”一书中发现了几乎相同的描述。他们声称,当a)内核只读写一次数据时,映射内存是最佳选择。b)当您有集成显卡时,像CPU和GPU共享相同内存的ION平台。 – jwdmsd 2011-03-06 13:15:50

11

映射固定内存等同于在各方面其他类型的固定内存的,只不过它被映射进入CUDA地址空间,因此可以由CUDA内核读取和写入,也可以用于复制引擎的DMA传输。

不映射固定内存的好处有两个方面:它为您节省了一些地址空间,这在可以容纳3-4G内存的GPU的32位平台的世界中可以是宝贵的商品化。此外,未映射的内存不会被流氓内核意外破坏。但是这种担心足以让CUDA 4中的统一地址空间功能足够深奥。0将导致默认映射所有固定分配。

除了由桑德斯/ Kandrot本书中提出的问题,其他的事情要记住:

  • 写从内核主机内存(如发布结果到了CPU)是在尼斯在这种情况下,GPU没有任何延迟,

  • 非常重要的是内存操作要合并 - 否则,即使SM 2.x和更高版本的GPU也会带宽很大。

+0

您能否扩展最后两点?关于第一点,当你说“GPU在这种情况下没有延迟时间”时,你是什么意思?关于第二点,为什么零拷贝框架中的操作需要合并?他们是否使用全球内存? – JackOLantern 2013-05-11 20:19:18

+1

如果GPU从映射的固定内存中读取数据,它必须找到要做的事情,直到内存请求到达。如果写入映射的固定内存,它将写入总线并继续。 我不知道为什么他们必须合并。合并是一种基于扭曲的构造,它必须与硬件实现有关。 – ArchaeaSoftware 2013-05-13 18:55:39

+0

合并decxreases内存操作的数量,因此通过慢速PCI-E总线访问的零拷贝内存变得更加重要(与GPU本身的高带宽全局内存相比) – Bulat 2016-02-12 17:23:00