运行并行程序时,我们可能需要将结果写入文件以进行后处理。这些文件通常具有特定格式,例如: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)
此外,新结果会覆盖旧数据。我该如何纠正这个陈述?非常感谢。
答案 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为现有文件的附加数据提供了正确的位置。