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

如何在cudamemcypeerasync()中定义目标设备流?,cuda,gpu,Cuda,Gpu,我正在使用cudamemcypeerasync()从gpu0到gpu1进行异步memcpy cudaMemcpyAsync()为流提供用于gpu0的选项,但不用于gpu1。我也可以定义接收设备的流吗 我使用OpenMP线程来管理每个设备(因此,它们位于不同的上下文中) VisualProfiler显示发送设备的流,但对于接收设备,此memcpy仅显示在memcpy(PtoP)中,而不显示在任何流中(甚至不显示在默认流中) PS:我当前的实现工作正常。我只想重叠发送和接收通信。cuda对等副本没有

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

cudaMemcpyAsync()为流提供用于gpu0的选项,但不用于gpu1。我也可以定义接收设备的流吗

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

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


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

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

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

由于流决定(即控制、调节)行为,因此能够将cuda任务分配给单独的流(在本例中,在多个设备上)是cuda中未公开的控制级别。设备(和流)旨在异步运行,并且要求特定cuda任务满足两个单独流的要求(在本例中,在两个单独的设备上)将引入一种不合适的同步,并可能导致各种活动暂停,甚至死锁

这里的任何描述,以及cudaMemcpyPeerAsync的行为,都不应阻止您在各个方向上重叠复制操作。事实上,在我看来,将cuda任务分配给多个流会使灵活的重叠更难实现


如果您很难实现特定的重叠,您可能应该描述问题(即,提供一个简单的复制器完整的可编译SSCCE.org代码),并显示visual profiler显示的当前重叠场景,并描述所需的重叠场景。

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

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

由于流决定(即控制、调节)行为,因此能够将cuda任务分配给单独的流(在本例中,在多个设备上)是cuda中未公开的控制级别。设备(和流)旨在异步运行,并且要求特定cuda任务满足两个单独流的要求(在本例中,在两个单独的设备上)将引入一种不合适的同步,并可能导致各种活动暂停,甚至死锁

这里的任何描述,以及cudaMemcpyPeerAsync的行为,都不应阻止您在各个方向上重叠复制操作。事实上,在我看来,将cuda任务分配给多个流会使灵活的重叠更难实现


如果您很难实现特定的重叠,您可能应该描述问题(即,提供一个简单的复制器完整的可编译SSCCE.org代码),并显示visual profiler显示的当前重叠场景,并描述所需的重叠场景。

要定义目标流,您应该在单独的GPU中的流之间进行某种类型的同步,我认为这是不可能的,并且与API的“异步”性质相矛盾。根据您使用的GPU,尤其是如果它们有两个复制引擎,您可能会实现发送和接收通信之间的重叠。嗨,杰克。谢谢你的回复。是的,他们有两个复制引擎(我使用的是4K10GPU)。在浏览时,我发现一个GPU的事件/流可以从另一个GPU查询。尝试实现这一点会带来结果。“我只想重叠发送和接收通信”在这种情况下是什么意思?什么是发送,什么是接收,它们如何重叠?@talonmies:由于NVIDIA GK104具有双内存复制引擎(即,它可以同时发送和接收数据),所以我想将两者重叠。例如,gpu0将数据发送到gpu1,同时从另一个gpu(比如gpu2)接收数据。要定义目标流,还应该在单独的gpu中的流之间进行某种同步,我认为这是不可能的,并且与API的“异步”性质相矛盾。根据您使用的GPU,尤其是如果它们有两个复制引擎,您可能会实现发送和接收通信之间的重叠。嗨,杰克。谢谢你的回复。是的,他们有两个复制引擎(我使用的是4K10GPU)。在浏览时,我发现一个GPU的事件/流可以从另一个GPU查询。尝试实现这一点会带来结果。“我只想重叠发送和接收通信”在这种情况下是什么意思?什么是发送,什么是接收,它们如何重叠?@talonmies:由于NVIDIA GK104具有双内存复制引擎(即,它可以同时发送和接收数据),所以我想将两者重叠。gpu0向gpu1发送数据,同时从另一个gpu(比如gpu2)接收数据。