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

8

好的,我有一个关于如何正确链接事物的CUDA 5.0问题,涉及内容和编程。如果可以提供任何帮助,我将非常感激!

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

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

undefined reference to __cudaRegisterLinkedBinary

我同时使用了-lcuda-lcudart,并且据我所知,以正确的顺序包含了库(即-lmylib -lcuda -lcudart)。我不认为这是一个问题。也许我错了,但我觉得我漏掉了一步,需要对我的静态库进行其他操作(设备链接?),然后才能在g++中使用它。

我错过了什么重要的东西吗?这可能吗?

额外的问题:我希望最终结果是一个动态库。我该怎么做?


1
我已经尝试过了,但没有任何效果。我正在使用的实际命令是:g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -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模块。 - user2333829
请看这个链接:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#using-separate-compilation-in-cuda - Jared Hoberock
Jared的说法是不正确的,实际上你可以使用g++进行链接,文档中有解释。请看下面的回答。 - harrism
1
只有在使用CUDA动态并行性时才需要-lcudadevrt。 - harrism
如果这些解决方案都不起作用,我发现在使用CMake时将CUDA_RESOLVE_DEVICE_SYMBOLS设置为ON可以解决问题。 - JAustin
显示剩余3条评论
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文档中的使用独立编译章节提供了一个确切的示例。

目前我们仅支持静态库用于可重定位设备代码。我们很想知道您如何希望在动态库中使用这样的代码。请在评论中自由回答。

编辑:

回答以下评论中的问题“有没有办法使用nvcc将mylib.a转换为可以放入g ++中的内容?”

只需要像使用对象一样使用库,就像这样:

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

0

无论在何处使用对象,您都可以使用库。因此,只需执行以下操作: nvcc –arch=sm_35 –dlink mylib.a –o dlink.o g++ mylib.a dlink.o x.cpp –lcudart


1
非常感谢你的建议,Mike,我很感激。但是,当我尝试你提出的nvcc命令时,我遇到了奇怪的行为。是的,nvcc命令运行并且没有抱怨。然而,当我尝试通过g++放置新的目标文件时,似乎我的所有函数都未定义。快速检查文件大小显示原始的mylib.a为988K,而设备链接后的对象仅为56K。这肯定不对,有什么想法吗?(再次感谢!) - user2333829

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接