这次遇到的问题是,编译原子性代码出错。
代码是《GPU高性能编程cuda实践》第9章的hist_gpu_gmem_atomics.cu和hist_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以上的计算能力才支持共享内存的原子操作。
我观察到了makefile的nvvc的编译命令有-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)
我知道我机器GPU的Computecapability: 1.2,
所以这样改。但具体原因不知道。
目前只能这样理解:编译参数如果跟机器属性不符,有可能会出错。
不过还好,再次对cuda的编译有了更深入的理解。