2013-06-27 54 views
0

我是並行編程和堆棧溢出的新手。我正在研究使用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(); 
    } 
+0

在'd_result [(K * dim_A)+ N] =溫度;'塊中的每個線程被寫入到相同的位置蓋寫對方引起的。 – RoBiK

回答

1

使用syncthreads()的整個想法是錯誤在這種情況下。此API調用的範圍爲

1. syncthreads(); 
    2. float temp = d_result[(k*dim_A) + n]; 
    3. syncthreads(); 
    4. temp = temp + (a * b); 
    5. syncthreads(); 
    6. d_result[(k*dim_A) + n] = temp; 
    7. syncthreads(); 

局部變量float temp;具有線程範圍,並且使用此同步障礙是沒有意義的。 指針d_result是全局內存指針,使用這個同步障礙也是沒有意義的。請注意,還沒有可用(可能永遠不可用)全局同步線程的障礙。

當共享存儲器被用於計算通常是必需的syncthreads()用法。在這種情況下,您可能需要使用共享內存。 Here你可以看到如何正確地使用共享內存和syncthreads()的例子。 Here你有共享存儲器矩陣乘法的一個例子。