关于CUDA链接Fortran和C语言的讨论

_梦魇花葬 2014-05-27 03:17:30
加精
本人最近在做一些开源工程的改进,是关于有限元分析的。原工程文件使用的是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语言的链接就显得尤为的重要,不知道小伙伴们有没有什么其它的方法和见解,大家一起来讨论吧~
...全文
2761 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_16705273 2014-06-20
  • 打赏
  • 举报
回复
好厉害的人啊
Bianca_ 2014-06-20
  • 打赏
  • 举报
回复
顶一个,虽然看不懂^_^
qq_16704909 2014-06-20
  • 打赏
  • 举报
回复
不是很懂,先看看,了解一下!
sinat_16704683 2014-06-20
  • 打赏
  • 举报
回复
不是很懂,只看看
LW0158 2014-06-20
  • 打赏
  • 举报
回复
学习一下,受教了!
ddf5df54s63 2014-06-20
  • 打赏
  • 举报
回复
不是很懂,先看看,了解一下!
lde0602 2014-06-20
  • 打赏
  • 举报
回复
学习
王毅扬 2014-06-20
  • 打赏
  • 举报
回复
感谢大神分享,挺不错的。
hclzml 2014-06-20
  • 打赏
  • 举报
回复
涨知识了
wqdch 2014-06-20
  • 打赏
  • 举报
回复
比特币的运算是不是使用cuda编程搞定的
qq_16713729 2014-06-20
  • 打赏
  • 举报
回复
哈哈,见识了
qq_16713643 2014-06-20
  • 打赏
  • 举报
回复
看了非常有用,谢谢楼主分享
qq_16713621 2014-06-20
  • 打赏
  • 举报
回复
1. 其他语言和cuda互相调用。为.cu文件中的函数编写wrapper函数,就是包一层放到.c里,只用C语言调用cuda。 2. fortran和C的互相调用,这是个老问题。 要编译通过需要注意fortran的一些编译时的符号转换规则,大小写,下划线之类,用nm查看fortran的obj文件就明白了; gcc链接fortran程序不能通过的原因,其实是默认没有链接上fortran需要的一些运行库( -lfrtbegin -lg2c 等,看fortran版本),因为gcc默认只链接C库,如果库写全了也可以链接通过。简单的解法,就是用fortran编译器链接,默认会链接fortran需要的库。
qq_15821927 2014-06-20
  • 打赏
  • 举报
回复
爱上大声地爱上大声地爱上大声地爱上大声地爱上大声地
cccccv22 2014-06-19
  • 打赏
  • 举报
回复
学习了,感谢楼上大神们~~
Hijiao 2014-06-18
  • 打赏
  • 举报
回复
学习了,感谢楼上大神们~~
qq_16631111 2014-06-17
  • 打赏
  • 举报
回复
初学C语言,各种不懂
baidu_16630897 2014-06-17
  • 打赏
  • 举报
回复
哎,c语言我都快忘光了
qq_16627341 2014-06-17
  • 打赏
  • 举报
回复
谢谢啦................
qq_16624603 2014-06-17
  • 打赏
  • 举报
回复
加载更多回复(19)
make是在1977年在贝尔实验室(Bell Labs)研发的 Unix系统中的一款依赖关系检查工具程序(Utility software)。make的应用非常广泛,它被用来构建 C、C++ 、Pascal  Fortran 等项目,自动化构建生成可执行文件或者库文件。make通过读取Makefile文件以自动化建构软件, 它会根据依赖文件的修改时间进行判断。确定一个target的依赖关系,然后把生成这个target的相关命令传给shell去执行。GNU make 和大多数版本的 make 之间最重要的区别是 GNU make 是自由软件,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。GNU make 在 makefile 中具有许多强大的功能,超出了其他 make 版本的功能,它还可以重新生成、使用、然后删除不需要保存的中间文件。GNU make 还有一些非常方便的简单功能。例如,选项“假装源文件文件没有更改,即使它已更改。当您向头文件添加新宏时,这非常有用。大多数版本的 make 都会假设它们必须重新编译所有使用头文件的源文件,但是如果您知道对头文件的更改不需要重新编译 GNU make 为您提供了一种避免重新编译的方法-o file 。 黄强老师针对零编程基础的同学,精心打磨make核心知识点,帮助你快速掌握Linux编程中的make的构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋!

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧