如何使用 MPI 混合串行和并行代码

How to mix serial and parallel code using MPI

在我的程序中,我只希望一个 for 循环是 运行 并行的。其余代码应该 运行 连续。尽管这可能不是最好的方法,但我想使用此处描述的方法(请参阅 Chris 的回答):

link

所以简而言之,我让等级 0 执行序列部分。

现在的问题是我有几个循环,包括一个 while 循环。结构如下:

# serial part
# start of while loop {
     # parallel part
# end of while loop
# end of serial part

代码结构如下所示:

boost::mpi::environment env;
boost::mpi::communicator comm;

if(comm.rank()==0)
{

while(...)
{

} // !!!! end the if loop here?

// start parallel for loop here
for(....){}


// continue serial part
 if(comm.rank()==0)
 {
 //...

} // end of while loop
} // end of if loop

打开while循环后直接关闭串行部分(if循环)是否正确?
其次,如何告诉其他等级等待等级 0 完成?

这个:

# serial part
# start of while loop 
     # parallel part
# end of while loop
# end of serial part

MPI 不是这样工作的。 MPI 程序中没有串行或并行区域。

当您启动一个 MPI 程序时,使用 mpiexecmpirun,您启动一​​个固定数量* 相同* 串行程序可能会不时地使用对 MPI 库的调用在它们之间进行通信。这些单独的系列程序运行ning最初仅在等级上*不同,每个人都必须根据此决定如何运行。这些串行程序之一的每个进程 运行 只能看到它自己的变量,并且必须完成工作 - 以调用 MPI 函数的形式 - 在不同进程之间传递这些值。


*通常