【发布时间】:2014-07-11 13:18:43
【问题描述】:
是否可以使用 nvcc 将 GPU 的 (C++) 代码编译成共享对象(.so 文件)并从 C++ 程序动态加载它(在这种情况下,Cern 的 ROOT,本质上是 @987654322 @ ("CINT"))。
我想运行的一个简单示例是:
extern "C"
void TestCompiled() {
printf("test\n");
exit(0);
}
这段代码是用nvcc --compiler-options '-fPIC' -o TestCompiled_C.so --shared TestCompiled.cu 编译的。将共享对象加载到 ROOT 中:
{ // Test.C program
int error, check;
check = gROOT->LoadMacro("TestCompiled_C.so", &error);
cout << "check " << check << " " << " error: " << error << endl;
TestCompiled(); // run macro
exit(0);
}
加载库正常,但没有找到TestCompiled():
$ root -b -l Test.C
root [0]
Processing Test.C...
check 0 error: 0
Error: Function Hello() is not defined in current scope Test.C:11:
*** Interpreter error recovered ***
通过使用 ROOT 编译第一个测试脚本(没有 extern 行,使用 root TestCompiled.C++ 编译)来做同样的事情......我可以尝试什么来让 C++ 程序在 nvcc 进行编译时找到测试函数?
【问题讨论】:
-
如果c++程序找不到test函数,说明库路径有问题。我不使用 nvcc,但通常您要么必须导出库路径,要么包含 -Wl,-rpath=/path/to/your/lib 以便找到 lib 和函数。运行
ldd -v execuatablename,看看c++ 可执行文件查看库是否有任何问题。我确定您正在使用它,但 Cuda Toolkit 有详尽的文档。 -
@DavidC.Rankin 谢谢,但是库 is 找到(已加载),只是它没有找到其中的函数(可能是它被破坏了不同的方式?)...我的学生会看看你提供的链接。
-
包含函数定义的头文件包含在你用nvcc编译的c++源文件中?
-
没有包含头文件。我们会试试这个。但是请注意,如果 ROOT 自己编译第一个 (TestCompile) 程序,则一切正常:它不需要任何头文件来加载编译文件并运行其
TestCompiled()函数。
标签: c++ dynamic-linking nvcc