使用 mpi4py 进行预处理和后处理?

问题描述 投票:0回答:3

我想编写一个如下所示的脚本:

Execute a pre-processing function (only 1 process should do this; all others wait until this is done)
--------
All processes then do the main function in parallel
--------
Finally, after all processes finish, execute a post-processing function

我尝试过:

from mpi4py import MPI
*pre-processing
MPI.Init()
*parallel script
MPI.Finalize()
*post-processing

但是所有核心都在运行脚本的所有部分

python mpi mpi4py
3个回答
0
投票

MPI 不会生成线程:每个核心都运行整个程序。

MPI_Init
不是并行区域的开始:它执行缓冲区分配、发现网络等操作。

所以是的,init之前和finalize之后的所有内容都由每个进程执行。

解决方案:将

MPI_Init
一直移动到顶部,并在
if (myrank==0)
子句中执行单进程的内容。


0
投票

我最终找到了一个适合我的解决方案。 等级 0 充当预处理器,然后将主脚本处理委托给所有其他等级,然后进行后处理。它的工作原理如下:

if rank == 0:
    pre_processing()
    for i in range(1,size):
        comm.sendrecv('pre-processing finished; ask for work', dest=i)
    while (work_remains):
        source = comm.recv(source=MPI.ANY_SOURCE)
        comm.send(work_remains.pop(), dest=source)
    for i in range(1,size):
        comm.send('no more work', dest=i)
        comm.recv(source=i)
    post_processing()

else:
    comm.recv(source=0) # Blocker; wait for rank 0 to finish
    comm.send(rank, dest=0) # Ask for work
    main_script_processing()

0
投票

当您

from mpi4py import MPI
时,会隐式调用
MPI.Init()
。 对于
MPI_Finalize()
来说也是如此:当你的 python 脚本退出时,它会被隐式调用。

您可以通过

MPI.Is_initialized()
进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.