Cuda矩阵乘法

Cuda矩阵乘法,cuda,matrix-multiplication,Cuda,Matrix Multiplication,我正在尝试用cuda编写一个矩阵乘法代码,它与Nvidia的cuda编程指南非常相似,但它不起作用。它应该做C=alpha*A*B+beta*C,但对于每个A,bc保持不变 __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 * blockDi

我正在尝试用cuda编写一个矩阵乘法代码,它与Nvidia的cuda编程指南非常相似,但它不起作用。它应该做C=alpha*A*B+beta*C,但对于每个A,bc保持不变

__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);
}
\uuuu全局\uuuuu无效MatMulKernel(int m,int n,int k,double*A,double*B,double*C,double alpha,double beta)
{
双Ctemp=0.0;
int row=blockIdx.y*blockDim.y+threadIdx.y;
int col=blockIdx.x*blockDim.x+threadIdx.x;
int ind;
对于(ind=0;ind=m);
断言(ldb>=k);
断言(ldc>=m);
//为设备阵列分配内存
双*dA,*dB,*dC;
尺寸=尺寸(双)*m*k;
尺寸b=尺寸f(双)*n*k;
尺寸=尺寸(双)*m*n;
Cudamaloc((void**)和dA,sizeA);
Cudamaloc((void**)和dB,sizeB);
Cudamaloc((void**)和dC,sizeC);
cudaMemcpy(dA、A、sizeA、cudaMemcpyHostToDevice);
cudaMemcpy(dB、B、sizeB、cudaMemcpyHostToDevice);
cudaMemcpy(dC、C、sizeC、cudaMemcpyHostToDevice);
//调用矩阵乘法核
dim3 dimBlock(块大小,块大小);
dim3 dimGrid(n/dimBlock.x,m/dimBlock.y);
MatMulKernel(m,n,k,dA,dB,dC,alpha,beta);
cudaThreadSynchronize();
//保存在C中重新计算的C
cudaMemcpy(dC、C、sizeC、cudaMemcpyDeviceToHost);
库达弗里(dA);
cudaFree(dB);
库达弗里(dC);
}
尝试修改

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

尝试修改

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


你的问题是什么?(提示“我的代码不工作”不是问题)您在该代码中有12个API调用,所有调用都返回一个状态,您应该检查每个调用是否返回错误。而且你的代码是双精度的。您是否为支持双精度的设备编译和运行?我想知道是否遗漏了任何明显的内容。我正在为特斯拉M2090“费米”gpuYou编译一些明显的东西-错误检查。您的症状与从未运行的内核一致,但您无法知道,因为您的代码没有检查API错误。@Talonmes是的,问题是内核没有运行。我在不同的系统上运行,运行正常。谢谢你的问题是什么?(提示“我的代码不工作”不是问题)您在该代码中有12个API调用,所有调用都返回一个状态,您应该检查每个调用是否返回错误。而且你的代码是双精度的。您是否为支持双精度的设备编译和运行?我想知道是否遗漏了任何明显的内容。我正在为特斯拉M2090“费米”gpuYou编译一些明显的东西-错误检查。您的症状与从未运行的内核一致,但您无法知道,因为您的代码没有检查API错误。@Talonmes是的,问题是内核没有运行。我在不同的系统上运行,运行正常。谢谢