OpenMP和CUDA混合编程的问题

把OpenMP加入CUDA程序里因为想用到两块GPU来做一些简单的计算

在SDK里cudaOpenMP有一段话说是可以开启比GPU设备多的CPU线程,但是没提到这样做的原因和好处

首先,用两块GPU和不用量的CPU核心数得到以下速度提升:

i7-2600K + GTX 570 * 2 ----------------------------------Speed Up
CUDA + OpenMP (2 Threads)-----------------------------89.58
CUDA + OpenMP (4 Threads)-----------------------------160.44
CUDA + OpenMP (8 Threads)-----------------------------224.30

然后想到即使一块GPU用更多的CPU线程数来控制应该也可以得到速度的提升,于是做了以下测试:

i7-2600K + GTX 570---------------------------------------Speed Up
CUDA---------------------------------------------------------31.36
CUDA + OpenMP (2 Threads)----------------------------61.83
CUDA + OpenMP (4 Threads)----------------------------109.58
CUDA + OpenMP (8 Threads)----------------------------177.11

对结果非常满意,可是就是不知道原因,看了许多文章都不建议使用多个CPU线程来控制一个GPU,想问一下为什么?

感觉不正常

不支持多线程控制GPU原因在于对PCIe和显卡的竞争

CUDA 4.0之前确实不建议多个线程控制一个GPU。因为4.0之前这种情况下每个线程会有自己独立的 GPU context,所以多线程之间的切换会带来context switch的开销。4.0开始多线程共享一个GPU的默认行为是它们共享一个GPU context.

我是一个新手.
这个问题的解释,和你解决的问题的实现有关.
个人以为:多线程的调度,隐藏了计算或者访存的延时.或者说提高了GPU的利用率.
根据是单GPU+多线程时的性能变化.

现在CUDA 4.X中多CPU线程控制一个GPU会比单线程控制一个GPU快么?:slight_smile: