2013-11-28 72 views
0

我在一個小矩陣上嘗試了庫函數Cublas_Dgemm(),但它沒有給我我所期望的。Cublas_Dgemm()不給我我期望的

所以我聲明,並以下列方式初始化矩陣:

double alpha = 1.0, beta = 0.0; 
    double * sa = (double *)malloc(6*sizeof(double)); 
    double * sb = (double *)malloc(6*sizeof(double)); 
    double * sc = (double *)malloc(4*sizeof(double)); 

    for(a = 0; a<2; a++) 
      for (b = 0; b < 3; b++){ 
        sa[a*3+b] = a+b+1.0; 
        sb[a*3+b] = a+b+1.0;} 

只是爲了記錄在案,我也試過

for(a = 0; a<2; a++) 
    for (b = 0; b < 3; b++){ 
     sa[IDX2F(a, b)] = a+b+1.0; 
     sb[IDX2F(a, b)] = a+b+1.0;} 

其中

#define IDX2C(i,j,ld) (((j)*(ld))+(i)) 

這給了我:

SA:

1.00 2.00 3.00
3.00 2.00 3.00

SB:

1.00 2.00
3.00 2.00
3.00 4.00

然後我在GPU上分配內存如下:

double *dsa, *dsb, *dsc; 
    cudaMalloc((void **) &dsa, 6*sizeof(*sa)); 
    cudaMalloc((void **) &dsb, 6*sizeof(*sb)); 
    cudaMalloc((void **) &dsc, 4*sizeof(*sc)); 

    cublasSetMatrix(2, 3, sizeof(*sa), sa, 2, dsa, 2); 
    cublasSetMatrix(3, 2, sizeof(*sb), sb, 3, dsb, 3); 

    cublasDgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, 2, 2, 3, &alpha, dsa, 2, dsb, 3, &beta, dsc, 2); 

    cublasGetMatrix(2, 2, sizeof(*sc), dsc, 2, sc, 2); 

但是,當我打印矩陣SC,我

SC:

16.00 18.00
23.00 26.00

當它應該是(根據MATLAB):

16.00 18.00
18.00 22.00

我不確定爲什麼我得到這個錯誤的答案,有人會發現我犯的一個可能的錯誤嗎?多謝!

+1

除了@Robert Crovella的答案,考慮到你在問題中報告的'sa'值是不正確的(可能是一個錯字)。根據初始化循環,它們與「sb」相同,都是正確的。 – pQB

回答

2

我會建議做所有的cublas調用適當的錯誤檢查。

你得到的結果是因爲cublas希望給它的矩陣在column-major order。您期望的結果對於行主矩陣是正確的(並且注意@pQB關於設置代碼中的錯誤所說的內容)。

此外,您可以將行主要有序數據直接傳遞給cublas並獲得明智的結果,如果你modify the calling setup.

+0

嗨,我忘了提及我試圖初始化我的陣列使用IDX2F和IDX2C,但它似乎也沒有工作。無論如何,我可以按專欄順序宣佈我的矩陣嗎? –

+0

其實我錯過了@pQB指出的錯誤。我相信這實際上是你混亂的根源。 16,18,23,26是矩陣乘法的正確值。唯一的另一個因素是它們的排列順序,這可能會在行 - 專業和專業專業之間變化。 –