我正在处理大量的串行代码,我试图让它们在MPI下运行。目前我的文件(父母及其子文件)如下所示。我的主要问题是我的导入MPI的文件导致N
进程从一开始就产生。
File1 (Imports->) File2 (Imports->) File3(Where MPI is imported)
我要做的是,我的大部分序列代码保持不变,然后让部分代码在MPI下运行。我有类似于以下的内容
import file2
def main():
print "Testing"
function1():
def function1():
function2():
导入文件3
def function2():
answers = function3()
def function3():
from mpi4py import MPI
if rank == 1:
...
elif rank == 0:
...
... # Do work with MPI and return stuff to file2.py
这里发生的是Testing
为File1.py
开始的每个进程输出到控制台。即当我只希望运行print语句时,mpiexec -n 2 python file1.py
会在Testing
中产生2个输出。但是,在没有MPI导入的情况下运行相同的命令只会导致打印Testing
。那么我有可能将MPI分离为文件3而不是所有三个文件。
答案 0 :(得分:0)
与所有MPI程序一样,不仅仅是python程序,mpiexec启动程序的N个实例。虽然你没有"使用mpi",但mpiexec仍在运行python解释器。
您可以尝试使用各种程序。尝试' mpiexec -np 3 date'。日期不是mpi程序,但您仍会看到三个日期实例。
为了获得你想要的东西,你可能需要研究动态过程的东西,但这并不是普遍支持的。从概念上讲,你会产生N个进程来进行MPI工作。这是一个很好的心理模型,但在实践中并不常见。
答案 1 :(得分:0)
MPI并行化意味着全局mpiexec
同时初始化整个程序n
次,每个进程只能按其等级区分。您描述的并行化模型听起来更像是一个fork / join模型,其中并行化在程序的中间位置开始和结束(例如线程编程)。
如果你牢记MPI的预期思维方式,那么制作一个符合你想要的Python程序应该不会太难。当然,有几个进程可以运行相同的#34;启动代码"没有理由,但除非这项任务要求很高(即占用大量内存),否则这不是问题。
如果您真的想在Python程序中间生成MPI进程,我相信您可以使用例如subprocess
模块,您可以通过mpiexec
从那里开始新的Python实例。但是,并行会话的最终结果无法在没有先将其转储到磁盘的情况下传递给原始Python程序,除非结果足够小以通过子进程本身传递。
答案 2 :(得分:0)
虽然MPI传统上一直是100%并行程序的想法,但是对于更新的MPI版本,可以(并且很容易使用mpi4py)从python脚本中生成MPI进程。
我在回答基本相同的问题时给出了一个如何做到这一点的例子:https://stackoverflow.com/a/50022229/2305545
示例来自mpi4py文档的dynamic process management tutorial。
请注意,某些MPI实现(如MSMPI或Cray MPICH版本)不支持此类流程生成。