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链接,尝试了一下,成功编译链接!