如何在CUDA中将atomicAdd应用于数组的每个元素?

时间:2014-02-03 04:11:57

标签: c++ cuda

我有一个代码从CUDA示例到atomicAdd单个变量

__global__ void myadd(int *data)
{
  unsigned int x = blockIdx.x;
  unsigned int y = threadIdx.x;
  if ( (x%2==0) && (y%2==1) ) atomicAdd(data,1);
}

int main(void)
{
  int *Hdt;
  Hdt = (int*)malloc(sizeof(int));
  // ... CUDA initialization here
  myadd<<<20, 10>>>(Hdt);
  cudaFree(Hdt);
}

对我有用。但我正在扩展我的代码,所以我想将数组而不是数字传递给内核

__global__ void myadd(int *data)
{
  unsigned int x = blockIdx.x;
  unsigned int y = threadIdx.x;
  unsigned int z = threadIdx.y;
  if ( (x%2==0) && (y%2==1) && (z>4) ) atomicAdd(data[z],1);
}

int main(void)
{
  int *Hdt;
  Hdt = (int*)malloc(sizeof(20*int));
  // ... CUDA initialization here
  myadd<<<20, dim3(10, 20)>>>(Hdt);
  cudaFree(Hdt);
}

但是它没有编译,错误信息是:

  

错误:没有重载函数“atomicAdd”匹配的实例   参数列表参数类型为:(int,int)

1 个答案:

答案 0 :(得分:7)

取代:

atomicAdd(data[z],1);

atomicAdd(&data[z],1);

如果仔细观察,在第一种情况下,你给指针作为atomicAdd()的第一个参数。