默认固定存储器与零复制存储器

jwd*_*msd 34 cuda

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

默认的固定内存将数据从主机复制到GPU的速度是正常传输速度的两倍,所以肯定有一个优势(前提是我们有足够的主机内存来锁定页面)

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

我的问题是:这些固定内存类型中的哪一种是更好的编程习惯.

Cyg*_*sX1 33

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

当以下情况之一时,映射的固定内存(零拷贝)非常有用:

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

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

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

  • 数据不适合GPU内存

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

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

  • 多次加载或存储数据时.例如:您有多个后续内核,按步骤执行工作 - 无需每次都从主机加载数据.

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


Arc*_*are 12

映射固定存储器在所有方面都与其他类型的固定存储器相同,只是它被映射到CUDA地址空间,因此可以由CUDA内核读取和写入,也可以用于复制引擎的DMA传输.

不映射固定内存的优势是双重的:它为您节省了一些地址空间,这在32位平台的世界中可以是一种珍贵的商品化,GPU可以容纳3-4G的RAM.此外,未映射的内存不会被恶意内核意外破坏.但是这个问题足够深刻,CUDA 4.0中的统一地址空间功能将导致默认情况下映射所有固定分配.

除了Sanders/Kandrot书中提出的观点之外,还要记住其他一些事项:

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

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

  • 如果GPU从映射的固定内存中读取,则必须在内存请求到达之前找到要做的事情.如果它写入映射固定内存,它会向总线发送写入并继续运行.我不知道为什么他们必须合并.合并是一种基于warp的构造,它必须与硬件实现有关. (2认同)