在CUDA内核操作中添加Atomic的一些问题

我的kernel.cu类有问题

调用nvcc -v kernel.cu -o kernel.o我收到此错误:

 kernel.cu(17): error: identifier "atomicAdd" is undefined 

我的代码:

 #include "dot.h" #include  #include "device_functions.h" //might call atomicAdd __global__ void dot (int *a, int *b, int *c){ __shared__ int temp[THREADS_PER_BLOCK]; int index = threadIdx.x + blockIdx.x * blockDim.x; temp[threadIdx.x] = a[index] * b[index]; __syncthreads(); if( 0 == threadIdx.x ){ int sum = 0; for( int i = 0; i<THREADS_PER_BLOCK; i++) sum += temp[i]; atomicAdd(c, sum); } } 

有人建议?

您需要为nvcc指定一个支持primefaces内存操作的体系结构(默认体系结构为1.0,不支持primefaces)。 尝试:

 nvcc -arch=sm_11 -v kernel.cu -o kernel.o 

看看会发生什么。


编辑在2015年注意到CUDA 7.0中的默认架构现在是2.0,它支持primefaces内存操作,因此在新的工具包版本中这不应该是一个问题。

今天使用最新的cuda SDK和工具包,这个解决方案将无法运行。 人们还说添加:

 compute_11,sm_11; OR compute_12,sm_12; OR compute_13,sm_13; compute_20,sm_20; compute_30,sm_30; 

Visual Studio 2010中的项目属性中的CUDA将起作用。 它没有。

您必须在.cu文件本身的自己的属性(在C ++ / CUDA->设备 – >代码生成)选项卡中指定此项,例如:

 compute_13,sm_13; compute_20,sm_20; compute_30,sm_30;