如何在MPI部分之外处理IO等

时间:2014-04-06 17:09:19

标签: c++ mpi

用MPI编写排序程序。拥有处理MPI范围之外的IO的代码可能是最好的,例如,在排序之前读取数据文件,在排序后将排序后的数据写入文件。

所以在我的main函数中,我在MPI_Init之前输入了输入,在MPI_Finalize之后输出。但它似乎没有按照我想要的方式工作。因为我试图在MPI_Init之前打印出一行“*”并猜测是什么,所以它是n_procs次而不是一次。在MPI代码中处理IO的最佳方法是什么?

int main()
{
   read in data;
   cout << "************************";
   MPI_Init();
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
   MPI_Comm_rank(MPI_COMM_WORLD, &nproc);
   if(rank == 0)
   {
      mergesort_parallel; // recursively
   }
   else
   {
      MPI_Recv subarray from parent;
      mergesort_parallel(subarray);
      MPI_Send subarray after sorting to parent;
      MPI_Finalize();
      return 0;
   }
   MPI_Finalize();

   output sorted data to file;
}

1 个答案:

答案 0 :(得分:1)

流程由 mpiexec / mpirun 创建,并在调用MPI_Init()之前存在。因此,它打印** * 行的次数等于进程计数。我建议在根进程的代码中使用标准I / O例程,如fopen(), fread()等。即。

If(myrank == 0)
{
  read file into buffer of root ; //Master I/O.
}
else
{
other code ; 
}
MPI_Finalize();
return 0; 
}

此外,将MPI_Finalize()return 0置于Ifelse条件之外。如果要将文件的一部分并行读入进程的各个缓冲区,则转到MPI I / O,即使用MPI提供的I / O函数,如MPI_File_open(), MPI_File_set_view()等。