我有一个代码从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)
答案 0 :(得分:7)
取代:
atomicAdd(data[z],1);
带
atomicAdd(&data[z],1);
如果仔细观察,在第一种情况下,你给指针作为atomicAdd()的第一个参数。