CUDA nvcc建立图书馆链

时间:2016-03-09 16:20:13

标签: cuda dynamic-linking nvcc

我的目标是:library2.so正在使用library1.so并且mycode.o正在使用(libs应该链接)library2.so(也许library1.so)。

源代码是(省略了一行头文件):

library1.cu:

__device__ void func1_lib1(void){}

library2.cu:

#include "library1.h"
__global__ void func1_lib2(void)
{
    func1_lib1();
}
extern "C"
void func2_lib2(void)
{
    func1_lib2<<<1,1>>>();
}

mycode.c中:

#include "library2.h"
int main(void)
{
    func2_lib2();
}

我正在使用Makefile构建共享库according to

broken:
    rm -f *.o *.so
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib1.o library1.o
    gcc  -shared -Wl,-soname,library1.so -o library1.so library1.o uda-lib1.o
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib2.o library2.o -lrary1
    gcc  -shared -Wl,-soname,library2.so -o library2.so library2.o cuda-lib2.o
    gcc  -c mycode.c
    gcc  -o mycode -L. -lrary2 -lrary1 mycode.o

working:
    rm -f *.o *.so
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib.o library1.o library2.o
    gcc  -shared -Wl,-soname,library.so -o library.so library1.o library2.o cuda-lib.o
    gcc  -c -fPIC mycode.c                                                      
    gcc  -o mycode -L. -lrary  -L/usr/local/cuda/lib64 -lcuda -lcudart mycode.o

make working没有任何问题。但它并没有形成一个连锁的图书馆。 library1.culibrary2.cu位于同一个.so文件中。

make broken失败

nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib2.o library2.o -lrary1
nvlink error   : Undefined reference to '_Z10func1_lib1v' in 'library2.o'

如果我按library1.so检查nm,则目标(T)_Z10func1_lib1v内有。{/ p>

1 个答案:

答案 0 :(得分:5)

在你的&#34;破碎&#34;方法,您正在尝试创建仅包含library1.so函数的__device__(共享库):

__device__ void func1_lib1(void){}

任何其他希望使用该__device__函数的对象都必须使用relocatable device code/separate compilation and linking,当然您正在尝试这样做。

但是,对于库,设备链接only supports functions contained in static libraries。请注意nvcc手册中的这些陈述:

  

设备链接器能够读取静态主机库格式(Linux和Mac OS X上的.a,Windows上的.lib)。它忽略了任何动态(.so或.dll)库。

  

请注意,设备链接器仅支持静态库。

所以你的总体战略不会奏效。可能的解决方法是将library1.cu代码放在静态库中:

rm -f *.o *.so
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
nvcc -arch=sm_30 --lib -o cuda-lib1.a library1.o
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib2.o library2.o cuda-lib1.a
gcc  -shared -Wl,-soname,library2.so -o library2.so -L/usr/local/cuda/lib64 -lcuda -lcudart library2.o cuda-lib2.o cuda-lib1.a
gcc  -c mycode.c
gcc  -o mycode -L. -lrary2  mycode.o

或者创建一系列.so库,这些库不需要跨库边界的设备链接,这在您的工作中可以或多或少地展示出来。情况下。