Bootstrap

Fortran 和 cuda C++混合编程 ,链接问题 ,调用其他源文件的设备函数__device__

Fortran 和 cuda C++混合编程 ,链接问题,调用其他源文件的设备函数__device__

问题描述

Fortran 和 cuda C++混合编程,cuda代码中调用了在其他源文件中定义的 __device__ 函数,编译报错

由于我没有fortran程序的部分源码,且主函数在fortran代码中(没有源码),使用的是mpif90编译fortran代码为 .o 文件,nvcc编译cuda c++代码,

使用mpif90链接所有 .o 文件。

一些尝试

编译cuda源文件时 添加-rdc=true编译选项,编译通过,但是在链接时,每个cuda文件都报错:

undefined reference to `__cudaRegisterLinkedBinary'

必要的库-lcudart -lstdc++ 都已经添加,

这里我使用的链接器是mpif90,怀疑是mpif90识别不了cuda标志,于是我将连接器换成nvcc,并添加了必要的fortran、MPI库

链接报错,找不到主函数入口:

/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/crt1.o: In function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [Makefile:165: a.out] Error 1

成功解决

在NVIDIA官方文档NVIDIA CUDA Compiler Driver的示例中
在这里插入图片描述

nvcc --gpu-architecture=sm_50 --device-c a.cu b.cu
nvcc --gpu-architecture=sm_50 --device-link a.o b.o --output-file link.o
g++ a.o b.o link.o --library-path=<path> --library=cudart

第二种方法 是把cuda源文件编译成 .o文件后,再从这些.o文件中把与设备代码有关的链接单独拿出来编译成 link.o ? 不太清楚

但是它最后用的g++链接,我想应该也可以这样用mpif90链接,尝试了一下,成功编译链接!

;