2011-02-15 46 views
10

我想弄清楚是否使用cudaHostAlloc(或cudaMallocHost?)是适当的。CUDA零复制内存考虑事项

我想运行一个内核,我的输入数据超过了GPU上可用的数量。

我可以cudaMallocHost比GPU上有更多的空间吗?如果没有,并且可以说我分配了1/4我需要的空间(这将适合GPU),使用固定内存有什么好处吗?

我基本上还是要从1/4大小的缓冲区复制到我的全尺寸malloc'd缓冲区,这可能不会比只使用正常的cudaMalloc快吗?

这是典型的使用场景正确使用cudaMallocHost:

  1. 分配固定的主机内存(可以称之为“h_p”)
  2. 填入h_p与输入数据 -
  3. 获得设备的指针上的GPU使用该设备的指针修改阵列 -
  4. 使用h_p像正常,它现在已修改盒内的内容h_p
  5. 运行内核

所以 - 第4步到第5步之间没有任何复制对吧?

如果这是正确的,那么我就可以看到了优势,将适合在GPU上一下子至少

+0

你似乎会问几个问题... – jmilloy 2011-02-16 22:25:56

回答

1

使用主机内存将是数量级比设备上的内存慢几个数量级内核。它有非常高延迟和非常有限的吞吐量。为PCIe X16的实例容量是单纯的8GB/s的时上GTX460设备存储器的带宽是108GB/s的

1

无论是CUDA C编程指南,也没有CUDA最佳实践指南提及的是,量cudaMallocHost可以“t处分配比设备内存大,所以我认为这是可能的。

从页面锁定内存到设备的数据传输比正常数据传输更快,如果使用写入组合内存,则数据传输速度更快。 此外,以这种方式分配的内存可映射到设备内存空间,因此无需(手动)复制数据,所有这些都需要。它会自动发生,因为数据是需要的,所以您应该能够处理更多的数据而不是装入设备内存。

但是,如果页锁定量构成主机内存的重要部分,则(主机的)系统性能可能会大打折扣。

那么什么时候使用这种技术?,很简单:如果数据需要是只读一次,只写一次,请使用它。它会带来性能上的提升,因为无论如何,在某个点上都会来回复制数据。但是,只要需要存储不适合寄存器或共享内存的中间结果,就会出现数据处理块,这些数据块可以与cudaMalloc一起装入设备内存中。

0
  1. 是的,你可以cudaMallocHost比gpu上有更多的空间。
  2. 固定内存可以有更高的带宽,但会降低主机性能。在普通主机内存,固定内存,写入组合内存和甚至映射(零拷贝)内存之间切换非常容易。为什么不先用普通的主机内存并比较性能?
  3. 是的,您的使用场景应该可以使用。

请记住,全局设备内存访问速度慢,零拷贝主机内存访问速度更慢。零拷贝是否适合您完全取决于您如何使用内存。

5

当谈到CUDA应用程序的性能时,内存传输是一个重要因素。 cudaMallocHost可以做两两件事:

  • 分配固定的内存:这是页面锁定主机内存CUDA运行时可以跟踪。如果以这种方式分配的主机内存作为源或目标参与cudaMemcpy,则CUDA运行时将能够执行优化的内存传输。
  • 分配映射内存:这也是页锁定内存,可以直接在内核代码中使用,因为它被映射到CUDA地址空间。为此,必须在使用任何其他CUDA函数之前使用cudaSetDeviceFlags来设置cudaDeviceMapHost标志。 GPU内存大小不限制映射主机内存的大小。

我不确定后一种技术的性能。它可以让你很好地重叠计算和通信。

如果您访问内核中的块(即,您不需要整个数据,但只需要一部分),则可以使用多缓冲方法,利用异步存储器传输与cudaMemcpyAsync之间的多缓冲区GPU:在一个缓冲区上计算,将一个缓冲区传输到主机,并同时将一个缓冲区传输到设备。

我相信在使用cudaDeviceMapHost类型的分配时,您对使用场景的断言是正确的。你不必做一个明确的拷贝,但肯定会有一个你看不到的隐式拷贝。它有可能与你的计算很好地重叠。请注意,您可能需要同步内核调用以确保内核已完成,并且您在h_p中拥有修改后的内容。

0

还考虑使用流来重叠数据传输/内核执行。 这提供了数据块GPU工作