如何在Fortran 2003程序中找到内存泄漏的原因?

时间:2012-03-17 17:12:13

标签: memory-leaks fortran fortran90 memory-leak-detector

我有一个使用Fotran 2003编写并使用

编译的Fortran程序

针对在IA-32上运行的应用程序的英特尔(R)Fortran编译器XE,版本12.1.2.273 Build 20111128

运行我的程序长时间运行(这是一个物理计算)我读出来了:
没有足够的内存来分配Fortran RTL消息缓冲区,消息

我猜测它与我程序中的内存泄漏有关 如何找出泄漏发生的位置以及如何解决?

3 个答案:

答案 0 :(得分:6)

正如第一个答案所表明的那样,您的问题非常笼统,并且不能根据具体答案进行修改。你在使用指针吗?指针比可分配的安全性更低 - 如果它们可以完成工作,则切换到可分配的位置。

有关ifort的调试选项的建议:-O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone

答案 1 :(得分:2)

这更像是一个扩展的评论而不是一个答案......

您已经猜到了您的内存泄漏,但您没有向我们提供任何可以帮助您将猜测转化为诊断的信息。在没有这些信息的情况下,有些建议......

a)Fortran程序中的内存泄漏与其他程序中的内存泄漏方式相同:程序员在完成时忘记(或忽略)解除分配变量;不要忘记,使用Fortran 2003,你可以拥有可分配的标量;

b)在长期运行的科学计算中,发现迭代构建大量输出并不罕见,有时最好在计算过程中将这些输出写入磁盘,而不是等到结束;你在I / O(好吧,大多数是O)时间中受到了打击,但是在内存使用方面节省了成本;

c)有多种工具可以帮助您发现内存泄漏,包括Intel Inspector和各种开源程序;

d)你应该很清楚程序所需的内存在运行时会如何变化;

e)有时,在这个领域,答案只是购买更多的RAM。

答案 2 :(得分:1)

我想你已经从编译器得到了答案:内存不足。在你的程序的某些时候,你正试图分配一个大的内存。

您可以使用“-O0 -debug -traceback -check -ftrapuv”标志编译程序并再次运行它。你可以使用intel调试器逐行检查程序(我的意思是你认为问题可能在哪里)。运气好的话,你不需要使用像valgrind这样的其他工具。

有时,与Gfortran一起编译也会有所帮助。请注意,您需要使用不同的编译器选项来检查数组边界。

最后一个提示是关于使用“关联”构造。我个人在使用它时遇到了很多问题。如果您使用它,请将其从代码中删除并再次检查。