我是CUDA的新手。我对一个简单的程序有疑问,希望有人能注意到我的错误。

__global__ void ADD(float* A, float* B, float* C)
{
   const int ix = blockDim.x * blockIdx.x + threadIdx.x;
   const int iy = blockDim.y * blockIdx.y + threadIdx.y;

   if(ix < 16 && iy < 16)
   {
      for(int i = 0; i<256; i++)
      C[i] = A[ix+iy*16] + B[ix+iy*16] + C[i]; // << I wish to store all in C
   }
}

extern "C" void cuda_p(float* A, float* B, float* C)
{
    float* dev_A;
    float* dev_B;
    float* dev_C;
    cudaMalloc((void**) &dev_A,  sizeof(float) * 256);
    cudaMalloc((void**) &dev_B,  sizeof(float) * 256);
    cudaMalloc((void**) &dev_C,  sizeof(float) * 256);
    cudaMemcpy(dev_A, A, sizeof(float) * 256, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_B, B, sizeof(float) * 256, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_C, C, sizeof(float) * 256, cudaMemcpyHostToDevice);
    ADDD<<<16,16>>>(dev_A,dev_B,dev_C);
    cudaMemcpy(A, dev_A, sizeof(float) * 256, cudaMemcpyDeviceToHost);
    cudaMemcpy(B, dev_B, sizeof(float) * 256, cudaMemcpyDeviceToHost);
    cudaMemcpy(C, dev_C, sizeof(float) * 256, cudaMemcpyDeviceToHost);
 cudaFree(dev_A);
 cudaFree(dev_B);
 cudaFree(dev_C);
}

最佳答案

  • 您确定内核启动配置吗?在您的代码中,您尝试启动一些未知函数ADDD。您的执行配置为:gridDim =(16,0,0)和blockDim =(16,0,0)。因此,在您的内核中,blockIdx.x = [0..16)和threadIdx.x = [0..16)。如果我没听错的话
    ix = threadIdx.x;iy = blockIdx.x;
    在《 CUDA编程指南》(附录B.15)中阅读相关内容。
  • 但这不仅是一个错误。当您在C[i]中累积值时,您就有竞争条件。 16个线程(1个经线)同时读取C[i],添加一些值(A[ix+iy*16] + B[ix+iy*16])并将结果写回到C[i]。您应该使用原子加法操作(CUDA编程指南,附录B.11.1.1)或重新设计内核以最大化内存合并(CUDA C最佳实践指南3.2.1),因为原子非常非常慢...
  • 10-04 14:28
    查看更多