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

use*_*829 7 cuda g++ dynamic-linking nvcc static-linking

好吧,我有一个非常令人不安的CUDA 5.0问题,关于如何正确地链接事物.我真的很感激任何帮助!

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

我现在想要获取一个*.cpp文件,并使用g ++或其他方法将其链接到此静态库中的主机代码,但不是nvcc.如果我尝试这个,我会遇到编译错误

对__cudaRegisterLinkedBinary的未定义引用

我正在使用两者-lcuda并且据-lcudart我所知,库的顺序正确(含义-lmylib -lcuda -lcudart).我不认为这是一个问题.也许我错了,但我觉得我错过了一步,我需要对我的静态库(设备链接?)做一些其他事情才能使用g ++.

我错过了至关重要的事吗?这甚至可能吗?

奖金问题:我希望最终结果是一个动态库.我怎样才能做到这一点?

har*_*ism 9

当您与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
Run Code Online (Sandbox Code Playgroud)

在nvcc docUsing Separate Compilation一章中有一个这样的例子.

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

编辑:

要回答下面评论中的问题"有没有办法使用nvcc将mylib.a变成可以放入g ++的东西?"

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

nvcc –arch=sm_35 –dlink mylib.a –o dlink.o
g++ mylib.a dlink.o x.cpp –lcudart
Run Code Online (Sandbox Code Playgroud)