c++ - 创建静态 CUDA 库以与 C++ 程序链接

标签 c++ cuda

我正在尝试将 CUDA 内核与 C++ 自动工具项目链接起来,但似乎无法通过链接阶段。

我有一个文件 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

当这一切都链接到主可执行文件时,我得到以下错误

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

gpu_fw 函数是我的包装函数。

最佳答案

Is this at all possible?

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

Secondly, the library would then need to be linked to around ten other libraries for the main executable which at the moment using 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
$

关于c++ - 创建静态 CUDA 库以与 C++ 程序链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26893588/

相关文章:

c++ - 指针可以指向 cpu 寄存器吗?

cuda - 一个类似 top 的实用程序,用于监控 GPU 上的 CUDA 事件

c++ - 作为函数说明符的模板参数和编译器优化

c++ - 在 Nvidia NPP ImageCPU 对象中设置像素值?

c++ - 如何将四面体树结构复制到CUDA设备内存?

c++ - 如何在另一个类中使用一个类?

c++ - 为什么此函数不将一个数字加到一个称为int的整数上?

c++ - 初始化并传递数组

python - 如何使用tcpdump和c++重新创建文件?

python - 将 C++/CUDA 类传递给 PyCUDA 的 SourceModule