【问题标题】:MPI internal buffer memory issueMPI 内部缓冲内存问题
【发布时间】:2017-06-30 06:33:29
【问题描述】:

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

Insufficient memory to allocate Fortran RTL message buffer, message #174 = hex 000000ae.

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

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

【问题讨论】:

    标签: memory mpi openmpi


    【解决方案1】:

    在不了解更多细节的情况下,很难判断 MPI 是否有问题。您可以尝试使用 massif(valgrind 工具之一)来找出分配内存的位置。

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

    通常,请注意全对全通信所需的缓冲区大小,尤其是在大规模通信中。尽可能使用 MPI_IN_PLACE,或者以小块而不是单个大块的形式发送数据。

    【讨论】:

    • 我已将内存问题缩小到执行 MPI_Alltoall 和 MPI_Alltoallv 的子例程。此外,我还发现我在使用 1 个节点(16 个处理器)时没有内存问题,但是当我使用 2 个或更多节点时,内存问题很明显。知道这怎么可能吗?对我来说,这个问题似乎不可能是我的编码错误,但我以前错了。
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多