2017-09-03 39 views
0

我具有单个GPU(例如的GeForce GTX 980Ti)。我有一个单一的浮阵列,例如,cudaMalloc'ed(分配在该单个装置GPU)长度为128的,与所有值是1.f.我想用nccl将它们相加得到128,即(1 + 1 + ... + 1)= 128。NCCL - 我们可以总结的阵列的所有的值在1个装置GPU以获得总和?

但是,我读了NCCL开发者文档上的减少仅是跨设备,而不能在一个单一的设备,如果我正确地解释它:

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

从那里(引用),

“AllReduce与N个值的独立阵列VK开始于每个k的位列,并与N个值,其中S [I] = V 0 [的相同的阵列s结尾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个智能指针“包装”我的三分球,但我已经尽了与原始指针以及结果相同的代码;如果您愿意,我可以发布该版本。

请确认我不能在单个设备GPU使用NCCL做平行降低单个设备上,通过单一的阵列,或者告诉我怎样,我可以。谢谢!

回答

1

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

这是不可能的NCCL。

  1. NCCL专为多个GPU设计,尝试将其用于仅涉及单个GPU的操作时使用它不合理或不合逻辑。
  2. 的NCCL ReduceAllReduce操作不会在阵列上进行还原,以将其降低到单个数字。他们对数组进行减少以将它们减少为单个数组。

我的建议是使用像cubthrust这样的库来在单个GPU上将数组缩减为单个值。

为了解释NCCL和普通的减少(例如,通过幼崽或推力提供的那些)之间的差,一个普通的还原会是这样:

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

NCCL减少或AllReduce执行此:

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

NCCL AllReduce的行为是完全按照你已经报:

“AllReduce启动s,其具有在K个等级中的每一个上的N个值的独立阵列Vk,并且以N个值的相同阵列S结束,其中S [i] = V0 [i] + V1 [i] + ... + Vk-1 [i]等级k“。

+0

这是很好的知道和进一步的解释都证实我如何阅读该报价,并希望能够帮助其他人。是的,CUB对减少和扫描非常有用,尤其是因为它正在积极更新,并且具有足够的低级别以利用nVidia的架构,并且高级别足够有用。万分感谢! – ernestyalumni2014

相关问题