2012-04-26 14 views
2

나는 cuda에 행렬 곱셈 코드를 쓰려고하는데, 이것은 Nvidia의 cuda 프로그래밍 가이드와 매우 유사하지만 작동하지 않습니다. C = alpha * A * B + beta * C로 가정되어 지지만 모든 A에 대해 B C는 변하지 않습니다.Cuda matrix multiplication

__global__ void MatMulKernel(int m,int n,int k,double *A,double *B,double *C,double alpha,double beta) 
{ 
    double Ctemp = 0.0; 
    int row = blockIdx.y * blockDim.y + threadIdx.y; 
    int col = blockIdx.x * blockDim.x + threadIdx.x; 
    int ind; 
    for (ind = 0; ind < k; ++ind) 
    { 
     Ctemp += A[row+ind*m]*B[ind+col*k]; 
    } 

    C[row+m*col] = alpha*Ctemp+beta*C[row+m*col]; 
//C[row+m*col] = Ctemp; 
    __syncthreads(); 
} 

extern "C" void 
local_mm_cuda (const int m, const int n, const int k, const double alpha, 
    const double *A, const int lda, const double *B, const int ldb, 
    const double beta, double *C, const int ldc) 
{ 

int row, col; 

    /* Verify the sizes of lda, ldb, and ldc */ 
    assert (lda >= m); 
    assert (ldb >= k); 
    assert (ldc >= m); 

    // allocating memory for device array 
    double *dA,*dB,*dC; 
    size_t sizeA = sizeof(double)*m*k; 
    size_t sizeB = sizeof(double)*n*k; 
    size_t sizeC = sizeof(double)*m*n; 

    cudaMalloc((void**)&dA,sizeA); 
    cudaMalloc((void**)&dB,sizeB); 
    cudaMalloc((void**)&dC,sizeC); 

    cudaMemcpy(dA, A, sizeA, cudaMemcpyHostToDevice); 
    cudaMemcpy(dB, B, sizeB, cudaMemcpyHostToDevice); 
    cudaMemcpy(dC, C, sizeC, cudaMemcpyHostToDevice); 

    // calling matrix multiplication kernal 
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE); 
    dim3 dimGrid(n/dimBlock.x, m/dimBlock.y); 
    MatMulKernel<<<dimGrid, dimBlock>>>(m,n,k,dA,dB,dC,alpha,beta); 
    cudaThreadSynchronize(); 

    // saving C calculated back in C 
    cudaMemcpy(dC,C, sizeC,cudaMemcpyDeviceToHost); 
    cudaFree(dA); 
    cudaFree(dB); 
    cudaFree(dC); 
} 
+2

질문은 무엇에

"dim3 dimGrid(n/dimBlock.x, m/dimBlock.y);" 

를 수정하려면? (힌트 "내 코드가 작동하지 않습니다"는 질문이 아닙니다.) 해당 코드에 12 개의 API 호출이 있으며 모두 상태를 반환하고 모든 것이 오류인지 여부를 확인해야합니다. 또한 코드는 배정 밀도입니다. 배정 밀도를 지원하는 장치에서 컴파일하고 실행하고 있습니까? – talonmies

+0

나는 명백한 것이 빠져 있는지 궁금합니다. 나는 Tesla M2090 "Fermi"gpu를 컴파일 중입니다. – zimbra314

+7

명백한 오류가 있습니다. 오류 검사. 증상은 커널이 실행되지 않는 것과 일치하지만 코드가 API 오류를 확인하지 않기 때문에 알 수있는 방법이 없습니다. – talonmies

답변

4

봅니다

"dim3 dimGrid((n+dimBlock.x-1)/dimBlock.x, (m+dimBlock.y-1)/dimBlock.y); "