2013-05-30 215 views
0

這是我的矩陣乘法的代碼,但是當我運行它時,第一行得到正確的結果,第二和第三(大部分是負數)得到的結果是錯誤的。這是我的第一個程序,所以我使用了一些我在網上找到的代碼Cuda矩陣乘法錯誤結果

#include <iostream> 

__global__ void MnozenjeMatrica(int* d_c, int* d_a, int* d_b) 
{ 
int row = blockIdx.y * blockDim.y + threadIdx.y; 
int col = blockIdx.x * blockDim.x + threadIdx.x;  

int d = 0; 
for(int i=0; i<3; i++) 
{ 
    int x = d_a[row * 3 + i]; 
    int y = d_b[i * 3 + col]; 
    d += x * y; 
} 

d_c[row * 3 + col] = d; 
} 

int main() 
{ 
const int SIZE = 9 * sizeof(int); 

int a[3][3] = {{2, 4, 6}, {1, 3, 5}, {8, 4, 1}}; 
int b[3][3] = {{5, 8, 34}, {5, 7, 5}, {1, 4, 31}}; 
int c[3][3] = {{5, 8, 34}, {5, 7, 5}, {1, 4, 31}}; 

int* d_a; 
int* d_b; 
int* d_c; 

cudaMalloc((void**) &d_a, SIZE); 
cudaMalloc((void**) &d_b, SIZE); 
cudaMalloc((void**) &d_c, SIZE); 

cudaMemcpy(d_a, a, SIZE, cudaMemcpyHostToDevice); 
cudaMemcpy(d_b, b, SIZE, cudaMemcpyHostToDevice); 

MnozenjeMatrica<<<3, 3>>>(d_c, d_a, d_b); 
cudaMemcpy(c, d_c, SIZE, cudaMemcpyDeviceToHost); 

for(int i=0; i<3; i++) 
{ 
    for(int j=0; j<3; j++) 
    { 
     printf("%d\t", c[i][j]); 
    } 
    printf("\n"); 
} 


} 
+2

您還沒有在這裏提問。 – talonmies

+0

以及我需要解決的錯誤,以獲得所有結果正確:) –

+0

而且我需要一個理髮和三明治。這並不意味着我有一個有效的堆棧溢出問題。而且,看起來,你呢。這裏的問題旨在用於其他誰將來來。 「我的代碼不起作用,請幫我修復」很少屬於這一類。 – talonmies

回答

1

完全同意@talonmies。

更多作品:

  • 有很多誰也發佈了關於CUDA 矩陣乘法問題的人,你不妨來看看其中的一些來獲得 一些想法。
  • 你沒有做任何cuda error checking內核 電話和CUDA通話(但建議)
  • 你可以嘗試用cuda-memcheck運行你的代碼,看看它說。
  • 你可以用幾個選擇printf語句很快地調試這個內核。畢竟這主要是C代碼,您應該考慮使用基本的C故障排除技術。

因爲我能夠迅速發現這一點,我可以告訴你,你的內核是根據一個2-d threadblock結構做任何有用的東西:

int row = blockIdx.y * blockDim.y + threadIdx.y; 
int col = blockIdx.x * blockDim.x + threadIdx.x; 

但你正在推出一個一維網格1D線程塊:

MnozenjeMatrica<<<3, 3>>>(d_c, d_a, d_b); 
       ^^ 
        | 1-D threadblock (3 threads) 
        1-D grid (3 blocks) 

所以我並不感到驚訝,它只適用於單排。