Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在c+;中重置MPI实例吗+;?_C++_Mpi - Fatal编程技术网

C++ 我可以在c+;中重置MPI实例吗+;?

C++ 我可以在c+;中重置MPI实例吗+;?,c++,mpi,C++,Mpi,我用MPI编写了一个排序算法。它是递归的mergesort,左子级在与父级相同的进程中对数组的一半进行排序,而右子级获得一个新进程并从父级接收半数组,然后将排序后的数组发送回父级。现在我需要对一堆整数文件进行排序。以下是我目前的设计: int main() { MPI_init(); if(my_rank == 0) { foreach data file { sort_mpi(array); } } else { MPI_Re

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

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实例,那就太理想了。有什么方法可以做到这一点吗?

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

因为这是家庭作业-我不会告诉你方法名称,但我希望它能有所帮助。
考虑排序的设计,以及需要所有节点处于何种状态、何时以及如何实施排序


这个例子可能会有帮助(希望它不会解决您的家庭作业,但只是引导您朝着正确的方向前进)

当我将排序数组从正确的子级发送回父级时,是否应该使用MPI Isend和MPI USWAIT?请看一看,我似乎需要一个MPI\U屏障。我应该在它进入任何列组之前(如果列组==0之前)添加它吗?因此MPI_屏障说“我不希望任何东西继续-直到所有线程都在这里”。考虑代码中需要停止计算的点,或者需要在不同节点之间交换更多数据(这实际上取决于您使用的算法……这是一个很好的示例,您可以从中学习:我只是意识到我这里的问题不是让所有进程到达同一点。因为我处理的是多个数据文件(对于秩0上的循环),每次对一个数据文件进行排序时,秩0以外的所有进程都会退出(MPI_Finalize)。因此,当秩0启动下一个数据文件时,没有进程1、2等可用。我似乎无法删除非零进程的MPI_Finalize,这将给我带来错误。如何处理非零进程的终结?