我想编写一个如下所示的脚本:
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
但是所有核心都在运行脚本的所有部分
MPI 不会生成线程:每个核心都运行整个程序。
MPI_Init
不是并行区域的开始:它执行缓冲区分配、发现网络等操作。
所以是的,init之前和finalize之后的所有内容都由每个进程执行。
解决方案:将
MPI_Init
一直移动到顶部,并在if (myrank==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()
当您
from mpi4py import MPI
时,会隐式调用 MPI.Init()
。
对于 MPI_Finalize()
来说也是如此:当你的 python 脚本退出时,它会被隐式调用。
您可以通过
MPI.Is_initialized()
进行测试。