【问题标题】:Strategy for memory sharing between Python and an MPI processPython 和 MPI 进程之间的内存共享策略
【发布时间】:2017-05-16 08:57:46
【问题描述】:

我有一个生成系统矩阵的 Python 脚本。这在一个处理器上,在一个进程中连续发生,没有并行化。我也有一个求解器代码。代码在许多使用 MPI 的处理器上运行。

目前,Python 脚本创建矩阵,将其写入文件,通过subprocess.call(["mpirun ....."]) 调用求解器,求解器从文件中读取矩阵,求解,写回文件,最后 Python 脚本读回结果来自文件。

现在我正在寻找更有效的方法,避免文件读/写。一种想法是启动 MPI 进程并在后台运行它,然后通过 Python 和求解器之间的某种进程间通信传输数据和命令。

如何在 Python 中进行进程间通信?还是有更好的选择?

我要避免在 MPI (MPI4Py) 中使用 Python 脚本,因为可调试性和并行化没有意义。

【问题讨论】:

  • 你确定文件 I/O 是这里的限速步骤吗?
  • mpiexec 通常将其标准输入重定向到等级 0 的标准输入,而对所有等级的标准输出执行相反的操作。只需打开mpiexec 命令的管道,发送矩阵,然后读取结果。只需确保除 0 以外的任何等级都不会输出到标准输出。或者使用os.mkfifo()创建一个单独的FIFO。

标签: python mpi ipc


【解决方案1】:

最简单的方法是使用/dev/shm 或其他一些RAM 支持的临时文件系统。鉴于您无论如何都在使用 Python,这可能会提供非常合理的性能。只有当测量结果明确表明这是一个瓶颈并且有提高性能的潜力时,我才会使用更复杂的方法。

现在当然假设至少有一些 MPI 等级在运行 Python 脚本的同一节点上运行。如果不是所有排名都在同一个节点上运行,您可能希望在 MPI 求解器中广播/分散数据。

现在您可以使用 MPI 的工具来动态建立通信(MPI_Comm_connect 等)。或者您甚至可以使用动态流程管理,例如使用 MPI_Comm_spawn 而不是 Python 中的 mpirun。我认为这将引入更多的复杂性,并且与 RAM 支持的文件相比可能不会显着提高性能。它也可能在 HPC 系统上得不到很好的支持。

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2021-03-26
    • 2021-06-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多