MPI内存泄漏

bar*_*gol 9 valgrind memory-leaks mpi

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

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

int main(int argc,char** argv)
{
MPI_Init(&argc, &argv);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此代码不执行任何操作,不应创建任何问题.但是,当我使用valgrind运行代码时(包括串行和并行情况),我得到以下摘要:

== 28271 ==堆概要:

== 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,如果这有帮助的话.

非常感谢你的时间!

cni*_*tar 10

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

手册的这一页更多地讲述了这些误报.最后的报价:

包装器应该减少Memcheck在MPI应用程序上的错误率.由于包装是在MPI接口完成的,因此在接口下方的MPI实现中仍可能会报告大量错误.你能做的最好的就是尽量压制它们.


Zul*_*lan 10

OpenMPI FAQ解决了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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,过滤器仅适用于未初始化的数据.Open MPI中存在真正的内存泄漏.幸运的是,它们大部分都是在最终确定时发生的,因此它们不依赖于应用程序正在做什么,因此它们在大多数时间内都未被发现. (2认同)