2017-05-16 88 views
0

我有一个生成系统矩阵的Python脚本。这是在一个处理器上连续发生的,在一个进程中,没有任何并行处理。我也有解算器代码。代码使用MPI在许多处理器上运行。Python和MPI进程之间的内存共享策略

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

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

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

我想避免的是在MPI(MPI4Py)中使用Python脚本,这是因为可调试性以及并行化没有意义。

+1

您确定文件I/O是限速步骤吗? –

+0

'mpiexec'通常将其标准输入重定向到等级0的标准输入,而对于所有等级的标准输出则相反。只需打开一个管道到'mpiexec'命令,发送矩阵,然后读取结果。只要确保除标准输出外没有其他等级的输出。或者使用'os.mkfifo()'创建一个单独的FIFO。 –

回答

1

最简单的方法是使用/dev/shm或其他一些RAM支持的临时文件系统。鉴于你在Python中工作,这可能会给出非常合理的性能。只有在测量结果明确表明这是一个瓶颈并且有改进性能的潜力时,我才会诉诸于更复杂的方法。

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

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

相关问题