我正在使用cudaMemcpyPeerAsync()从gpu0到gpu1进行异步memcpy。
cudaMemcpyAsync()提供了用于gpu0的流的选项,但不适用于gpu1。我可以以某种方式定义接收设备的流吗?
我正在使用OpenMP线程来管理每个设备(因此,它们位于不同的上下文中)。
Visual Profiler显示发送设备的流,但是对于接收设备,此memcpy仅显示在MemCpy(PtoP)中,而不显示在任何流中(甚至不在默认流中)
PS:我目前的实施工作正常。我只想重叠发送和接收通信。
答案 0 :(得分:1)
cuda对等拷贝没有API调用,允许您在两端指定流。你的问题的简单答案是否定的。
Streams是一种组织活动的方式。 cudaMemcpyPeerAsync调用将显示在分配给它的流(和设备)中。这是您使用API的控制级别。
由于流指示(即控制,调节)行为,能够将cuda任务分配给单独的流(在多个设备上,在这种情况下)是一个未在CUDA中公开的控制级别。设备(和流)旨在异步操作,并要求特定的cuda任务满足两个独立流的要求(在这种情况下在两个单独的设备上)会引入一种不合适的同步类型,并且可能导致各种活动摊位,甚至可能是僵局。
此处的描述和cudaMemcpyPeerAsync的行为都不能阻止您在各个方向上重叠复制操作。实际上,在我看来,将cuda任务分配给多个流将使得更难以实现灵活的重叠。
如果您难以实现特定重叠,您应该描述问题(即,提供简单的再现器完整的可编译SSCCE.org代码),并显示视觉分析器显示的当前重叠场景,并描述所需的重叠场景