24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 932  |  回复: 1

fmying

银虫 (小有名气)

[求助] OpenMP并行测试算例,是什么影响了C和FORTRAN的运行效率?已有1人参与

最近在看OpenMP并行编程,一开始只是想学习一下C和FORTRAN的并行语法,于是做了一个测试:矩阵相乘C=A*B。其中A,B,C都是一个NxN的方阵。
我用C和FORTRAN分别编写了程序,并加入了OpenMP的并行语法。测试平台如下:
OS:Ubuntu 14.04 x86_64 GCC 4.7.3 GFORTRAN 4.7.3
RAM:8GB
CPU:Intel(R) Core(TM)2 Quad CPU    Q9400  @ 2.66GHz 一共4核心

程序计时测试: time omp.exe -d 1000
其中omp.exe是编译好的程序,1000表示1000x1000方阵(矩阵大小)
测试程序用小规模矩阵测试证明计算结果正确可靠。并行统一采用全部4核心并行,用top命令查看确认满负荷运行。

测试结果:
如果编译时不加入-fopenmp选项,则并行语法不起作用,程序为普通串行程序。此时测试结果为:
C:
real        0m9.047s
user        0m9.034s
sys        0m0.004s

FORTRAN:
real        0m10.022s
user        0m10.012s
sys        0m0.000s

real 一项就是程序实际执行时间。可以看到,虽然C略有优势,但是总体差别不大。

接下来,编译时加入-fopenmp打开并行算法,此时测试结果为:
C:
real        0m3.128s
user        0m12.314s
sys        0m0.012s

FORTRAN:
real        0m5.185s
user        0m20.465s
sys        0m0.016s

C比FORTRAN快了好多,将近一倍的速度差。

之后,我为了进一步确认,编写了第三个程序。在这个程序中,我先用C计算A*B,然后用C调用FORTRAN的subroutine再算一遍,就是C和FORTRAN的混合编程。C和FORTRAN的计算部分用C的time函数分别计时(只能精确到秒)。编译时开启并行算法。此时的测试结果意外变为:
C部分:3秒
FORTRAN部分:2秒
程序总运行时间(time命令计时):
real        0m5.486s
user        0m21.644s
sys        0m0.020s

这个结果表明,用C调用FORTRAN模块的效率不仅比原生FORTRAN程序高,甚至高过了原生C程序?
上网查了一下,发现对比C和FORTRAN的讨论很少,深度分析的更少。我很想知道这是为什么。是什么影响了这三个程序的执行效率,我们在编写程序的时候这方面应该注意些什么。
我将我的测试程序的源代码打包附上。里面有三个目录:c,fortran 和 hybrid,分别表示C程序,FORTRAN程序和混合编程程序。欢迎大家测试。
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : parallel.zip
  • 2014-12-25 15:34:42, 4.45 K

» 收录本帖的淘帖专辑推荐

source

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

上善若水
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

getengqing

木虫 (正式写手)

【答案】应助回帖

Fortran的运行效率本来就比C差,很多做并行的都会把它改成C程序
一起交流学习/分享优秀资源
2楼2015-11-18 16:58:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 fmying 的主题更新
信息提示
请填处理意见