MPI写文件不等大小的向量

时间:2015-05-22 15:21:24

标签: file mpi

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

2 个答案:

答案 0 :(得分:1)

您不需要在每个处理器上使用相同数量的粒子。您需要的是每个处理器都参与其中。一个或多个甚至可能没有零粒子。

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);

答案 1 :(得分:0)

您需要执行

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

其中np是每个进程的粒子数,procnp是一个进程大小为nprocs的数组。这为您提供了关于所有其他过程中分子数量的每个过程的数组。通过根据进程ID计算偏移量,可以为每个进程正确选择MPI_File_set_view。这个用于获得偏移的psudocode就像是,

    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