MPI 写入文件大小不等的向量

MPI writing file unequal size vectors

我对在 MPI 中写入文件有一点疑问。假设我有 "N" 没有处理程序的进程。在程序结束时,每个进程将有 "m" 个粒子(位置+速度)。但是每个过程的粒子数 m 不同。我将如何在单个文件中写入所有粒子信息 (pos + vel)。我从搜索中了解到,我可以使用 MPI_File_open、MPI_File_set_view、MPI_File_write_all,但我需要在每个过程中具有相同的粒子数。我有什么想法可以在我的情况下做到这一点吗?

您需要执行

 MPI_Allgather(np, 1, MPI_INTEGER, procnp, 1, &
               MPI_INTEGER, MPI_COMM_WORLD, ierr)

其中 np 是每个进程的粒子数,procnp 是进程大小的数组 nprocs。这为您提供了关于所有其他进程的分子数量的每个进程的数组。这样 MPI_File_set_view 可以通过计算基于进程 ID 的偏移量为每个进程正确选择。这个获取偏移量的伪代码类似于,

    procdisp = 0
    !Obtain displacement of each processor using all other procs' np
    for i = 1, irank -1
        procdisp = procdisp + procnp(i)*datasize
    enddo

这是从 fortran 代码中提取的,所以 irank 是从 1 到 nprocs

您不需要在每个处理器上使用相同数量的粒子。您需要做的是让每个处理者都参与进来。一个或多个很可能具有零粒子,甚至。

Allgather 是一种很好的方法,所有进程之间交换的单个整数的开销不是很大。

但是,更好的方法是使用 MPI_SCAN:

incr = numparts;
MPI_Scan(&incr, &new_offset, 1, MPI_LONG_LONG_INT, 
                      MPI_SUM, MPI_COMM_WORLD);
new_offset -= incr; /* or skip this with MPI_EXSCAN, but \
                       then rank 0 has an undefined result */
MPI_File_write_at_all(fh, new_offset, buf, count, datatype, status);