默认固定存储器为零

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

默认的固定内存将数据从主机复制到GPU的速度是正常传输速度的两倍,所以确实有优势(假设我们有足够的主机内存来进行页面锁定)

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

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


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

映射的固定内存(零拷贝)在以下情况下非常有用:

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

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

  • 主机端想要在内核仍在运行时更改/添加更多数据或读取结果(例如通信)

  • 数据不适合GPU内存

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

    固定但未映射的内存更好:

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

  • 没有太多的计算要执行,并且加载延迟不会很好地隐藏


  • 除了被映射到CUDA地址空间之外,映射固定内存在所有方面都与其他类型的固定内存相同,因此可以由CUDA内核读取和写入,以及用于复制引擎的DMA传输。

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

    除了Sanders / Kandrot书中提出的要点外,还有其他一些要注意的事项:

  • 从内核写入主机内存(例如,将结果发布到CPU)很好,因为在这种情况下GPU没有任何延迟来覆盖,

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

  • 链接地址: http://www.djcxy.com/p/47365.html

    上一篇: Default Pinned Memory Vs Zero

    下一篇: Copying a struct containing pointers to CUDA device