计算化学公社

 找回密码 Forget password
 注册 Register
Views: 1381|回复 Reply: 7
打印 Print 上一主题 Last thread 下一主题 Next thread

[Fortran] fortran中的递归程序耗时吗?

[复制链接 Copy URL]

8

帖子

0

威望

418

eV
积分
426

Level 3 能力者

目前在代码中写了一个递归子程序,运行起来非常耗时,请问大家,是否有必要将该递归子程序改成循环?谢谢!

313

帖子

2

威望

3872

eV
积分
4225

Level 6 (一方通行)

2#
发表于 Post on 2024-4-9 12:06:25 | 只看该作者 Only view this author
这个自己测试不就好了。算法中,递归本身就是反复开栈的过程,如果你写的程序递归深度很大,自然耗时间。

8

帖子

0

威望

418

eV
积分
426

Level 3 能力者

3#
 楼主 Author| 发表于 Post on 2024-4-9 15:15:24 | 只看该作者 Only view this author
lyj714 发表于 2024-4-9 12:06
这个自己测试不就好了。算法中,递归本身就是反复开栈的过程,如果你写的程序递归深度很大,自然耗时间。

好的谢谢

12

帖子

0

威望

83

eV
积分
95

Level 2 能力者

4#
发表于 Post on 2024-7-28 22:15:25 | 只看该作者 Only view this author
科学计算里非必要不要用递归吧

8

帖子

0

威望

418

eV
积分
426

Level 3 能力者

5#
 楼主 Author| 发表于 Post on 2024-9-4 19:50:30 | 只看该作者 Only view this author
node101 发表于 2024-7-28 22:15
科学计算里非必要不要用递归吧

好滴谢谢

517

帖子

1

威望

2412

eV
积分
2949

Level 5 (御坂)

6#
发表于 Post on 2024-12-9 10:35:35 | 只看该作者 Only view this author
递归改循环的话,理论上可以,但一般这么做的都是偏计算机专业的人士。

作为化学专业的话,有两个较短时间内适用的方案,一个是用OpenMP的task来加速递归,既然你的程序是用Fortran写的,肯定是可以用OpenMP在多核处理器上加速的。美国的ACCESS(之前叫XSEDE)的OpenMP workshop里会提到这一点,具体就是看CMU的并行计算专家John Urbanic写的教程(他就是ACCESS的OpenMP workshop的授课者,他的这些slides就是授课时用的) https://www.psc.edu/resources/training/openmp-workshop/ 中的Advanced OpenMP一节。如果觉得用OpenMP的task进行调度太难的话(John Urbanic本人也说过绝大多数情况下用OpenMP加速一下for循环就可满足要求,用到OpenMP的task的情况往往是为线性代数库、numpy贡献代码),那就只能用第二个方案,就是在科学计算中尽量避免写出用递归的代码。

评分 Rate

参与人数
Participants 1
eV +3 收起 理由
Reason
TerminSong + 3 学到了

查看全部评分 View all ratings

8

帖子

0

威望

418

eV
积分
426

Level 3 能力者

7#
 楼主 Author| 发表于 Post on 2025-1-7 09:49:51 | 只看该作者 Only view this author
Daniel_Arndt 发表于 2024-12-9 10:35
递归改循环的话,理论上可以,但一般这么做的都是偏计算机专业的人士。

作为化学专业的话,有两个较短时 ...

太感谢了!谢谢您给出的建议。

54

帖子

0

威望

161

eV
积分
215

Level 3 能力者

8#
发表于 Post on 2025-12-27 01:37:51 | 只看该作者 Only view this author
这个问题我确实也好奇过,在网上搜是这样的
https://fortranwiki.org/fortran/show/recursion
Fortran 77在出现的时候,可能就没想过操作系统、栈之类的东西(Linux Windows都是用C写出来的,它们都是C出现后的产物)
所以原生的77是不支持递归的。只有一些implementions比如gfortran有它们自己的语法。
至于实现的原理更不清楚了。据这个网站所说,Fortran的递归比C慢很多,这个和C在引用调用、传值调用的设计有关。
另外,一切递归都可以改为循环。只不过是把编译器分配的栈变成你手动分配的栈数组。
如果你对这个比较感兴趣,你可以用必应或者google搜一下一个排序算法
quicksort 和它的循环版本 iterative quicksort
在geeksforgeeks就有它们的代码,很容易理解。
把递归展开成循环,有利于性能提升,不管是C还是Fortran.

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-1-24 01:17 , Processed in 0.169699 second(s), 21 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list