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