CUDA執行緒索引計算

2021-10-03 17:34:24 字數 1167 閱讀 1403

終於搞清楚了 thread 索引的計算方式,簡單來說很像小學學的除法公式

被除數 = 除數 * 商 + 餘數

用公式表示:最終的執行緒id = blockid * blocksize + threadid

下面先理清幾個關鍵點:

grid 中 含有若干個 blocks,其中 blocks 的數量由 griddim.x/y/z 來描述。某個 block 在此 grid 中的座標由 blockidx.x/y/z 描述。

blocks 中含有若干個 threads,其中 threads 的數量由 blockdim.x/y/z 來描述。某個 thread 在此 block 中的座標由 threadidx.x/y/z 描述。

接著乙個多維的座標如何用一維資料表達呢?這裡大家想一想兩位數和三位數,就是很好的例子。數字 = 百位數字 * 100 + 十位數字 * 10 + 個位數字。

當我們得知每個維度上的大小時,就可以利用這樣的進製將三維座標轉換為1維座標

一般來說座標(x, y, z)分別所在的維度大小是(dx, dy, dz),一般會把 z 看成高緯度,接著是 y ,最後是 x。

高維度座標轉一維座標公式 id = dx * dy * z + dx * y + x

搞清楚了這些,我們找幾個例子開始計算

id = blockidx.x * blockdim.x + threadidx.x

id = (griddim.x * griddim.y * blockidx.z + griddim.x * blockidx.y + blockidx.x ) * blockdim.x + threadidx.x

id = blockidx.x * (blockdim.x * blockdim.y) + blockdim.x * threadidx.y + threadidx.x

id = (griddim.x * griddim.y * blockidx.z + griddim.x * blockidx.y + blockidx.x) * (blockdim.x * blockdim.y * blockdim.z) + blockdim.x * blockdim.y * threadidx. z + blockdim.x * threadidx.y + threadidx.x

CUDA執行緒配置

1 每個sm上面失少要有192個啟用執行緒,暫存器寫後讀的資料依賴才能被掩蓋 2 將 暫存器 的bank衝突降到最低,應盡量使每個block含有的執行緒數是64的倍數 3 block的數量應設定得令可用的計算資源被充分的利用。由於每個block對映到乙個sm上面,所以至少應該讓block的數目跟sm...

cuda執行緒配置

1 每個sm上面失少要有192個啟用執行緒,暫存器寫後讀的資料依賴才能被掩蓋 2 將 暫存器 的bank衝突降到最低,應盡量使每個block含有的執行緒數是64的倍數 3 block的數量應設定得令可用的計算資源被充分的利用。由於每個block對映到乙個sm上面,所以至少應該讓block的數目跟sm...

CUDA計算初識

cuda的全稱是computer unified device architecture 計算機統一裝置架構 cuda不只是一種程式語言,它包括nvidia對於gpgpu的完整的解決方案 從支援通用計算並行架構的gpu,到實現計算所需要的硬體驅動程式 程式設計介面 程式庫 編譯器 偵錯程式等。nvi...