我有两个可用的GPU设备,并且想同时使用它们。我有一个简单的代码,如下所示:
// a0 has been allocated on device 0 and a1 on device 1
for (int k=0; k<iters; ++k) {
// perform some computation on a0 and save result to a0
cudaSetDevice(0);
myKernel<<<numBlocks, blockSize>>>(a0);
// perform some computation on a0 and save result to a1
cudaSetDevice(1);
myKernel<<<numBlocks, blockSize>>>(a1);
}
我的第一个问题是:为什么上述代码不能同时在两个设备上运行内核?从nvprof
中,我可以看到内核是串行执行的。我认为我对CUDA运作方式的理解不正确。我认为这些内核将在完全不同的设备上执行时异步运行。
(基于this question)似乎可以使用OpenMP同时运行内核:
#pragma omp parallel for
for (int n=0; n<2; ++n) {
cudaSetDevice(n);
if (n==0) myKernel<<<numBlocks, blockSize>>>(a0);
if (n==1) myKernel<<<numBlocks, blockSize>>>(a1);
}
但是,上面的代码也似乎是串行执行的,我看不到任何加速。是否有适当的方法允许内核在不同设备上同时执行?