【问题标题】:MPI writing file unequal size vectorsMPI 写入文件大小不等的向量
【发布时间】:2015-05-22 15:21:24
【问题描述】:

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

【问题讨论】:

    标签: file mpi


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      你需要执行

       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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多