2012-05-15 4 views
1

행렬 조작을위한 다음 커널 코드가 있습니다. 행렬 A = 1 * 3 및 행렬 B = 3 * 3 결과 행렬 C는 1 * 3이됩니다.CUDA를 사용한 행렬 곱셈 - 잘못된 결과

int block_size = 32; 
dim3 dimGrid(Width/block_size, Width/block_size); 
dim3 dimBlock(block_size, block size); 
MatrixMulKernel<<<dimGrid, dimBlock>>>(d_M, d_N, d_P,3); 

을 다음하지만 잘못된 결과를 얻고으로 다음 코드에서는 폭은 3

__global__void MatrixMulKernel(float* d_M,float* d_N,float* d_P,int Width) { 
    int row = blockIdx.y * blockDim.y + threadIdx.y; 
    int col = blockIdx.x * blockDim.x + threadIdx.x; 
    if(row>=Width || col>=Width){ // matrix range 
     return; 
    } 
    float P_val = 0.0f; 
    for (int k = 0; k < Width; ++k) { 
    float M_elem = d_M[row * Width + k]; 
    float N_elem = d_N[k * Width + col]; 
    P_val += M_elem * N_elem; 
    } 
d_p[row*Width+col] = P_val; 
} 

I 커널 코드가 호출 될 것이다. 결과가 항상 0으로 표시됩니다. 누구든지 나를 도울 수 있습니까.

답변

2

코드보기는 동일한 크기의 2 제곱 매트릭스의 곱셈에 적합합니다.

너비는 첫 번째 행렬의 열 수입니다.

함수의 인수로 제공해야합니다.

+0

감사합니다. 네, 실제로 그것은 정사각형 매트릭스입니다. 그래서 block size 32는 width = 300에서 제대로 작동하지 않을 것입니다. 완전히 나눌 수 없기 때문입니다. 따라서이 경우 나머지 스레드를 수용하기 위해 1 개의 추가 블록을 추가합니다. 그게 맞습니까? – user1390802

+0

그렇습니다. 너비가 32의 배수가 아니면 여분의 블록을 추가해야합니다.하지만 변수 행과 열이 행렬 범위 안에 있음을 커널에서 확인하십시오. '경우 (행> = 폭 || COL> = 폭) 수익을,' – sgarizvi

+0

하지만 행렬의 크기를 변경할 때 나에게 잘못된 결과를 제공합니다 : 이는 커널 내에서 다음과 같이 수행 할 수 있습니다. 어떤 생각이 잘못 되었습니까? – user1390802