使用MPI IO将数组附加到现有文件

时间:2017-06-25 00:05:18

标签: io fortran mpi

运行并行程序时,我们可能需要将结果写入文件以进行后处理。这些文件通常具有特定格式,例如:title(字符/字符串)+二进制数组(real / float)。这可以通过两个步骤完成:1。使用主处理器创建新文件并写入标题。 2.使用MPI IO将数组数据附加到此文件。我尝试在MPI_FILE_OPEN中使用MPI_MODE_APPEND作为amod将数据附加到现有文件,但此步骤失败。 FORTRAN代码是(我只尝试了MPI_MODE_APPEND和MPI_MODE_APPEND + MPI_MODE_WRONLY)

 call MPI_File_open(comm, filename, MPI_MODE_APPEND+MPI_MODE_WRONLY, &
                 MPI_INFO_NULL, fh, ierr)

此外,新结果会覆盖旧数据。我该如何纠正这个陈述?非常感谢。

1 个答案:

答案 0 :(得分:0)

感谢@Vladimir提醒。我想我成功了。原始代码段是

 integer (kind=MPI_OFFSET_KIND) :: disp = 0
 integer :: n1, n2, n3
 double precision, dimension(0:n1+1,0:n2+1,0:n3+1) :: iodata
 integer, dimension(ndim) :: arraysize, arraystart
 integer, dimension(ndim) :: arraygsize, arraysubsize

   ...

  call MPI_Type_create_subarray(ndim, arraygsize, arraysubsize, arraystart, &
                                MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, &
                                filetype, ierr)

  call MPI_Type_commit(filetype, ierr)


  arraystart(:) = 1

  call MPI_Type_create_subarray(ndim, arraysize, arraysubsize, arraystart, &
                                MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, &
                                mpi_subarray, ierr)

  call MPI_Type_commit(mpi_subarray, ierr)


  call MPI_File_open(cartcomm, filename,    MPI_MODE_APPEND+MPI_MODE_WRONLY, &
                     MPI_INFO_NULL, fh, ierr)

  call MPI_File_set_view(fh, disp, MPI_DOUBLE_PRECISION, filetype, 'native', &
                         MPI_INFO_NULL, ierr)

  call MPI_File_write_all(fh, iodata, 1, mpi_subarray, status, ierr)

确实,我使用了正确的模式:MPI_MODE_APPEND + MPI_MODE_WRONLY。但是,我没有设置偏移/位移,并将并行数据附加0位移,这意味着覆盖文件。

我应该在MPI_FILE_OPEN之后添加另一个语句

call MPI_FILE_GET_POSITION(fh, disp, ierr)

它通过参数disp得到当前位置。 disp为现有文件的附加数据提供了正确的位置。