在简单实现编译连接功能的makefile基础上,本节加入一些新的元素,包括两部分改进(makefile符号使用和nvcc命令)。
这次编译的是《GPU高性能编程CUDA实战》第四章的样例代码。
这是要编译的文件:
执行make edit。
这是编译完生成的可执行文件:
这是我这次写的Makefile:
objects=add_loop_cpu add_loop_long add_loop_gpu \
julia_gpu julia_cpu
compiler=nvcc
edit:$(objects)
add_loop_cpu:add_loop_cpu.cu
$(compiler) $< -o $@ --gpu-architecture=compute_50 --gpu-code=sm_50,sm_52
add_loop_gpu:add_loop_gpu.cu
$(compiler) $< -o $@ --gpu-architecture=compute_50 --gpu-code=sm_50,sm_52
add_loop_long:add_loop_long.cu
$(compiler) $< -o $@ --gpu-architecture=compute_50 --gpu-code=sm_50,sm_52
julia_gpu:julia_gpu.cu
nvcc $< -lGL -lglut -o $@ --gpu-architecture=compute_50 --gpu-code=sm_50,sm_52
julia_cpu:julia_cpu.cu
nvcc $< -lGL -lglut -o $@ --gpu-architecture=compute_50 --gpu-code=sm_50,sm_52
#-lGL -lglut:来自于OpenGL
clean:$(objects)
rm $(objects)
.PHONY:clean
对比上一版Makefile,结构基本没有改动,新添加的内容是:
1.可以定义更多的字符串变量,比如,compiler=nvcc,在调用时对应改成$(compiler)即可。之后,可以在Makefile里添加编译器选择的部分。
2.$<表示依赖文件(或文件列表),如果之前依赖文件有很多的话,在编写执行指令处可以用这个代替,make执行时自动替换。
3.$@表示目标文件(或文件列表),同上。
4.nvcc的指令加入了gpu计算架构版本和sm版本,之后还会继续简化。
5.针对第四章julia集编译不过的情况,给出解决方案是在nvcc指令中加入“ -lGL -lglut”选项,还有在 cuComplex( float a, float b ) : r(a), i(b) {}前加上 __device__。