2012-03-25 89 views
2

矩陣索引的這個正確表達式(dim3 threadBlock =(A,B,1),dim3 blockGrid =(C,D,1),其中A,B,C,D是一些數字)?cuda線索索引

int i = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x; 
int j = (blockIdx.x * gridDim.y + blockIdx.y) * blockDim.y + threadIdx.y; 

回答

1

這是從線程索引到矩陣的一種方法,但不是唯一的方法。例如,我可以更改內核,以便每個線程處理多個矩陣項目。

+0

一個線程=一個矩陣項不是最快的方法嗎? – user1281071 2012-03-25 10:54:57

+1

user1281071:你沒有在你的問題中要求最快的方法:-)無論如何,最快的索引不是速度的唯一因素,它也將取決於你打算在內核中計算的內容。 – 2012-03-25 12:30:43

+0

好吧,sry :)我想要有這樣的系統:一個線程=一個矩陣項目,但我不知道上面寫的表達式對於二維塊和網格是否正確。 – user1281071 2012-03-25 12:42:54

5

這看起來不正確,我的眼睛。在二維CUDA網格(i,j)索引的任何線程的是

int idx_i = blockIdx.x * blockDim.x + threadIdx.x; 
int idx_j = blockIdx.y * blockDim.y + threadIdx.y; 

如果要訪問存儲在線性存儲器陣列的等效(i,j)索引要麼

int mindex_colmajor = idx_i + idx_j * LDA; 

int mindex_rowmajor = idx_j + idy_i * LDA; 

,取決於數組是否被存儲在row major or column major order中,並且存儲器中的第一維度(或者等同於音調)等於LDA。然後您訪問內存爲

value = array[mindex] 

其中mindex是以上計算的列主要或行主要索引。

+0

感謝您的回覆。 但沒有關於網格的信息。我很困惑,因爲在nvidia論壇上,我發現了二維塊和網格的例子: UniqueBlockIndex = blockIdx.y * gridDim.x + blockIdx.x; UniqueThreadIndex = UniqueBlockIndex * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x; 但我需要兩個索引(idx_i和idx_j) – user1281071 2012-03-25 15:58:01

+1

你是什麼意思「但沒有關於網格的信息」?我給你的信息既正確又容易在CUDA編程指南中找到,如果你關心它的搜尋...... – talonmies 2012-03-25 17:42:31

+0

與「有關網格的信息」我的意思是gridDim.x – user1281071 2012-03-27 14:09:17