讓我們假設我有一個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 .. ]
我希望你能看到這可能會如何影響合併:對於每個變體,都會有一個特定的最佳方式來訪問我的設備內存緩衝區。
不幸的是,我還沒有發現任何詳細信息。
閱讀CUDA C編程指南第2.2節,線程層次結構。 – sgarizvi
可能的重複[線程如何分成經線? Cuda](http://stackoverflow.com/questions/6177202/how-are-threads-divided-into-warps-cuda) – talonmies