8

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

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

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

对 __cudaRegisterLinkedBinary 的未定义引用

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

我错过了什么重要的事情吗?这甚至可能吗?

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

4

2 回答 2

11

当您与 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 doc 的 Using Independent Compilation 一章中有一个完全这样的例子。

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

编辑:

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

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

nvcc –arch=sm_35 –dlink mylib.a –o dlink.o
g++ mylib.a dlink.o x.cpp –lcudart
于 2013-04-30T23:01:45.407 回答
0

您可以在任何使用对象的地方使用库。所以只需执行 nvcc –arch=sm_35 –dlink mylib.a –o dlink.o g++ mylib.a dlink.o x.cpp –lcudart

于 2013-05-02T20:41:24.663 回答