如何将原子添加到CUDA中的阵列的每个元素上

how to apply atomicAdd to each of element of an array in CUDA?

本文关键字:阵列 元素 CUDA 添加      更新时间:2023-10-16

我有一个来自 CUDA示例的代码tomicicAdd a iatomicAdd a单个变量

__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)

替换:

atomicAdd(data[z],1);

atomicAdd(&data[z],1);

如果您仔细看,在第一种情况下,您将指针作为第一个论点()。