我具有单个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做平行降低单个设备上,通过单一的阵列,或者告诉我怎样,我可以。谢谢!
这是很好的知道和进一步的解释都证实我如何阅读该报价,并希望能够帮助其他人。是的,CUB对减少和扫描非常有用,尤其是因为它正在积极更新,并且具有足够的低级别以利用nVidia的架构,并且高级别足够有用。万分感谢! – ernestyalumni2014