2015-11-03 81 views
-2

*更多测试显示CPU的RAM慢度与CUDA无关。事实证明,Func2(CPU)是CPU密集型的,但不是内存密集型的,那么对于我的program1来说,内存压力就不如占用CPU的Func2。对于程序2(GPU),作为FUNC2变得非常快的GPU,FUNC1占用CPU和内存放了很多的压力,导致FUNC1的缓慢*CUDA API会影响CPU的RAM访问性能吗?

短版:如果我在同一台服务器上运行20个进程同时,我注意到,CPU的运行速度要慢得多,当GPU参与(与纯CPU处理)

龙版本:

我的服务器:赢Server 2012中,48个内核(超线程从24),192 GB的RAM(20进程将只使用〜40GB),4个K40卡片

我的程序1(CPU版本):

For 30 iterations: 
     Func1(CPU): 6s (lot's CPU memory access) 
     Func2(CPU): 60s (lot's CPU memory access) 

我的程序2(GPU版本,用于FUNC1 CPU核心,并K40S为FUNC2):

//1 K40 will hold 5 contexts at the same time, till end of the 30 iterations 
    cudaSetDevice //very slow, can be few seconds 
    cudaMalloc ~1GB //can be another few seconds 
    For 30 iterations: 
     Func1(CPU): 6s 
     Func2(GPU), 1s (60X speedup) //share GPU via named_mutex 

如果我运行20程序1(CPU)在一起,我注意到FUNC1的6S变12S平均

虽然20程序2(GPU),FUNC1需要〜42S来完成,而我FUNC2(GPU)仍然〜1秒(这1S包括锁定GPU,一些cudaMemcpy &内核调用。我认为这也包括GPU上下文切换)。因此,似乎GPU自己的表现并没有太大的影响,而CPU确实(通过GPU)

所以我怀疑cudaSetDevice/cudaMalloc/cudaMemcpy正在影响CPU的RAM访问?如果确实如此,则使用多核CPU & GPU的并行化将受到影响。 谢谢。

+0

我不明白为什么会有投票。请解释你的理由来帮助我改进,谢谢。 –

回答

2

这几乎肯定是由资源争夺造成的。

在标准API中,当您运行20个进程时,您有20个独立的GPU上下文。每当其中一个进程希望执行API调用时,必须有一个上下文切换到该进程上下文。上下文切换很昂贵,并且有很多延迟。这将是你看到的放缓的源头。与内存性能无关。

NVIDIA发布了一个称为MPS(多进程服务器)的系统,它将CUDA API重新实现为服务,并在内部利用现代TesLa卡的Hyper-Q功能将操作推送到Hyper-Q支持的宽命令队列中。这消除了所有的上下文切换延迟。这听起来像你可能想要调查这一点,如果性能对你很重要,你的代码需要大量的进程共享一个设备

+0

嗨talonmies,谢谢你的答案。但是我的日志显示GPU的性能不受20个进程的很大影响。 (已修改我的问题以反映它),谢谢 –

+0

但是,这是如何解释对根本不使用CUDA API的函数的影响? (假设时间安排正确)。 –

+0

找到真正的原因,我已经解释了编辑问题。 –