python - 无法发送超过特定长度的 MPI 消息

标签 python python-2.7 mpi openmpi mpi4py

我正在使用 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)

我还尝试使用显式指定的固定长度缓冲区将 pickled send/recv 替换为非 pickled Send/Recv,但这对问题没有任何影响。

奇怪的是,该问题似乎并没有影响使用同一通信器的对等进程之间的传输。

最佳答案

问题已解决:OpenMPI 对 Docker 创建的虚拟网络接口(interface)的存在感到困惑。删除接口(interface)使奇怪的现象消失了,尽管我们也可以告诉 OpenMPI ignore the interface .

关于python - 无法发送超过特定长度的 MPI 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33644807/

相关文章:

Python:如何使脚本在特定时间每天运行?

eclipse - Eclipse 如何正确识别 MPI 工件?

python - 在向量化操作中调用 numpy 函数会影响性能吗?

python - 如何从 .cfg 文件加载 Keras 模型?

c# - Lambda 表达式,从 Python 到 C#

从 void 到 MPI_Aint 的转换

mpi - OpenMP 和 MPI 混合程序比纯 MPI 更快吗?

javascript - 无法使用 Python 抓取网页

python - sqlalchemy create_engine() 如果数据库已经存在

python - 在 Python 2.7 中获取(并附加)正确的文件路径