使用OpenMP在多个设备上运行CUDA内核

时间:2019-05-05 06:05:30

标签: cuda

我有两个可用的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);
}

但是,上面的代码也似乎是串行执行的,我看不到任何加速。是否有适当的方法允许内核在不同设备上同时执行?

0 个答案:

没有答案