创建要与C++程序链接的静态CUDA库

Mat*_*ohn 8 c++ cuda

我试图将CUDA内核与C++ autotools项目链接,但似乎无法通过链接阶段.

我有一个文件GPUFloydWarshall.cu,它包含内核和一个包装器C函数,我想放入库libgpu.a.这将与项目的其余部分保持一致.这是可能吗?

其次,库需要链接到大约十个其他库,用于主要可执行文件,目前使用mpicxx.

目前我正在使用/生成以下命令来编译和创建libgpu.a库

nvcc   -rdc=true -c -o temp.o GPUFloydWarshall.cu
nvcc -dlink -o GPUFloydWarshall.o temp.o -L/usr/local/cuda/lib64 -lcuda -lcudart
rm -f libgpu.a
ar cru libgpu.a GPUFloydWarshall.o
ranlib libgpu.a
Run Code Online (Sandbox Code Playgroud)

当这全部链接到主可执行文件时,我得到以下错误

problem/libproblem.a(libproblem_a-UTRP.o): In function `UTRP::evaluate(Solution&)':
UTRP.cpp:(.text+0x1220): undefined reference to `gpu_fw(double*, int)'
Run Code Online (Sandbox Code Playgroud)

th gpu_fw函数是我的包装函数.

Rob*_*lla 5

这是可能吗?

是的,有可能。并且围绕它创建一个(非CUDA)包装函数使它变得更加容易。如果您始终依靠C ++链接(您提到了包装器C函数),则可以使您的生活更加轻松。mpicxx是C ++编译器/链接器的别名,默认情况下cuda文件(.cu)遵循C ++编译器/链接器的行为。这是一个非常简单的问题,讨论了如何将cuda代码(封装在包装函数中)构建到静态库中。

其次,该库随后需要链接到大约十个其他库,以供当前使用mpicxx的主要可执行文件使用。

在库中暴露了C / C ++(非CUDA)包装后,链接应该与普通库的普通链接没有什么不同。您可能仍然需要传递链接步骤中可能使用的cuda运行时库和任何其他cuda库,但这在概念上与项目可能依赖的任何其他库相同。

编辑:

目前尚不清楚您是否需要使用设备链接来完成操作。(但是可以接受,这只会使事情复杂一些。)无论如何,既然您已经显示了命令序列,那么您对库的构造就不太正确。设备链接命令生成一个设备可链接对象,该对象不包括所有必需的主机。为了将所有内容集中在一起,我们想将GPUFloydWarshall.o(具有与设备链接的片段) temp.o(具有宿主代码的片段)添加到库中。

这是一个完整的示例:

$ cat GPUFloydWarshall.cu
#include <stdio.h>

__global__ void mykernel(){
  printf("hello\n");
}

void gpu_fw(){
  mykernel<<<1,1>>>();
  cudaDeviceSynchronize();
}


$ cat main.cpp
#include <stdio.h>

void gpu_fw();

int main(){

  gpu_fw();
}

$ nvcc   -rdc=true -c -o temp.o GPUFloydWarshall.cu
$ nvcc -dlink -o GPUFloydWarshall.o temp.o -lcudart
$ rm -f libgpu.a
$ ar cru libgpu.a GPUFloydWarshall.o temp.o
$ ranlib libgpu.a
$ g++ main.cpp -L. -lgpu -o main -L/usr/local/cuda/lib64 -lcudart
$ ./main
hello
$
Run Code Online (Sandbox Code Playgroud)