我有一个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上的单个阵列上对单个设备进行并行缩减,或者告诉我如何做。谢谢!
答案 0 :(得分:1)
我想确认我无法在单个GPU上减少设备GPU(求和)上的阵列。
NCCL无法做到这一点。
我的建议是使用像cub或thrust之类的库来在单个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。"