【发布时间】:2016-01-20 10:01:34
【问题描述】:
在我的程序中,我只想并行运行一个 for 循环。其余代码应串行运行。尽管这可能不是最好的方法,但我想使用此处描述的方法(请参阅 Chris 的回答):
所以简而言之,我让 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