我有一个生成系统矩阵的Python脚本。这种情况在一个处理器上串行发生,在一个进程中,没有任何并行化。我也有一个求解器代码。该代码在许多使用MPI的处理器上运行。
目前,Python脚本创建矩阵,将其写入文件,通过subprocess.call(["mpirun ....."])
调用求解器,解算器从文件中读取矩阵,求解,写回文件,最后Python脚本读取从文件中返回结果。
现在我正在寻找更高效的东西,避免文件读/写。一个想法是启动MPI进程并在后台运行它,然后通过Python和解算器之间的某种进程间通信传输数据和命令。
如何在Python中进行进程间通信?或者有更好的选择吗?
我想避免的是在MPI(MPI4Py)中使用Python脚本,因为可调试性并且因为没有任何意义的并行化。
答案 0 :(得分:1)
最简单的方法是使用/dev/shm
或其他一些RAM支持的临时文件系统。鉴于您无论如何都在使用Python,这可能会给出非常合理的性能。只有当测量结果明确表明这是瓶颈并且有可能提高性能时,我才会采用更复杂的方法。
现在当然假设至少有一些MPI排名运行在Python脚本运行的同一节点上。如果并非所有排名都在同一节点上运行,您可能希望在MPI解算器中广播/分散数据。
现在您可以使用MPI的工具来动态建立通信(MPI_Comm_connect
等)。或者您甚至可以使用动态流程管理,例如使用MPI_Comm_spawn
代替Python中的mpirun
。我认为,与RAM支持的文件相比,这会带来更多的复杂性,并且可能不会带来显着的性能提升。它在HPC系统上也可能得不到很好的支持。