MPI内存泄漏

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

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

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

正如你所看到的,这段代码不会做任何事情,也不应该产生任何问题。 但是,当我用valgrind运行代码(在串行和并行的情况下),我得到以下总结:

== 28271 ==总结:

==退出时使用的28271 ==:2745个块中的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初始化/终止...

我在64位体系结构的ubuntu下使用OMPI 1.4.1-3,如果这可以提供帮助的话。

非常感谢您的时间!


你没有做错什么。 Memcheck与Valgrind的误报是常见的,你所能做的最好的就是压制他们。

本手册的这一页讲述了更多关于这些误报的信息。 最后的报价:

包装应该减少Memcheck在MPI应用程序中的错误率。 由于包装是在MPI接口完成的,因此接口下面的MPI实施中可能会报告大量错误。 你可以做的最好的就是试图压制他们。


OpenMPI FAQ解决了这个问题:http://www.open-mpi.org/faq/?category=debugging#valgrind_clean

在很多情况下,Open MPI有目的地不会初始化并随后传递内存,例如通过调用writev。 此外,还有几种情况是已知的,在MPI_Finalize时内存不能正确释放。

这当然无法区分真实错误和误报。 Valgrind提供了抑制某些功能上下文中的错误和警告的功能。

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

mpirun -np 2 valgrind
--suppressions=$PREFIX/share/openmpi/openmpi-valgrind.supp
链接地址: http://www.djcxy.com/p/64941.html

上一篇: MPI memory leak

下一篇: valgrind, profiling timer expired?