2017-10-21 178 views
0

我正在嘗試學習CUDA。我在基於GPU的文章this的幫助下開始嘗試矩陣乘法。 我的主要問題是我無法理解如何訪問內核中的2D數組,因爲訪問2D數組與矩陣[i] [j]有點不同。 這是我堅持的部分:瞭解CUDA中的矩陣乘法

for (int i = 0; i < N; i++) { 
    tmpSum += A[ROW * N + i] * B[i * N + COL]; 
} 
C[ROW * N + COL] = tmpSum; 

我能理解行和列是如何得到的。

int ROW = blockIdx.y*blockDim.y+threadIdx.y; 
int COL = blockIdx.x*blockDim.x+threadIdx.x; 

任何與示例的解釋是高度讚賞。謝謝!

+0

在內核的單一循環裝置,每個工作項是做(與1之間排M11平方米的列​​)的點積,以找到'(I,J)'結果矩陣的第i個元素。由於它需要一維數組,因此只能將其作爲堆疊行。這就是爲什麼'ROW * N + i'意味着該行的第ROW行和第i個元素,但這是第一個矩陣。第二個矩陣在這個內核之前似乎沒有被轉置,所以它掃描了一列而不是一行。 –

+0

爲什麼要乘以'ROW * N'和再次'I * N'.這個邏輯似乎很棘手。我無法對其進行可視化@huseyintugrulbuyukisik – uttejh

+0

2D至圖1D表示第一行,然後第二列,接着第三行....然後如果通過N個乘法ROW,選擇ROWth行的第一元件由於N是行長度和1D陣列長度爲N * M,其中M是列高(或者表示每個具有N個元素的M行在1D中依次堆疊)。 –

回答

1

矩陣連續的地址存儲連續的,即前一後的每一行。你在這裏看到的是平面地址,即將兩個元素索引轉換爲與第一個元素的偏移量。