【发布时间】:2014-02-03 04:11:56
【问题描述】:
我有一个来自CUDA 示例的代码到 atomic 添加单个变量
__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)
【问题讨论】:
-
本题与CUDA或
atomicAdd无关。这是关于了解基本数组和函数在 C++ 中的工作原理。 -
据我了解,这里不需要 atomicAdd,因为每个线程都访问不同的内存位置(data[z] 中的 z)——它们不可能同时写入同一个内存位置。跨度>