本人最近在做一些开源工程的改进,是关于有限元分析的。原工程文件使用的是Fortran和C语言编写的,相通过GPU对有限元求解部分进行加速,最初的想法只是将求解器中的C部分改为CUDA程序,但在实际编写MakeFile的时候出现了问题。
开源工程是基于Linux系统的,编译是依靠MakeFile的。起初对MakeFile只是略微的了解一些,看到工程中的MakeFile瞬间感觉无力,只能狂补MakeFile。深入了解之后,在所有.f和.c文件分别被gfortran和gcc编译成.o文件后,链接工作还是比较轻松的,只需要用gfortran编译器做链接就可以了。但如果多了一个.cu的CUDA文件,问题的复杂性就来了:大家知道,CUDA文件是通过nvcc编译的,那我是应该用nvcc来链接所有文件呢,还是用gfortran链接所有文件呢?本人分别作了实验,如果用gfortran链接所有文件,即使包含了CUDA的cudart和cusparse库,也会提示找不到CUDA诸如cudaMalloc、cudaFree等关键字(也可能是我的makeFile没有写对,有成功的朋友们请留贴);如果用nvcc来做链接,会提示找不到fortran语言的关键字。
仔细想想原因,原工程中已经通过gfortran编译器链接C文件了,而nvcc是建立在gcc上的,所以,使用nvcc来做链接可能是行不通的;那只能通过gfortran编译器来链接.c和.cu编译之后的.o文件了。NVIDIA英文官方论坛上也有相关的问题出现,提问者通过gfortran成功链接了CUDA程序,见链接
https://devtalk.nvidia.com/default/topic/453141/cuda-programming-and-performance/cuda-c-in-fortran-program/]
那我们来换一种思路,既然nvcc是建立在gcc上的,那我们应该就可以用nvcc来编译所有的.c和.cu文件,实际NVIDIA自带的IDE也是这么做的,然后通过gfortran编译器链接所有文件,这次的结果是成功的。
实际的工程项目中,文件数量会很多,也可能来自于很多不同的语言,因此需要用不同的编译器编译,而Fortran是做工程矩阵计算最常用的一门语言,CUDA又适合于对矩阵运算进行加速,因此二者有着先天的紧密联系。CUDA和Fortran语言的链接就显得尤为的重要,不知道小伙伴们有没有什么其它的方法和见解,大家一起来讨论吧~