我的 kernel.cu 类有问题
调用nvcc -v kernel.cu -o kernel.o
我收到此错误:
kernel.cu(17): error: identifier "atomicAdd" is undefined
我的代码:
#include "dot.h"
#include <cuda.h>
#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
(默认架构是不支持原子学的 1.0)。尝试:
nvcc -arch=sm_11 -v kernel.cu -o kernel.o
看看会发生什么。
在 2015 年编辑以注意 CUDA 7.0 中的默认架构现在是 2.0,它支持原子内存操作,因此这在较新的工具包版本中应该不是问题。
今天,使用最新的 cuda SDK 和工具包,此解决方案将不起作用。人们还说,添加:
compute_11,sm_11; OR compute_12,sm_12; OR compute_13,sm_13;
compute_20,sm_20;
compute_30,sm_30;
到 CUDA 在 Visual Studio 2010 中的项目属性中将起作用。 其实不然。
您必须在 .cu 文件本身自己的属性中为其指定此项(在 C++/CUDA->设备>代码生成)选项卡下,例如:
compute_13,sm_13;
compute_20,sm_20;
compute_30,sm_30;