cuda原子性操作代码编译问题 error: identifier "atomicAdd" is undefined


这次遇到的问题是,编译原子性代码出错。

代码是《GPU高性能编程cuda实践》第9章的hist_gpu_gmem_atomics.cuhist_gpu_shmem_atomics.cu


这次还是用原有sdk带有makefile修改来编译。

出现

"/usr/local/cuda-5.5"/bin/nvcc-ccbin g++ -I../../../common/inc -m32 -gencodearch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20-gencode arch=compute_30,code=sm_30 -gencodearch=compute_35,code=\"sm_35,compute_35\" -o exe.o -chist_gpu_shmem_atomics.cu

error:identifier "atomicAdd" is undefined


分析:书中提到,原子性操作在低端的计算能力GPU是不支持的,

1.1以上的计算能力才支持全局内存的原子操作,

1.2以上的计算能力才支持共享内存的原子操作。

我观察到了makefilenvvc的编译命令有-gencodearch=compute_10,code=sm_10

感觉不靠谱,于是改了一下。

GENCODE_FLAGS := $(GENCODE_SM10) $(GENCODE_SM20) $(GENCODE_SM30)

改为

GENCODE_FLAGS := $(GENCODE_SM20) $(GENCODE_SM30)

#$(GENCODE_SM10)

就是把(GENCODE_SM10)选项去掉


再次编译,貌似没事。

运行,出问题了。输出不正常阿。


搞了很久,猜测一下,把GENCODE_SM10改为GENCODE_SM12就可以了。

makefile的主要修改如下

#CUDA code generation flags

ifneq($(OS_ARCH),armv7l)

GENCODE_SM12 := -gencode arch=compute_12,code=sm_12

endif

GENCODE_SM20 := -gencode arch=compute_20,code=sm_20

GENCODE_SM30 := -gencode arch=compute_30,code=sm_30 -gencodearch=compute_35,code=\"sm_35,compute_35\"

GENCODE_FLAGS := $(GENCODE_SM12) $(GENCODE_SM20) $(GENCODE_SM30)


我知道我机器GPUComputecapability: 1.2

所以这样改。但具体原因不知道。

目前只能这样理解:编译参数如果跟机器属性不符,有可能会出错。

不过还好,再次对cuda的编译有了更深入的理解。


你可能感兴趣的:(CUDA,高性能,编译,makefile,GPU)