使用CUDA的多GPU编程策略

使用CUDA的多GPU编程策略,cuda,Cuda,我需要一些关于我将要承担的项目的建议。我计划在使用CUDA 4.0的多GPU节点上运行简单内核(尚未决定,但我暗示的是令人尴尬的并行内核),方法如下所列。其目的是通过采用CUDA在多GPU环境中提供的不同策略启动内核来评测节点 单主机线程-多个设备(共享上下文) 单主机线程-在单个设备上并发执行内核(共享上下文) 多个主机线程-(相等)多个设备(独立上下文) 单主机线程-在一个设备上按顺序执行内核 多主机线程-在一个设备上并发执行内核(独立上下文) 多主机线程-在一个设备上顺序执行内核(独立上下

我需要一些关于我将要承担的项目的建议。我计划在使用CUDA 4.0的多GPU节点上运行简单内核(尚未决定,但我暗示的是令人尴尬的并行内核),方法如下所列。其目的是通过采用CUDA在多GPU环境中提供的不同策略启动内核来评测节点

  • 单主机线程-多个设备(共享上下文)
  • 单主机线程-在单个设备上并发执行内核(共享上下文)
  • 多个主机线程-(相等)多个设备(独立上下文)
  • 单主机线程-在一个设备上按顺序执行内核
  • 多主机线程-在一个设备上并发执行内核(独立上下文)
  • 多主机线程-在一个设备上顺序执行内核(独立上下文)
  • 我是否遗漏了任何类别?您对我选择的测试类别有何看法?欢迎您提供w.r.t multi-GPU编程的一般建议

    谢谢,
    萨扬

    编辑:


    我认为前面的分类涉及到一些冗余,所以对其进行了修改。

    多个主机线程-等于多个设备,独立的上下文是一个赢家,如果你能成功的话。这是假设您可以获得真正独立的工作单元。这应该是真的,因为你的问题是令人尴尬的平行


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

    大多数CPU工作负载都很轻,您可以从一个线程处理多个GPU,但从CUDA 4.0开始,这才很容易实现。在CUDA 4.0之前,您需要调用cuCtxPopCurrent()/cuCtxPushCurrent()来更改给定线程的当前上下文。但是从CUDA 4.0开始,您可以调用cudaSetDevice()将当前上下文设置为与给定设备相对应


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

    我将使用“多个主机线程-(相等)多个设备,独立上下文”因为对于这种方法,似乎只有尽可能少的数据共享,所以您可以最大化并行性。不过,我不使用GPGPU,所以这只是一个一般观察。多GPU系统是一个具有2个CPU和4个GPU的近似系统。我想测试以上所有类别,并对它们进行分析……是的,到目前为止,我在该类别中看到了更好的结果,并且认为这些问题对于GPU来说是理想的。虽然我有一种感觉,“多个主机线程-在一个设备独立的上下文上并发执行内核”可能对某些问题大小的w.r.t功耗是有益的。那么(1)在SLI设置中呢?SLI只是多GPU的一个特例,假设您将GPU设置为单独枚举。默认情况下,SLI使多个GPU看起来像一个更快的GPU;但CUDA只能在系统以这种方式配置时使用其中一个GPU。