我很好奇当我们从主机复制到设备时是否在CPU或GPU上执行cudaMemcpy?
换句话说,复制一个顺序过程还是并行完成?
让我解释为什么我这样问:我有一个包含500万个元素的数组。现在,我想从数组的不同部分复制2组50,000个元素。所以,我想在第一次形成我想要在CPU上复制的所有元素的大量数组然后只做一次大转移或者我应该只调用2 cudaMemcpy,每组一个就更快。
如果cudaMemcpy并行完成,那么我认为第二种方法会更快,因为你不必先在CPU上顺序复制100000个元素
答案 0 :(得分:3)
我很好奇当我们在CPU或GPU上执行cudaMemcpy时 从主机复制到设备?
对于具有常规可分页用户分配内存的同步API调用,答案是它在两个上运行。驱动程序必须首先将数据从源存储器复制到主机上的DMA映射源缓冲区,然后向GPU发送数据正在等待传输的信号。然后GPU执行传输。对于从源存储器到GPU的完整复制,该过程将重复多次。
通过使用固定存储器可以提高进程的吞吐量,驱动程序可以直接DMA或来自中间复制(尽管固定具有大的初始化/分配开销,也需要分摊)。
关于问题的其余部分,我怀疑直接来自源内存的两个内存副本比替代方案更有效,但这是一个只能通过基准测试得出最终答案的问题。
答案 1 :(得分:0)
我相信从主机到GPU内存的传输是一个阻塞调用。它使用整个总线,因此,它并不真正有意义(即使在物理上可行)并行运行多个操作。
我怀疑在转移数据之前连接数据会获得任何性能提升。瓶颈可能就是转移本身。副本应排队并以最小的开销顺序执行。