2013-05-30 5 views
0

이것은 행렬 곱셈에 대한 내 코드이지만 첫 번째 행에는 올바른 결과가 나오지만 두 번째와 세 번째 (주로 큰 음수)에는 잘못된 결과가 발생합니다. 이것은 내 첫 번째 programm에 그래서 나는 완전히 @talonmies에 동의 순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

에서 발견 된 일부 코드를 사용합니다.

추가 제안 :

  • CUDA 행렬 곱셈에 대한 질문을 게시 한 사람의 많음이있다, 당신은 몇 가지 아이디어를 얻기 위해 그 중 몇 가지를 살펴 걸릴 수 있습니다.
  • 당신은
  • 당신은 cuda-memcheck으로 코드를 실행하려고하고 말하는 볼 수있는 cuda error checking 커널에 통화 및 CUDA 호출을 수행하지 않는 (그러나 그것은 권장).
  • printf 문을 사용하여이 커널을 매우 빠르게 디버깅 할 수 있습니다. 결국 C 코드가 대부분이므로 기본적인 C 문제 해결 기술을 사용해야합니다.

나는 빨리이 자리 할 수 ​​있었다 때문에, 당신의 커널이 아무것도 유용 할 수있는 2-D의 threadblock 구조에 따라되었음을 알 수 있습니다 :

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

을하지만 1 차원 격자를 출시하고 1D threadblocks의 :

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

그래서 나는 단지 하나의 행에 대해 작동 놀라지 아니에요.