【问题标题】:How to link host code with a static CUDA library after separable compilation?可分离编译后如何将主机代码与静态 CUDA 库链接?
【发布时间】:2013-04-23 17:39:06
【问题描述】:

好的,关于如何正确链接事物,我有一个非常令人不安的 CUDA 5.0 问题。如果能提供任何帮助,我将不胜感激!

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

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

的编译器错误

对 __cudaRegisterLinkedBinary 的未定义引用

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

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

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

【问题讨论】:

  • 我已经尝试过了,它没有做任何事情。我使用的实际命令是: 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 模块。
  • 当我尝试导入 Python 模块时,实际上发生了关于 __cudaRegisterLinkedBinary 未定义的错误。 g++ 确实编译了所有内容而没有抱怨。
  • 您需要使用nvcc(或nvlink)链接,而不是g++g++ 不知道如何将设备对象链接在一起。
  • 有没有办法将我的静态库作为 *.a 文件并将其与 nvcc 设备链接,然后将其输出传递给 g++ 以与主机代码链接?我的 cpp 文件不包含 CUDA 代码——设备在这里链接正确的东西吗?
  • -lcudadevrt 仅在您使用 CUDA 动态并行时才需要。

标签: cuda g++ static-linking dynamic-linking nvcc


【解决方案1】:

当您与 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

Using Separate Compilation chapter of the nvcc doc 中有一个完全这样的例子。

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

编辑:

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

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

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

【讨论】:

    【解决方案2】:

    您可以在任何使用对象的地方使用库。所以就这样做 nvcc –arch=sm_35 –dlink mylib.a –o dlink.o g++ mylib.a dlink.o x.cpp –lcudart

    【讨论】:

    • 非常感谢您的建议,迈克,非常感谢。但是,当我完全尝试您提出的 nvcc 命令时,我的行为很奇怪。是的,nvcc 命令运行并且没有抱怨。但是,当我尝试通过 g++ 放置新的目标文件时,似乎我的所有函数都未定义。快速查看文件大小显示原始 mylib.a 为 988K,而设备链接后的对象仅为 56K。这不可能是正确的,知道发生了什么吗? (再次感谢!)
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多