2017-09-03 75 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

相關問題