我有一些设置,在这些设置中,所有进程都有一个连续的工作块,我希望在最后将所有输出保存为一个文件,如下所示:
int start_ind = split_work(mpi_rank, mpi_size), end_ind = split_work(mpi_rank+1, mpi_size);
vector<double> results;
for(int i=start_ind; i<end_ind; i++){
results[i] = do_work(i);
}
MPI_File handler;
MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &handler);
MPI_Status status;
MPI_File_write_at(handler, start_ind*sizeof(double), results.data()+start_ind,
end_ind - start_ind, MPI_DOUBLE, &status);
MPI_File_close(&handler);然而,有时工作是不平衡的,一半的过程可以在另一半之前完成工作时间。据我所知,这些进程继续使用100%的CPU旋转数小时,直到所有进程到达MPI_File_open为止。这显然是不可取的。如果我希望输出作为一个文件结束,那么这种情况的最佳实践是什么?
发布于 2019-12-03 18:40:30
我发现an answer in this question解决了我的问题。与OpenMPI一起运行
mpirun -np N --mca mpi_yield_when_idle 1 ./a.out生成等待阻塞操作的任何进程。这是以跨进程通信延迟增加为代价的,但这对我的用例来说不是一个问题,它在执行计算时不发送任何消息。
https://stackoverflow.com/questions/58982454
复制相似问题