在 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 中同步多个设备的主要内容,如果未能解决你的问题,请参考以下文章

cuda学习3-共享内存和同步

CloudKit 如何与多个设备同步?

跨多个安卓设备同步应用数据

可以在用户创建的 numba CUDA 设备函数中调用 numba.cuda.random 设备函数吗?

cuda cpu 函数 - gpu 内核重叠

CloudKit:使用通知使更改在多个设备之间保持同步