2011-07-01 51 views
7

我需要一些关于我将要开展的项目的建议。我正在计划使用CUDA 4.0在多GPU节点上运行简单的内核(尚未决定,但我在不情愿地并行执行),方法是遵循下面列出的策略。其目的是通过启动CUDA在多GPU环境中提供的不同策略内核来剖析节点。使用CUDA的多GPU编程策略

  1. 单主机线程 - 多个设备(共享上下文)
  2. 单主机线程 - 在单个设备上内核并行执行(共享上下文)
  3. 多个主机线程 - (等于)多个设备(独立的上下文)
  4. 单主机线程 - 在一个设备上顺序内核执行
  5. 多个主机线程 - 在一个设备上内核的并行执行(独立的上下文)
  6. 多个主机线程 - 顺序执行一个设备上的内核(独立上下文)

我错过了任何类别吗?您对我所选择的测试类别有何看法,以及任何有关多GPU编程的一般性建议,都是值得欢迎的。

感谢,
萨扬

编辑:

我认为以前的分类涉及到一定的冗余,所以修改了它。

+2

我会与“多主机线程 - (等于)多设备,独立上下文”,因为这种方法似乎有尽可能少的数据共享,所以你可以最大限度地平行。但是我不做GPGPU,所以这只是一个普遍的观察。 –

回答

2

大多数工作负载在CPU工作上足够轻,您可以从单个线程中调用多个GPU,但只有从CUDA 4.0开始才可能轻松实现。在CUDA 4.0之前,您可以调用cuCtxPopCurrent()/ cuCtxPushCurrent()将当前上下文更改为给定线程。但从CUDA 4.0开始,您只需拨打cudaSetDevice()即可将当前上下文设置为与给定设备相对应。因为没有“共享上下文” - GPU上下文仍然是分离的,设备内存和对象(如CUDA流和CUDA事件)与GPU上下文关联在一起被创造。

+0

SLI设置中的(1)如何? – osgx

+1

SLI只是多GPU的一个特例,假设您已经将GPU设置为单独枚举。默认情况下,SLI使得多个GPU看起来像一个更快的GPU;但是当系统按照这种方式配置时,CUDA只能使用其中一个GPU。 – ArchaeaSoftware

1

多主机线程 - 等于多个设备,独立的上下文是一个胜利者,如果你能摆脱它。这是假设你可以得到真正独立的工作单位。这应该是真实的,因为你的问题是尴尬的平行。

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

+0

多GPU系统是一款Appro 1U,带有2个CPU和4个GPU。我想测试所有上述类别并对它们进行描述...是的,迄今为止,我在这个类别中已经看到了更好的结果,并且认为这些问题对于GPU来说是理想的。尽管我有这样的感觉:“多主机线程 - 在一个设备上同时执行内核 - 独立的上下文”可能对于某些问题大小消耗的功耗有利。 – Sayan