1

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2013-09-22T14:17:36.477 回答