【发布时间】: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