等待 MPI-IO 同步的进程在 MPI_File_open 上旋转
Processes spinning waiting for MPI-IO to sync on MPI_File_open
我有一些设置,其中所有进程都获得连续的工作块,我想在最后将所有输出一起保存为一个文件,如下所示:
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
。这显然是不可取的。如果我希望输出最终成为一个文件,那么这种情况的最佳做法是什么?
我发现 an answer in this question 解决了我的问题。使用 OpenMPI,运行
mpirun -np N --mca mpi_yield_when_idle 1 ./a.out
yields 任何正在等待阻塞操作的进程。这是以增加跨进程通信的延迟为代价的,但这对于我的用例来说不是问题,因为它在执行计算时不发送任何消息。
我有一些设置,其中所有进程都获得连续的工作块,我想在最后将所有输出一起保存为一个文件,如下所示:
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
。这显然是不可取的。如果我希望输出最终成为一个文件,那么这种情况的最佳做法是什么?
我发现 an answer in this question 解决了我的问题。使用 OpenMPI,运行
mpirun -np N --mca mpi_yield_when_idle 1 ./a.out
yields 任何正在等待阻塞操作的进程。这是以增加跨进程通信的延迟为代价的,但这对于我的用例来说不是问题,因为它在执行计算时不发送任何消息。