用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;
}
答案 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
置于If
和else
条件之外。如果要将文件的一部分并行读入进程的各个缓冲区,则转到MPI I / O,即使用MPI提供的I / O函数,如MPI_File_open(), MPI_File_set_view()
等。