我正在使用 cudaMemcpyPeerAsync() 从 gpu0 到 gpu1 执行异步 memcpy。
cudaMemcpyAsync() 提供用于 gpu0 的流选项,但不用于 gpu1。我也可以以某种方式定义接收设备的流吗?
我使用 OpenMP 线程来管理每个设备(因此,它们位于单独的上下文中)。
Visual Profiler 显示发送设备的流,但对于接收设备,此 memcpy 仅显示在 MemCpy (PtoP) 中,而不显示在任何流中(甚至不在默认流中)
PS:我目前的实现效果很好。我只是想重叠发送和接收通信。
没有针对 cuda 对等副本的 API 调用,允许您在两端指定流。你的问题的简单答案是否定的。
流是组织活动的一种方式。 cudaMemcpyPeerAsync 调用将显示在其分配到的流(和设备)中。这是您对 API 的控制级别。
由于流决定(即控制、调节)行为,因此能够将 cuda 任务分配给单独的流(在本例中为多个设备上)是 CUDA 中未公开的控制级别。设备(和流)旨在异步操作,并且要求特定的 cuda 任务满足两个单独流的要求(在本例中是在两个单独的设备上)将引入一种不合适的同步类型,并可能导致各种活动陷入停滞,甚至陷入僵局。
这里的任何描述以及 cudaMemcpyPeerAsync 的行为都不应阻止您在各个方向上重叠复制操作。事实上,在我看来,将 cuda 任务分配给多个流会使灵活重叠更难以实现。
如果您难以实现特定的重叠,您可能应该描述问题(即,提供一个简单的重现器完整的可编译 SSCCE.org 代码),并显示可视化分析器显示的当前重叠场景,并描述所需的重叠场景。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)