MPI初始化的错误

时间:2015-01-20 10:36:24

标签: c parallel-processing mpi

我对并行性有疑问。我有一部分代码,我已经应用了parallelizme的概念,这部分代码必须在循环中重复N次,但我不能在循环中初始化MPI,因为显示" MPI_Init(89):不能多次调用MPI_INIT或MPI_INIT_THREAD"如果我在循环之前启动每个进程,它将处理所有循环,而不是目标。

for (int i = 0; i <N; i ++)
{
the parallel area
}

我希望循环中的每个i,K进程执行并行区域。

1 个答案:

答案 0 :(得分:1)

在您的情况下分配计算的规范方法是在所有MPI进程中运行循环并使除排名0之外的每个排名跳过序列部分:

// Obtain the rank
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

for (i = 0; i < N; i++)
{
   if (rank == 0)
   {
      // Some serial calculations
   }

   //
   // Parallel part
   //

   if (rank == 0)
   {
      // More serial calculations within the loop
   }
}

如果您需要在串行计算中传达排名0中生成的数据,则可以在并行部分的开头使用点对点操作或集合,如MPI_BcastMPI_Scatter。然后,您可以将分布式数据恢复到0级,以便在并行块末尾的MPI_GatherMPI_Reduce的第二个串行部分中进一步处理。

另一种规范方法是使用主工作者模式,其中一个进程(主服务器)将工作项分发给一组工作进程,这些进程只是在接收工作 - &gt;循环中旋转。 流程工作 - &gt; 返回结果


关于MPI的多重初始化,可以检查它是否已经完成:

int done_already;

MPI_Initialized(&done_already);
if (!done_already)
   MPI_Init(NULL, NULL);

请注意,一旦通过调用MPI_Finalize完成MPI,在当前执行程序期间 就无法重新初始化。