【问题标题】:Will CUDA API affect CPU's Ram access performance?CUDA API 会影响 CPU 的 Ram 访问性能吗?
【发布时间】:2016-02-03 09:48:42
【问题描述】:

* 更多测试表明 CPU 的 Ram 速度慢与 CUDA 无关。事实证明 Func2(CPU) 是 CPU 密集型但不是内存密集型,那么对于我的程序 1,内存压力较小,因为它是 Func2 占用 CPU。对于program2(GPU),由于Func2在GPU上变得非常快,Func1占用CPU并对内存造成很大压力,导致Func1变慢*

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

长版:

我的服务器:Win Server 2012,48 个内核(24 个超线程),192 GB 内存(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 内核,Func2 使用 K40s):

   //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 个 program1(CPU),我注意到 Func1 的 6s 平均变成了 12s

虽然对于 20 个 program2(GPU),Func1 需要 ~42s 才能完成,而我的 Func2(GPU) 仍然是 ~1s(这 1s 包括锁定 GPU、一些 cudaMemcpy 和内核调用。我假设这也包括 GPU 上下文切换)。所以看起来GPU自身的性能并没有受到太大影响,而CPU却(通过GPU)

所以我怀疑 cudaSetDevice/cudaMalloc/cudaMemcpy 正在影响 CPU 的 Ram 访问?如果是真的,同时使用多核 CPU 和 GPU 的并行化将受到影响。 谢谢。

【问题讨论】:

  • 我不明白为什么会有反对票。请解释您帮助我改进的原因,谢谢。

标签: c++ performance memory cuda


【解决方案1】:

这几乎肯定是由资源争用引起的。

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

NVIDIA 发布了一个名为 MPS(多进程服务器)的系统,该系统将 CUDA API 重新实现为服务,并在内部利用现代 TesLa 卡的 Hyper-Q 工具将操作推送到 Hyper-Q 支持的宽命令队列中。这消除了所有上下文切换延迟。如果性能对您很重要并且您的代码需要大量进程共享单个设备,那么您可能需要对此进行调查

【讨论】:

  • 大家好,感谢您的回答。但是我的日志显示 GPU 的性能并没有受到 20 个进程的太大影响。 (已修改我的问题以反映它),谢谢
  • 找到了真正的原因,我已经在问题编辑中解释了。
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2012-02-04
  • 2011-01-28
相关资源
最近更新 更多