【问题标题】:Can I reset MPI instance in c++?我可以在 C++ 中重置 MPI 实例吗?
【发布时间】:2014-04-07 09:40:43
【问题描述】:

我用 MPI 编写了一个排序算法。它是递归合并排序,左孩子在与父进程相同的进程中对数组的一半进行排序,而右孩子获得一个新进程并从父进程接收一半数组,然后将排序后的数组发送回父进程。现在我需要对一堆整数文件进行排序。这是我目前的设计:

int main()
{
  MPI_init();
  if(my_rank == 0)
  {
    foreach data file
    {
      sort_mpi(array);
    }
  }
  else
  {
    MPI_Recv(right_array...);
    sort_mpi(right_array);
    MPI_Finalize();
  }
  MPI_Finalize();
}

使用此代码,第一个文件被排序并移至下一个文件。然而,在 for 循环的第二次交互中,它只停留在 0 级并且永远不会进入 1 级。如果我可以在进入下一个文件之前重置 MPI 实例应该是理想的。有没有办法做到这一点?

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

    您不需要重置 MPI - 您需要有一个点,所有实例都“冻结”在其中,并且只有在所有实例都到达该点后才继续...

    因为这是作业 - 我不会告诉你方法名称,但我确实希望它有所帮助。
    想想排序的设计,以及您需要所有节点处于什么状态、何时以及如何执行它。

    这个例子可能会有所帮助(希望它不会解决你的功课,而只是引导你朝着正确的方向前进)Bitonic Sorting with MPI

    【讨论】:

    • 当我将排序后的数组从右孩子发送回父母时,我应该使用 MPI_Isend 和 MPI_Wait 吗?
    • 看起来我需要一个 MPI_Barrier。我应该在它进入任何排名之前添加它吗(在 if rank ==0 之前)?
    • 所以一个 MPI_Barrier 说“我不想继续 - 直到所有线程都在这里”。考虑一下代码中需要停止计算的点,或者要在不同节点之间交换更多数据(这实际上取决于您使用的算法......这是一个很好的例子,您可以从中学习:stackoverflow.com/questions/7433723/bitonic-sorting-with-mpi
    • 我只是意识到我的问题不是让所有进程都到达同一点。由于我正在处理多个数据文件(对于 0 级循环),每次对一个数据文件进行排序时,除 0 级以外的所有进程都会退出(MPI_Finalize)。因此,当 rank 0 开始下一个数据文件时,没有进程 1、2 等可用。我似乎无法为非零进程删除 MPI_Finalize,它会给我错误。如何处理最终确定的非零进程?
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多