从主机到设备的 cudaMemcpy 是否并行执行?

6
我想知道当我们从主机到设备进行复制时,cudaMemcpy是在CPU上执行还是在GPU上执行?
换句话说,这个复制是顺序执行还是并行执行?
让我解释一下为什么我会问这个问题:我有一个包含500万个元素的数组。现在,我想从数组的不同部分复制2组50000个元素。所以,我在想是否先在CPU上形成一个包含所有要复制元素的大数组,然后只进行一次大型传输,还是应该调用两个cudaMemcpy,每个集合一个。
如果cudaMemcpy是并行执行的,那么我认为第二种方法会更快,因为你不必首先在CPU上顺序复制100000个元素。
2个回答

3
我想知道当我们从主机复制到设备时,cudaMemcpy是在CPU还是GPU上执行的?
对于使用常规分页用户分配内存的同步API调用,答案是它在两个上都运行。驱动程序必须先将数据从源内存复制到主机上的DMA映射源缓冲区,然后向GPU发出数据等待传输的信号。然后GPU执行传输操作。这个过程根据需要重复多次,直到完成从源内存到GPU的完整复制。
通过使用固定内存,可以提高处理吞吐量,在不需要中间复制的情况下,驱动程序可以直接进行DMA读写(虽然固定内存具有大量初始化/分配开销,需要摊销)。对于其他问题,我怀疑直接从源内存进行两次内存复制比另一种方法更有效,但这是只有通过基准测试才能得出结论的那种问题。

0

我相信从主机内存到GPU内存的传输是一个阻塞调用。它使用整个总线,因此即使可以在物理上实现,也没有真正意义上同时运行多个操作。

我怀疑在传输数据之前连接数据不会带来任何性能提升。瓶颈可能是传输本身。这些副本应该被排队并以最小的开销顺序执行。


2
CUDA中有一个异步版本的内存复制API,所有当前的GPU都可以将内核执行与内存传输重叠。Fermi计算卡还配备了第二个DMA引擎,因此它们可以同时执行两个异步传输 - 在多GPU系统中可以是设备到主机或设备到设备。 - talonmies
@talonmies 很棒!我知道内核执行和内存传输可以同时运行,但不知道第二个内存控制器。假设单个传输使用所有可用带宽,那么这是否会将传输带宽减半? - 3Dave
@DavidLively:所以您建议我使用2个cudaMemcpy而不是首先连接它们? - Programmer
1
@DavidLively:在一条带宽受限的主设备传输总线上,是的,只有一个DMA引擎。但是较小的传输通常是延迟而不是带宽受限,因此拥有2个DMA引擎可以隐藏部分延迟。此外,还有其他情况可以获得巨大的优势。如果您在PCI-e交换机后面有两个Fermi Tesla(例如C2070),它们可以相互流式传输而不消耗主机PCI-e带宽,如果您有PCI-e Infiniband卡,则可以直接从电线上进行DMA到GPU内存,同时GPU正在与主机或另一个GPU进行传输。 - talonmies
1
@程序员 你应该认真阅读《CUDA 4.0编程指南》,因为它回答了所有有关同步的问题。《CUDA 4.0最佳实践指南》提供了一些关于如何从异步内存拷贝中受益的额外见解。长话短说,除非你个人并独立地花时间理解异步内存API、上下文、流以及一些高性能计算技术(如流水线、双缓冲区分段、重叠计算和通信等),否则你不会从这些内存方面获得任何好处。 - Patrick87
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接