![](/img/trans.png)
[英]In CUDA9, is “cudaMemcpyAsync()” both a device and a host function?
[英]About cudaMemcpyAsync Function
我有一些问题。
最近我正在使用 CUDA 制作一个程序。
在我的程序中,Host 上有一个用 std::map(string, vector(int)) 编程的大数据。
通过使用这些数据,一些向量(int)被复制到 GPU 全局内存并在 GPU 上处理
处理后,在 GPU 上生成一些结果,并将这些结果复制到 CPU。
这些都是我的节目表。
但我想减少处理时间。
所以我决定在我的程序中使用 cudaMemcpyAsync 函数。
在搜索了一些文档和网页后,我意识到要使用 cudaMemcpyAsync 函数主机内存,其中有数据要复制到 GPU 全局内存必须分配为固定内存。
但是我的程序正在使用std::map,所以我不能把这个std::map数据放到固定内存中。
所以我没有使用这个,而是创建了一个缓冲区数组类型的固定内存,这个缓冲区总是可以处理复制向量的所有情况。
最后,我的程序是这样工作的。
我的程序变得比以前的情况快得多。
但问题(我的好奇心)就在这一点上。
我试图以类似的方式制作另一个程序。
这种方法比上面讨论的方法快了大约 10%。
但我不知道为什么。
我认为 cudaMemcpyAsync 只能与内核函数重叠。
但我的情况我认为不是。 而不是看起来可以在 cudaMemcpyAsync 函数之间重叠。
对不起我的长问题,但我真的很想知道为什么。
有人可以教我或向我解释什么是确切的设施“cudaMemcpyAsync”以及哪些功能可以与“cudaMemcpyAsync”重叠?
cudaMemcpyAsync 的复制活动(以及内核活动)可以与任何主机代码重叠。 此外,与设备之间的数据复制(通过 cudaMemcpyAsync)可以与内核活动重叠。 所有 3 个活动:主机活动、数据复制活动和内核活动,可以相互异步完成,并且可以相互重叠。
正如您所看到和演示的,主机活动和数据复制或内核活动可以以相对简单的方式相互重叠:内核启动立即返回到主机,cudaMemcpyAsync 也是如此。 然而,为了获得数据复制和内核活动之间的最佳重叠机会,有必要使用一些额外的概念。 为了获得最佳重叠机会,我们需要:
当然,您的工作也需要以可分离的方式分解。 这通常意味着如果您的内核正在执行特定功能,您可能需要多次调用此内核,以便每次调用都可以处理单独的数据。 例如,这允许我们在第一次内核调用处理数据块 A 时将数据块 B 复制到设备。 这样我们就有机会将数据块 B 的副本与数据块 A 的内核处理重叠。
与 cudaMemcpyAsync(与 cudaMemcpy 相比)的主要区别在于:
第 1 项是必要的功能,以便数据副本可以与内核计算重叠。 第 2 项是一项必要功能,以便数据复制可以与主机活动重叠。
尽管复制/计算重叠的概念非常简单,但在实践中实现需要一些工作。 如需其他参考资料,请参阅:
请注意,上面的一些讨论是基于具有 2.0 或更高计算能力的设备(例如并发内核)。 此外,不同的设备可能有一个或两个复制引擎,这意味着同时复制到设备和从设备复制只能在某些设备上进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.