【问题标题】:How can I find the cause for a memory leak in Fortran 2003 program?如何找到 Fortran 2003 程序中内存泄漏的原因?
【发布时间】:2012-04-02 20:46:27
【问题描述】:

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

编译的 Fortran 程序

适用于在 IA-32 上运行的应用程序的 Intel(R) Fortran Compiler XE,版本 12.1.2.273 Build 20111128

在长时间运行我的程序后(这是一个物理计算),我读到了:
内存不足,无法分配 Fortran RTL 消息缓冲区,消息

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

【问题讨论】:

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


    【解决方案1】:

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

    您猜测您有内存泄漏,但您没有向我们提供任何信息来帮助您将猜测转化为诊断。在没有此类信息的情况下,一些建议......

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

    b) 在长期运行的科学计算中,经常会发现大量的输出被迭代构建,有时在计算过程中将这些输出写入磁盘比等到结束要好;您在 I/O(嗯,主要是 O)时间上受到了打击,但确实节省了内存使用;

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

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

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

    【讨论】:

    • 这是一个大型程序,我想了解更多有关我可以用来诊断问题的方法的信息,比如某种内存调试器
    • 如果你想要一个工具而不是尝试 valgrind。
    【解决方案2】:

    正如第一个答案所表明的那样,您的问题非常笼统,无法修改为特定答案。你在用指针吗?指针不如可分配的安全——如果它们能完成这项工作,就切换到可分配的。

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

    【讨论】:

    • 如果我使用指针并将其重新指向另一个对象,我应该在重新指向后释放孤立对象,对吧?
    • 当你不再需要一个对象时,你应该释放它。您需要在仍有有效的引用方式时这样做。如果您唯一的方法是通过指针并且您重新分配指针而不是泄漏内存。可分配变量更难发生泄漏,因为与指针不同,它们在许多情况下会自动释放。例如,过程局部的可分配变量在离开过程时会自动释放。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • associate 构造也有几个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2011-01-14
    相关资源
    最近更新 更多