nccl - 我们可以在1个设备GPU上总结一个数组的所有值来获得总和吗?

时间:2017-09-03 23:01:18

标签: arrays c++11 parallel-processing cuda

我有一个GPU(例如GeForce GTX 980Ti)。我有一个浮点数组,例如,长度为128的cudaMalloc'ed(在单个设备GPU上分配),所有值都是1.f.我想用nccl来求它们得到128,即(1 + 1 + ... + 1)= 128。

但是,我在NCCL开发人员的文档中读到,如果我正确地解释它,减少只能跨设备,而不是在单个设备上:

比照http://docs.nvidia.com/deeplearning/sdk/nccl-developer-guide/index.html#axzz4rabuBrOP

从那里(引用),

  

“AllReduce以K列中的每一个上的N值的独立数组Vk开始,并且以N值的相同阵列S结束,其中S [i] = V0 [i] + V1 [i] + ... + Vk-1 [ i],对于每个等级k。“

我想确认我无法在单个GPU上减少设备GPU(求和)上的阵列。

我的完整代码(以及如何编译)在这里作为参考/上下文:

https://github.com/ernestyalumni/CompPhys/blob/master/moreCUDA/nccl/Ex01_singleprocess_b.cu

代码的“肉”在这里;之前的“准备”(声明)应该是正确的:

ncclCommCount(*comm.get(),&count);

ncclAllReduce( d_in.get(), d_out.get(), size, 
                ncclFloat, ncclSum, *comm.get(), *stream.get() );

// size is 128 for the 128 elements in both the (pointers to) float arrays 
// d_in and d_out

我已经用C ++ 11智能指针“包装”了我的指针,但是我用原始指针尝试了我的代码并且结果相同;如果您愿意,我可以发布该版本。

请确认我不能使用nccl在单个设备GPU上的单个阵列上对单个设备进行并行缩减,或者告诉我如何做。谢谢!

1 个答案:

答案 0 :(得分:1)

  

我想确认我无法在单个GPU上减少设备GPU(求和)上的阵列。

NCCL无法做到这一点。

  1. NCCL专为多个GPU设计,尝试将其用于仅涉及单个GPU的操作是不明智或合乎逻辑的。
  2. NCCL ReduceAllReduce操作不会对阵列执行减少操作以将其减少为单个数字。它们对数组进行减少,以将它们减少为单个数组。
  3. 我的建议是使用像cubthrust之类的库来在单个GPU上将数组缩减为单个值。

    为了解释NCCL与普通减少之间的差异(例如由幼崽或推力提供的那些),普通减少将是这样的:

    arr:
     1
    +1
    +1
    --
     3 (sum) result
    

    NCCL Reduce或AllReduce执行此操作:

    arr1  arr2  arr3      result
     1  +  2  +  3          6
     1  +  3  +  4     =    8
     1  +  4  +  5         10
    

    NCCL AllReduce的行为与您已经引用的完全相同:

      

    " AllReduce以每个K等级的N个值的独立数组Vk开始,以N个值的相同数组S结束,其中S [i] = V0 [i] + V1 [i] + ... + Vk -1 [i],每个等级k。"