当前位置: 首页 > 知识库问答 >
问题:

CUDA nvcc构建图书馆链

司马钱明
2023-03-14

我的目标是:library2.so正在使用library1.somycode。o正在使用(应该链接库)library2.so(可能还有library1.so

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

library1.cu:

__device__ void func1_lib1(void){}

图书馆2.cu:

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

霉菌代码c:

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

我正在根据Makefile构建共享库

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

< code>make working工作起来没有任何问题。但它并没有形成一个图书馆链。< code>library1.cu和< code>library2.cu在同一个< code >中。so文件。

使破坏失败

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'

如果我通过nm检查 library1.so,则目标(T)_Z10func1_lib1v内部。

共有1个答案

吴经略
2023-03-14

在您的“损坏”方法中,您正在尝试创建一个仅包含__device__函数的 library1.so(共享库):

__device__ void func1_lib1(void){}

任何其他希望使用该__device__函数的对象都必须使用可重定位的设备代码/单独的编译和链接,当然您正在尝试这样做。

然而,对于库,设备链接仅支持静态库中包含的函数。请注意nvcc手册中的以下语句:

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

和:

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

所以你的一般策略不起作用。一个可能的解决方法是将library1.cu代码放在静态库中:

rm -f *.o *.so
nvcc -arch=sm_30 --compiler-html" target="_blank">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

或者创建一个< code >序列。所以库不需要跨库边界的设备链接,这或多或少在您的“工作”案例中得到了证明。

 类似资料:
  • 我正在使用Fresco库将图像和GIF加载到我的应用程序中。我遇到的最大的限制是壁画的布局宽度和高度必须设置。因此,我设置了简单的付款人视图,如下所示: 我的问题是,如果图像的高度大于宽度,那么在图像的右边有很多空白(见附件),但是高度是好的 然后它可能发生在高度,如果实际图像小于宽度(见附件),所以这里,因为固定的高度是250dp,有很多空白的图像下面。

  • 提供了大量的库例程。 有些内置在解释器, ex.exe, exw.exe or exu 。 其他的是用Euphoria编写的,你必须在euphoria\include目录中包含一个.e文件才能使用它们。 要指出可以传入和返回的对象类型,使用以下前缀 - S.No 前缀和描述 1 x 一般对象(原子或序列) 2 s 一个序列 3 a 一个原子 4 i 整数 5 fn 用作文件编号的整数 6 st 字

  • 我试着建立Gradle: 尝试:使用--info或--debug选项运行以获取更多日志输出。 这是我的等级。建造:

  • Arduino Math库(math.h)包含许多用于处理浮点数的有用数学函数。 Library宏 (Library Macros) 以下是头部math.h中定义的宏 - 下面给出了标题math.h中定义的宏列表 宏 值 描述 M_E 2.7182818284590452354 The constant e. M_LOG2E 1.4426950408889634074 /* log_2 e */

  • 我目前正在努力加深对CMake的理解。我试着用http://libqglviewer.com/introduction.html]LibQGLViewer是我的一个C项目中的第三方库。 相关子目录中的CMakeLists.txt看起来像下面的部分,我有问题是add_libary部分,为了清晰起见,省略了一些头文件和源文件 我的应用程序运行,一切都很好。 但是,我读到,应该只包含ADDILL库的源文

  • 我必须给主类加上JavaMailUtl类这是我的JavaMailUtl类: 这是我的主要课程: 当我尝试运行项目时,出现以下错误: 多次仔细检查代码,发现没有问题,我的每个对象都指向了正确的位置。