Separate compilation
目的
请注意这里讨论的重要前提是你知道编译分为两个大阶段: 编译和链接,想要了解更多参见文章链接库资料收集
1. 解决编译连接问题
– 当你有个编译目标(.a/.so/runfile), 这个目标依赖(a.cpp, b.cu, c.cu),
– 你想让gcc编译a.cpp->a.o
– 让nvcc编译b.cu->b.o和c.cu->c.o
– 最后把a.o b.o c.o
链接成一个foo.a/foo.so/foo
2. 加快编译速度.
– Separate compilation可以加快编译速度.
3. 你为啥要用gcc
– 可能你正在移植一个工程.
– 可能你需要gcc的一些奇怪的编译选项,nvcc不支持.
注意事项
- cmake对cuda的支持看似很好,其实一直有很多bug, 所以请谨慎使用
Separate compilation
这样的选项, 我把我的踩坑记录写在cuda+cmake动态链接库编译和问题收录中,有必要可以看. - 只有上述case下,你才需要Separate compilation.
- 注意这种case其实很少, 比如你需要把整个cuda工程编译成.so,然后把.so给别人用,那其实你是不需要Separate compilation的,因为你整个.so都可以由nvcc编译.
- Separate compilation会让代码运行变慢,因为nvcc知道的信息少了,有些优化可能做不了.
步骤
简单的下文中[2]中的例子贴出来, 要详细了解,建议看下面的资料
#ordinary rdc compilation of CUDA source
nvcc -ccbin g++ -m64 -arch=sm_30 -dc -o a.o -c a.cu
#separate device link step, necessary for rdc flow
nvcc -ccbin g++ -m64 -arch=sm_30 -dlink -o a.dlink.o a.o
#creation of library - note we need ordinary linkable object and device-link object!
nvcc -ccbin g++ -m64 -arch=sm_30 -lib -o a.a a.o a.dlink.o
#host code compilation
g++ -m64 -o b.o -c b.cpp
#host (final) link phase - the order of entries on this line is important!!
g++ -m64 b.o a.a -o test -L/usr/local/cuda/lib64 -lcudart
近期评论