我是並行編程和堆棧溢出的新手。我正在研究使用CUDA的矩陣乘法實現。我使用列順序浮點數組作爲矩陣表示。這是一個CUDA線程同步問題還是別的?
我公司開發的算法是有點獨特,去如下。給定一個n×m矩陣A和一個m×k矩陣B的矩陣,我在每個塊中啓動一個有m個線程的n×k塊。本質上,我爲結果矩陣中的每個條目啓動一個塊,每個線程爲該條目計算一個乘法。例如,
1 0 0 0 1 2
0 1 0 * 3 4 5
0 0 1 6 7 8
爲在所得到的矩陣的第一個條目我將推出每個線程與
線程0計算1 * 3 線程1計算0 * 0 螺紋2計算0 * 1
每個線程添加到0初始化矩陣。 現在,我沒有得到正確的答案。我得到這個一遍又一遍
0 0 2
0 0 5
0 0 8
我的核心功能如下。這可能是一個線程同步的問題,或者我搞砸了數組索引或什麼?
/*@param d_A: Column order matrix
*@param d_B: Column order matrix
*@param d_result: 0-initialized matrix that kernels write to
*@param dim_A: dimensionality of A (number of rows)
*@param dim_B: dimensionality of B (number of rows)
*/
__global__ void dot(float *d_A, float *d_B, float *d_result, int dim_A, int dim_B) {
int n = blockIdx.x;
int k = blockIdx.y;
int m = threadIdx.x;
float a = d_A[(m * dim_A) + n];
float b = d_B[(k * dim_B) + m];
//d_result[(k * dim_A) + n] += (a * b);
syncthreads();
float temp = d_result[(k*dim_A) + n];
syncthreads();
temp = temp + (a * b);
syncthreads();
d_result[(k*dim_A) + n] = temp;
syncthreads();
}
在'd_result [(K * dim_A)+ N] =溫度;'塊中的每個線程被寫入到相同的位置蓋寫對方引起的。 – RoBiK