使用CUDA的多GPU编程策略

时间:2011-07-01 17:35:35

标签: cuda

我需要就我将要进行的项目提出一些建议。我计划通过遵循下面列出的策略,在使用CUDA 4.0的Multi-GPU节点上运行简单的内核(尚未决定,但我正在以令人难以置信的平行方式)。目的是通过在多GPU环境中以CUDA提供的不同策略启动内核来分析节点。

  1. 单主机线程 - 多个设备(共享上下文)
  2. 单个主机线程 - 在单个设备上并发执行内核(共享上下文)
  3. 多个主机线程 - (等于)多个设备(独立上下文)
  4. 单个主机线程 - 在一个设备上执行顺序内核
  5. 多个主机线程 - 在一个设备上并发执行内核(独立上下文)
  6. 多个主机线程 - 在一个设备上顺序执行内核(独立上下文)
  7. 我错过了任何类别吗?您对我所选择的测试类别以及任何一般建议有什么看法,欢迎使用多GPU编程。

    谢谢,
    萨扬

    编辑:

    我认为之前的分类涉及一些冗余,因此对其进行了修改。

2 个答案:

答案 0 :(得分:2)

大多数工作负载在CPU工作上足够轻,你可以从单个线程处理多个GPU,但从CUDA 4.0开始只能轻松实现。在CUDA 4.0之前,您可以调用 cuCtxPopCurrent()/ cuCtxPushCurrent()来更改给定线程的当前上下文。但是从CUDA 4.0开始,您只需调用 cudaSetDevice()来设置当前上下文以对应给定设备。

您的选项1)是用词不当,因为没有“共享上下文” - GPU上下文仍然是独立的,设备内存和对象(如CUDA流和CUDA事件)与它们所在的GPU上下文相关联创建

答案 1 :(得分:1)

多个主机线程 - 相同的多个设备,独立的上下文是一个赢家,如果你可以逃脱它。这假设您可以获得真正独立的工作单元。这应该是真的,因为你的问题非常平行。

警告:我没有亲自构建大规模的多GPU系统。我已经建立了一个成功的单GPU系统,相对于CPU有3个数量级的加速。因此,建议是我已经看到的同步成本的概括,以及与构建多GPU系统的同事的讨论。