我有一个使用 Fotran 2003 编写并使用编译的 Fortran 程序
英特尔(R) Fortran 编译器 XE,适用于在 IA-32 上运行的应用程序,版本 12.1.2.273 Build 20111128
在长时间运行我的程序后(这是一个物理计算),我读到了:
Insufficient memory to allocate Fortran RTL message buffer, message
我猜这与我的程序中的内存泄漏有关如何找出泄漏发生在哪里以及如何修复它?
我有一个使用 Fotran 2003 编写并使用编译的 Fortran 程序
英特尔(R) Fortran 编译器 XE,适用于在 IA-32 上运行的应用程序,版本 12.1.2.273 Build 20111128
在长时间运行我的程序后(这是一个物理计算),我读到了:
Insufficient memory to allocate Fortran RTL message buffer, message
我猜这与我的程序中的内存泄漏有关如何找出泄漏发生在哪里以及如何修复它?
正如第一个答案所表明的那样,您的问题非常笼统,不能针对特定答案进行修改。你在用指针吗?指针不如可分配的安全——如果它们能完成这项工作,就切换到可分配的。
ifort 调试选项的建议:-O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
这更像是一个扩展评论而不是一个答案......
您已经猜到您有内存泄漏,但您没有向我们提供任何信息来帮助您将您的猜测转化为诊断。在没有此类信息的情况下,一些建议......
a) Fortran 程序中的内存泄漏与在其他程序中发生的方式相同:程序员在完成时忘记(或忽略)释放变量;不要忘记使用 Fortran 2003 您可以拥有可分配的标量;
b) 在长期运行的科学计算中,经常会发现大量的输出被迭代构建,有时在计算过程中将这些输出写入磁盘比等到结束要好;您在 I/O(嗯,主要是 O)时间上受到了打击,但确实节省了内存使用;
c) 有多种工具可帮助您发现内存泄漏,包括 Intel Inspector 和各种开源程序;
d) 你应该很清楚程序运行时所需的内存是如何变化的;
e) 有时,在这个领域,答案就是购买更多的 RAM。
我想你已经从编译器那里得到了答案:内存不足。在您的程序的某个时刻,您正试图分配一个大内存。
您可以使用“-O0 -debug -traceback -check -ftrapuv”标志编译您的程序并再次运行它。您可以使用英特尔调试器逐行检查程序(我的意思是您认为问题可能出在哪里)。运气好的话,你不需要使用其他工具,比如 valgrind。
有时,使用 Gfortran 编译也会有所帮助。请注意,您需要使用不同的编译器选项来检查数组边界。
最后一个技巧是关于使用“关联”结构。我个人在使用它时遇到了很多问题。如果您使用它,请将其从您的代码中删除并再次检查。