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

在CUDA中等待*任何*设备完成?,cuda,Cuda,我有一个CUDA内核,我想在多个GPU上运行。在每个GPU上,它都在执行搜索任务,因此我希望在每个GPU上启动它,然后在主机代码中等待,直到任何GPU返回(表明它找到了它要查找的内容) 我知道cudaDeviceSynchronize(),但它会一直阻塞到当前GPU完成。有什么东西可以让我阻止N个不同的GPU中的任何一个完成吗?CUDA不提供任何内置函数来直接实现这一点 我相信你需要通过投票做点什么,然后如果你想投票的结果,你可以。如果您想构建阻塞CPU线程的东西,我想轮询操作上的旋转就可以了。

我有一个CUDA内核,我想在多个GPU上运行。在每个GPU上,它都在执行搜索任务,因此我希望在每个GPU上启动它,然后在主机代码中等待,直到任何GPU返回(表明它找到了它要查找的内容)


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

CUDA不提供任何内置函数来直接实现这一点

我相信你需要通过投票做点什么,然后如果你想投票的结果,你可以。如果您想构建阻塞CPU线程的东西,我想轮询操作上的旋转就可以了。(
cudaDeviceSynchronize()
默认情况下是机罩下的旋转操作)

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

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

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

我最终使用cudaLaunchHostFunc添加一个回调,该回调更新一个全局变量,指示哪个设备已完成,然后在main中添加一个轮询循环来检查该变量。似乎工作得很好!