2013-01-10 27 views
1

讓我們假設我有一個2D網格中的內核調用,就像這樣:CUDA:在2D網格內的線程ID分配

dim3 dimGrid(x, y); // not important what the actual values are 
dim3 dimBlock(blockSize, blockSize); 
myKernel <<< dimGrid, dimBlock >>>(); 

現在我讀過,多維網格僅僅意味着簡化編程 - 底層硬件只會使用一維線性緩存內存(除非您使用紋理內存,但在此不重要)。

我的問題是:什麼順序將線程分配到網格索引期間的經編排程?它們會被水平分配(「迭代」x,然後y)還是垂直分配(「迭代」y,然後x)?這可能與改善內存合併有關,具體取決於我在內核中如何訪問我的內存。

爲了使它更清楚,比方說,以下代表線程的ID作爲應用到我的(虛構的)電網與「水平」分佈:

[ 0 1 2 3 ] 
[ 4 5 6 7 ] 
[ 8 9 10 11 ] 
[ ...  ] 

和「垂直」分配將是:

[ 0 4 8 .. ] 
[ 1 5 9 .. ] 
[ 2 6 10 .. ] 
[ 3 7 11 .. ] 

我希望你能看到這可能會如何影響合併:對於每個變體,都會有一個特定的最佳方式來訪問我的設備內存緩衝區。

不幸的是,我還沒有發現任何詳細信息。

+1

閱讀CUDA C編程指南第2.2節,線程層次結構。 – sgarizvi

+0

可能的重複[線程如何分成經線? Cuda](http://stackoverflow.com/questions/6177202/how-are-threads-divided-into-warps-cuda) – talonmies

回答

3

水平和垂直是任意的。但是線程確實有一個明確定義的x,y和z維度。線程按x,y,z的順序分組爲經線。所以16×16 threadblock將具有以下列順序的線程在第32線經:

經線車道:線程ID(X,Y,Z)

  • 0:0,0,0
  • 1:1,0,0
  • 2:2,0,0
  • 3:3,0,0
  • ...
  • 15:15,0,0
  • 16:0 ,1,0
  • 17:1,1,0
  • 18:2,1,0
  • 19:3,1,0
  • ...
  • 31:15,1,0
+0

謝謝,這清除了它。 –