2012-04-26 27 views
2

私は行列乗算のコードをcudaに書き込もうとしています。これはNvidiaのcudaプログラミングガイドによく似ていますが、動作しません。 C = alpha * A * B + beta * Cとされていますが、すべてのAに対してB Cは変わりません。Cuda行列の乗算

__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

あなたの質問は何ですか? (ヒント "My code is not working"は問題ではない)そのコードに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); " 

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

を変更しようと