Parallel processing CUDA:我需要多个GPU上的不同数据流并行执行吗?

Parallel processing CUDA:我需要多个GPU上的不同数据流并行执行吗?,parallel-processing,cuda,multi-gpu,Parallel Processing,Cuda,Multi Gpu,我想在多个GPU上并行运行内核。为此,我使用cudaSetDevice()在设备之间切换,然后在相应的设备中启动内核。现在,通常一个流中的所有调用都是按顺序执行的,如果要并行执行,就必须使用不同的流。使用不同的设备时也是这种情况吗?或者在这种情况下,我可以在两个设备上的默认流上运行内核调用,并且它们仍将并行运行吗?没有必要使用每个设备的非默认流来从同一主机进程或线程在多个设备上并发执行内核。内核启动是异步的,并且 非阻塞,因此在不同设备上启动内核的紧密循环应该会为非平凡内核产生执行重叠(请记住,

我想在多个GPU上并行运行内核。为此,我使用
cudaSetDevice()
在设备之间切换,然后在相应的设备中启动内核。现在,通常一个流中的所有调用都是按顺序执行的,如果要并行执行,就必须使用不同的流。使用不同的设备时也是这种情况吗?或者在这种情况下,我可以在两个设备上的默认流上运行内核调用,并且它们仍将并行运行吗?

没有必要使用每个设备的非默认流来从同一主机进程或线程在多个设备上并发执行内核。内核启动是异步的,并且 非阻塞,因此在不同设备上启动内核的紧密循环应该会为非平凡内核产生执行重叠(请记住,设备上下文切换有延迟)


有必要在默认流中使用通常与内核一起使用的所有其他主机API调用的异步版本,因为其中许多(例如cudaMemcpy系列)都会阻塞。

作为另一个参考点,流和事件无论如何都会被阻塞。因此,如果使用显式定义的流,则在切换到其他设备时必须使用不同的流。隐式地,每个设备都有一个单独的默认流。