在 cuda 中同步多个设备
Posted
技术标签:
【中文标题】在 cuda 中同步多个设备【英文标题】:Synchronising multiple devices in cuda 【发布时间】:2021-04-23 12:45:23 【问题描述】:在CUDA的手册中,cudaStreamSynchronize(stream)
的解释中提到了
阻塞直到流完成所有操作。如果为此设备设置了 cudaDeviceScheduleBlockingSync 标志,则主机线程将阻塞,直到流完成其所有任务。
我的问题是这个屏障阻止主机(即 multigpu 中的所有设备)完成流中所有先前发出的操作。我说的对吗?
那么cudaDeviceSynchronize()
在多 GPU 任务中呢?它阻止所有设备完成由cudaSetDevice(deviceid)
设置的设备上发出的所有任务,还是阻止主机完成之前在所有设备上发出的所有操作?
【问题讨论】:
“我们知道,默认情况下,每个流都在特定线程上运行”——我们知道吗? @talonmies 感谢您的提问,我误解了 cuda 手册的解释。我更正了我的问题。 【参考方案1】:我找到了我的问题的答案,我在这里提到可能面临同样问题的人。我引用它来自programming guide of cuda
cudaDeviceSynchronize()
一直等待,直到所有主机线程的所有流中的所有前面的命令都完成。
cudaStreamSynchronize()
将流作为参数并等待,直到给定流中的所有先前命令都已完成。它可用于将主机与特定流同步,允许其他流继续在设备上执行。
cudaStreamWaitEvent()
将一个流和一个事件作为参数(有关事件的描述,请参阅事件),并在调用 cudaStreamWaitEvent()
后使添加到给定流的所有命令延迟执行,直到给定事件完成。
cudaStreamQuery()
为应用程序提供了一种方法来了解流中所有前面的命令是否已完成。
【讨论】:
以上是关于在 cuda 中同步多个设备的主要内容,如果未能解决你的问题,请参考以下文章