我正在尝试将 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/