Memory MPI内部缓冲区内存问题

Memory MPI内部缓冲区内存问题,memory,mpi,openmpi,Memory,Mpi,Openmpi,我正在处理一个带有MPI并行化的Fortran代码,在这个代码中,密集运行的内存不足。我会小心地分配模拟开始时所需的几乎所有内存。子例程静态内存分配通常很小,但如果由于这些子例程而耗尽内存,则会在模拟的早期出现,因为内存分配不应随着时间的推移而增加。我的问题是,在模拟过程中,我遇到了如下内存错误: 内存不足,无法分配Fortran RTL消息缓冲区,消息#174=hex 000000 AE. 我能想到的唯一一件事是,我的MPI调用正在使用在模拟开始时无法预先分配的内存。在模拟运行时,我主要使用M

我正在处理一个带有MPI并行化的Fortran代码,在这个代码中,密集运行的内存不足。我会小心地分配模拟开始时所需的几乎所有内存。子例程静态内存分配通常很小,但如果由于这些子例程而耗尽内存,则会在模拟的早期出现,因为内存分配不应随着时间的推移而增加。我的问题是,在模拟过程中,我遇到了如下内存错误:

内存不足,无法分配Fortran RTL消息缓冲区,消息#174=hex 000000 AE.

我能想到的唯一一件事是,我的MPI调用正在使用在模拟开始时无法预先分配的内存。在模拟运行时,我主要使用MPI_Allreduce、MPI_Alltoall和MPI_Alltoallv,有时我会传递大量数据。内存问题可能是由MPI创建的内部缓冲区造成的吗?我怎样才能防止像这样的意外内存问题?在模拟过程中,该内部缓冲区是否会增长


我已经查看了Valgrind,除了恼人的MPI警告之外,我没有看到任何其他内存问题。

如果不知道更多细节,就很难判断MPI是否有故障。您可以尝试massif(valgrind工具之一)查找内存分配的位置

确保不引入任何资源泄漏:如果创建新的MPI资源(通讯器、组、请求等),请确保正确释放它们


通常,要注意所有对所有通信所需的缓冲区大小,尤其是在大规模通信中。如果可能的话,在适当的位置使用MPI\u,或者以小数据块而不是单个大数据块的形式发送数据。

如果不知道更多细节,就很难判断MPI是否出错。您可以尝试massif(valgrind工具之一)查找内存分配的位置

确保不引入任何资源泄漏:如果创建新的MPI资源(通讯器、组、请求等),请确保正确释放它们


通常,要注意所有对所有通信所需的缓冲区大小,尤其是在大规模通信中。如果可能的话,在适当的位置使用MPI_,或者以小数据块而不是单个大数据块的形式发送数据。

我已经将内存问题缩小到了执行MPI_Alltoall和MPI_Alltoallv的子程序。此外,我还发现使用1个节点(16个处理器)时没有内存问题,但使用2个或更多节点时内存问题很明显。你知道这怎么可能吗?在我看来,这个问题不可能是我的编码错误,但我以前就错了。我已经将内存问题缩小到了执行MPI_all ToAll和MPI_all ToAllV的子程序。此外,我还发现使用1个节点(16个处理器)时没有内存问题,但使用2个或更多节点时内存问题很明显。你知道这怎么可能吗?在我看来,这个问题不可能是我的编码错误,但我以前就错了。