如何在cudaMemcpyPeerAsync()中定义目标设备流?

时间:2013-09-22 05:54:26

标签: cuda gpu

我正在使用cudaMemcpyPeerAsync()从gpu0到gpu1进行异步memcpy。

cudaMemcpyAsync()提供了用于gpu0的流的选项,但不适用于gpu1。我可以以某种方式定义接收设备的流吗?

我正在使用OpenMP线程来管理每个设备(因此,它们位于不同的上下文中)。

Visual Profiler显示发送设备的流,但是对于接收设备,此memcpy仅显示在MemCpy(PtoP)中,而不显示在任何流中(甚至不在默认流中)

PS:我目前的实施工作正常。我只想重叠发送和接收通信。

1 个答案:

答案 0 :(得分:1)

cuda对等拷贝没有API调用,允许您在两端指定流。你的问题的简单答案是否定的。

Streams是一种组织活动的方式。 cudaMemcpyPeerAsync调用将显示在分配给它的流(和设备)中。这是您使用API​​的控制级别。

由于流指示(即控制,调节)行为,能够将cuda任务分配给单独的流(在多个设备上,在这种情况下)是一个未在CUDA中公开的控制级别。设备(和流)旨在异步操作,并要求特定的cuda任务满足两个独立流的要求(在这种情况下在两个单独的设备上)会引入一种不合适的同步类型,并且可能导致各种活动摊位,甚至可能是僵局。

此处的描述和cudaMemcpyPeerAsync的行为都不能阻止您在各个方向上重叠复制操作。实际上,在我看来,将cuda任务分配给多个流将使得更难以实现灵活的重叠。

如果您难以实现特定重叠,您应该描述问题(即,提供简单的再现器完整的可编译SSCCE.org代码),并显示视觉分析器显示的当前重叠场景,并描述所需的重叠场景