【问题标题】:How to mix serial and parallel code using MPI如何使用 MPI 混合串行和并行代码
【发布时间】:2016-01-20 10:01:34
【问题描述】:

在我的程序中,我只想并行运行一个 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-loop)对吗?
其次,我如何告诉其他排名等待排名 0 完成?

【问题讨论】:

  • 也许 OpenMP 更适合您的问题。您是否正在或希望同时在多个计算节点上运行您的程序?
  • 在您编写伪代码时,所有内容都由第一个 if(comm.rank()==0) 语句保护,因此所有其他进程都将忽略该语句。所以我不确定所需的代码结构是什么。也许您想要一个串行-并行-串行序列,而不是尝试将并行块嵌套在串行块中?或者你想要别的东西?
  • @HristoIliev 我之所以没有使用 OpenMP 是因为全局变量的问题。但我不得不说,我既不是 OpenMP 方面的专家,也不是 MPI 方面的专家。
  • @HighPerformanceMark 如果可能的话,我想在串行块内嵌套一个并行块。 while 条件应按等级 0 进行测试,但 while 循环内的 for 循环应并行运行。
  • 您正在寻找的并行类型可以在 OpenMP 中找到。不在 MPI 中。回答您简短的后续问题:在 MPI 中,您只能访问进程中变量的值(除非您专门接收具有匹配发送的另一个进程变量)。在 OpenMP 中,如果它们是私有的,则不能。如果它们是共享的,那么您始终可以访问。

标签: c++ boost parallel-processing mpi


【解决方案1】:

这个:

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

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

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


* 通常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 2014-08-16
    • 2013-12-20
    • 2020-07-16
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多