【问题标题】:can't send MPI messages over a certain length无法发送超过一定长度的 MPI 消息
【发布时间】:2016-02-12 04:55:24
【问题描述】:

我正在使用 Python .7.10 在 Ubuntu 14.04.3 系统上运行基于 OpenMPI 1.10.1 构建的 mpi4py 2.0.0。出于某种原因,尝试发送大于 64 Kb 的消息会导致发送/接收挂起;但是,我能够使用完全相同的软件和 OpenMPI/mpi4py 包在其他 Ubuntu 14 系统上成功发送大消息。我还能够在使用 OpenMPI 的 C 程序中成功发送大型消息。这表明环境中有一些东西对 mpi4py 执行的 MPI 通信产生了不利影响。关于什么可能会干扰 mpi4py 的任何想法?

这是一个在 N 设置为 65537 或更大时在一个系统上运行并在另一个系统上挂起的代码示例。

import os
import sys

from mpi4py import MPI
import numpy as np

N = 65537

def worker():
    comm = MPI.Comm.Get_parent()
    size = comm.Get_size()
    rank = comm.Get_rank()

    buf = np.empty(N, np.byte)
    comm.Recv(buf=buf)

if __name__ == '__main__':
    script_file_name = os.path.basename(__file__)
    if MPI.Comm.Get_parent() != MPI.COMM_NULL:
        worker()
    else:
        comm = MPI.COMM_SELF.Spawn(sys.executable,
                        args=[script_file_name],
                        maxprocs=1)

        comm.Send(np.random.randint(0, 256, N).astype(np.byte), 0)

我还尝试使用明确指定的固定长度缓冲区将腌制发送/接收替换为非腌制发送/接收,但这对问题没有任何影响。

奇怪的是,这个问题似乎不会影响使用相同通信器的对等进程之间的传输。

【问题讨论】:

  • 很奇怪。 C 代码是否与 Python 代码等效,即它是否也使用 MPI_Comm_spawn?所有进程都在同一台主机上运行吗?如果您可以使用 GDB 附加到每个 Python 进程并生成主线程的堆栈跟踪,将会有所帮助。
  • 由虚拟网络接口引起的问题,正如您在响应 SO 上其他地方的类似问题时观察到的那样 :-)

标签: python python-2.7 mpi openmpi mpi4py


【解决方案1】:

问题已解决:OpenMPI 被 Docker 创建的虚拟网络接口的存在弄糊涂了。删除界面让怪异消失了,尽管也可以将 OpenMPI 告诉 ignore the interface

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 2018-05-25
    • 1970-01-01
    • 2013-08-20
    • 2022-01-21
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多