如何在可分离编译后将主机代码链接到静态CUDA库?

如何在可分离编译后将主机代码链接到静态CUDA库?,cuda,g++,static-linking,dynamic-linking,nvcc,Cuda,G++,Static Linking,Dynamic Linking,Nvcc,好吧,我有一个非常麻烦的CUDA 5.0问题,关于如何正确链接。如果有任何帮助,我将不胜感激 使用CUDA 5.0的可分离编译功能,我生成了一个静态库(*.a)。当通过nvcc运行时,它可以很好地与其他*.cu文件链接,我已经这样做过很多次了 现在,我想使用g++或其他工具,而不是nvcc,获取一个*.cpp文件,并将其与这个静态库中的主机代码相链接。如果我尝试这样做,我会得到如下编译器错误 对uuu cudaRegisterLinkedBinary的未定义引用 我正在使用-lcuda和-lcu

好吧,我有一个非常麻烦的CUDA 5.0问题,关于如何正确链接。如果有任何帮助,我将不胜感激

使用CUDA 5.0的可分离编译功能,我生成了一个静态库(*.a)。当通过nvcc运行时,它可以很好地与其他*.cu文件链接,我已经这样做过很多次了

现在,我想使用g++或其他工具,而不是nvcc,获取一个*.cpp文件,并将其与这个静态库中的主机代码相链接。如果我尝试这样做,我会得到如下编译器错误

对uuu cudaRegisterLinkedBinary的未定义引用

我正在使用
-lcuda
-lcudart
,据我所知,这些库的顺序正确(意思是
-lmylib-lcuda-lcudart
)。我不认为这是个问题。也许我错了,但我觉得我错过了一个步骤,我需要对我的静态库做一些其他的事情(设备链接?),然后才能将它与g++一起使用

我是否错过了一些重要的事情?这可能吗


附加问题:我希望最终结果是一个动态库。如何实现这一点?

当您使用nvcc链接时,它会与主机链接一起执行隐式设备链接。如果使用主机编译器进行链接(如使用g++),则需要添加一个显式步骤来使用–dlink选项进行设备链接,例如

nvcc –arch=sm_35 –dc a.cu b.cu
nvcc –arch=sm_35 –dlink a.o b.o –o dlink.o
g++ a.o b.o dlink.o x.cpp –lcudart
在这本书中有一个例子

目前,我们只支持可重定位设备代码的静态库。我们有兴趣了解您希望如何在动态库中使用此类代码。请随时在评论中回答

编辑:

回答下面评论中的问题“是否有任何方法可以使用nvcc将mylib.a转换成可以放入g++的东西?”

只需像对象一样使用库,如下所示:

nvcc –arch=sm_35 –dlink mylib.a –o dlink.o
g++ mylib.a dlink.o x.cpp –lcudart

可以在使用对象的任何位置使用库。那就这么做吧 nvcc–arch=sm_35–dlink mylib.a–o dlink.o
g++mylib.a dlink.o x.cpp–lcudart

我已经试过了,它什么都没做。我使用的实际命令是:g++-pthread-shared-Wl,-O1-Wl,-b符号函数-Wl,-b符号函数-Wl,-z,relro mycpplib.o mycudalib.a-L/usr/local/cuda-5.0/lib64-L/usr/local/cuda-5.0/lib-lmystaticlib-lcuda-lcudart-lcudadevrt-o mylinkedlib.so-我正在尝试为我的cuda库创建一个Python模块。当我尝试导入Python模块时,实际上会发生关于u-cudaRegisterLinkedBinary未定义的错误。实际上,g++编译所有东西都没有抱怨。您需要使用
nvcc
(或
nvlink
)来链接,而不是
g++
g++
不知道如何将设备对象链接在一起。有没有办法将我的静态库作为*.a文件和设备链接到nvcc,然后将任何输出传递给g++以链接到主机代码?我的cpp文件不包含CUDA代码——这里的设备链接正确吗?-只有在使用CUDA动态并行时才需要lcudadevrt。谢谢,我想这就是我一直在探索的方向。现在,唯一的问题是我有一个设备可链接的静态库(mylib.a),而不是单个的*.o文件。很明显,我可以使用ar来提取原始的*.o文件,然后完全按照您所描述的操作。有没有任何方法可以使用nvcc将mylib.a转换成可以放入g++的东西?就像你的第二步,但是用“mylib.a”代替“a.o b.o”。或者我需要使用AR来再次获取对象文件,然后按照您的第二步和第三步来执行?回答您的问题,我正在开发一个C++库,它是由Python来进行主机托管的。Python需要动态库。我使用我已经生成的静态库作为可链接的C++库。我在第一个注释中添加了一个问题的答案。如果这回答了你的问题,请接受/投票。非常感谢你的建议,迈克,我很感激。但是,当我尝试你建议的nvcc命令时,我有一种奇怪的行为。是的,nvcc命令运行并且没有抱怨。然而,当我尝试将新的对象文件放到g++中时,似乎我的所有函数都没有定义。对文件大小的快速检查表明,原始的mylib.A是988K,而设备链接后的对象只有56K。那不可能是对的,知道怎么回事吗?(再次感谢!)