MPI内存泄漏

时间:2011-12-12 08:48:19

标签: memory-leaks mpi valgrind

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

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

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

如您所见,此代码不会执行任何操作,也不会产生任何问题。但是,当我使用valgrind运行代码时(在串行和并行情况下),我得到以下摘要:

  

== 28271 == HEAP SUMMARY:

     

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

     

== 28271 ==总堆使用量:11,214个allocs,8,469个frees,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初始化/完成...

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

非常感谢你的时间!

2 个答案:

答案 0 :(得分:10)

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

本手册的This page更多地讲述了这些误报。最后的一句话:

  

包装器应该减少Memcheck在MPI上的错误率   应用。因为包装是在MPI接口完成的   仍然可能是MPI中报告的大量错误   接口下面的实现。你能做的最好的就是尝试   压制他们。

答案 1 :(得分:9)

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

  

有很多情况,Open MPI故意没有   例如,通过调用初始化并随后传送存储器   writev可以获得。此外,已知有几种情况,其中记忆不是   在MPI_Finalize上正确释放。

     

这无疑有助于区分真实错误和虚假错误   阳性。 Valgrind提供了抑制错误的功能   来自某些功能背景的警告。

     

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

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