等到*任何*设备在 CUDA 中完成?

Wait until *any* device has finished in CUDA?

我有一个 CUDA 内核,我想 运行 跨多个 GPU。在每个 GPU 上,它都在执行搜索任务,所以我想在每个 GPU 上启动它,然后在主机代码中等待,直到 any 个 GPU returns(表示它找到了它要找的东西)。

我知道 cudaDeviceSynchronize(),但是在 current GPU 完成之前它会阻塞。有什么东西可以让我阻塞直到 N 个不同 GPU 中的任何一个完成吗?

CUDA 不提供任何内置函数来直接完成此操作。

我相信你需要通过投票来做一些事情,然后如果你想投票结果,你可以。如果你想构建一些东西来阻塞 CPU 线程,我想轮询操作上的旋转就可以做到。 (cudaDeviceSynchronize() 默认情况下是引擎盖下的自旋操作)

您可以使用各种想法构建投票系统:

  • cudaEvent - 在每次内核启动后启动一个事件,然后使用 cudaEventQuery() 操作来轮询
  • cudaHostAlloc - 使用每个内核都可以更新状态的主机固定内存 - 直接读取内存
  • cudaLaunchHostFunc - 在每次内核启动后放置一个回调。回调主机函数将更新普通主机内存,您可以轮询它的状态。

回调方法(至少)将允许您(可能通过原子)将轮询折叠到单个内存位置,如果出于某种原因这很重要的话。对于具有 CUDA 系统原子支持的系统,您可能可以使用主机固定内存方法实现类似的东西。