【问题标题】:MPI memory leakMPI 内存泄漏
【发布时间】:2018-08-28 02:24:27
【问题描述】:

我正在编写一些使用 MPI 的代码,并且在使用 valgrind 运行它时一直注意到一些内存泄漏。在试图确定问题出在哪里时,我最终得到了这个简单(而且完全没用)的主要内容:

#include "/usr/include/mpi/mpi.h"

int main(int argc,char** argv)
{
MPI_Init(&argc, &argv);
MPI_Finalize();
return 0;
}

如您所见,这段代码没有做任何事情,也不应该产生任何问题。但是,当我使用 valgrind 运行代码时(在串行和并行情况下),我得到以下摘要:

==28271== 堆摘要:

==28271== 在退出时使用:2,745 个块中的 190,826 个字节

==28271== 总堆使用量:11,214 次分配,8,469 次释放,16,487,977 字节分配

==28271==

==28271== 泄漏摘要:

==28271== 肯定丢失了:55 个块中的 5,950 个字节

==28271== 间接丢失:32 个块中的 3,562 个字节

==28271== 可能丢失:0 个块中的 0 个字节

==28271== 仍可访问:2,658 个块中的 181,314 个字节

==28271== 抑制:0 个块中的 0 个字节

我不明白为什么会有这些泄漏。也许只是我无法读取 valgrind 输出或正确使用 MPI 初始化/终结...

如果有帮助的话,我在 ubuntu 下使用 OMPI 1.4.1-3 和 64 位架构。

非常感谢您的宝贵时间!

【问题讨论】:

    标签: memory-leaks mpi valgrind


    【解决方案1】:

    OpenMPI 常见问题解答地址为issues with valgrind。这指的是最终确定期间的初始化问题和内存泄漏 - 这应该没有实际的负面影响。

    在很多情况下,Open MPI 故意不 初始化并随后与内存通信,例如,通过调用 写v。此外,已知几种情况,其中内存不 在 MPI_Finalize 时正确释放。

    这当然无助于区分真假 积极的一面。 Valgrind 提供了抑制错误和 来自某些函数上下文的警告。

    为了简化使用 Valgrind 的调试,从 v1.5 开始, Open MPI 提供了一个所谓的 Valgrind-suppression 文件,可以 在命令行传递:

    mpirun -np 2 valgrind
    --suppressions=$PREFIX/share/openmpi/openmpi-valgrind.supp
    

    【讨论】:

    • 请注意过滤器仅适用于未初始化的数据。 Open MPI 中存在真正的内存泄漏。幸运的是,它们大多发生在完成时,因此它们不依赖于应用程序正在做什么,因此它们大部分时间都不会被发现。
    【解决方案2】:

    你没有做错任何事。 valgrind 的 Memcheck 误报很常见,你能做的最好的就是抑制它们。

    手册的This page 更多地谈到了这些误报。接近尾声的一句话:

    包装器应降低 Memcheck 在 MPI 上的错误错误率 应用程序。因为包装是在 MPI 接口完成的,所以有 仍然可能会在 MPI 中报告大量错误 接口下的实现。你能做的最好的就是尝试 压制他们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2013-01-20
      • 2011-10-31
      • 2019-08-10
      • 2013-06-24
      • 2011-03-22
      相关资源
      最近更新 更多