我对并行性有疑问。我有一部分代码,我已经应用了parallelizme的概念,这部分代码必须在循环中重复N次,但我不能在循环中初始化MPI,因为显示" MPI_Init(89):不能多次调用MPI_INIT或MPI_INIT_THREAD"如果我在循环之前启动每个进程,它将处理所有循环,而不是目标。
for (int i = 0; i <N; i ++)
{
the parallel area
}
我希望循环中的每个i,K进程执行并行区域。
答案 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_Bcast
或MPI_Scatter
。然后,您可以将分布式数据恢复到0级,以便在并行块末尾的MPI_Gather
或MPI_Reduce
的第二个串行部分中进一步处理。
另一种规范方法是使用主工作者模式,其中一个进程(主服务器)将工作项分发给一组工作进程,这些进程只是在接收工作 - &gt;循环中旋转。 流程工作 - &gt; 返回结果。
关于MPI的多重初始化,可以检查它是否已经完成:
int done_already;
MPI_Initialized(&done_already);
if (!done_already)
MPI_Init(NULL, NULL);
请注意,一旦通过调用MPI_Finalize
完成MPI,在当前执行程序期间 就无法重新初始化。