0

我有一些设置,其中所有进程都获得了连续的工作块,并且我想在最后将所有输出一起保存为单个文件,如下所示:

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. 这显然是不可取的。如果我希望输出最终成为一个文件,那么这种情况下的最佳做法是什么?

4

1 回答 1

0

在这个问题中找到了解决我问题的答案。使用 OpenMPI,运行

mpirun -np N --mca mpi_yield_when_idle 1 ./a.out

产生任何正在等待阻塞操作的进程。这是以增加跨进程通信延迟为代价的,但这对于我的用例来说不是问题,因为它在执行计算时不发送任何消息。

于 2019-12-03T18:40:30.647 回答