我一直在尝试编写一个子程序,它将使用MPI编写要在大型代码中使用的文件。这个子程序将在整个代码中被多次调用,这是非常巨大的,所以我试图尽可能快地完成它。我面临的一个问题是如何复制Fortran"替换"状态(使用fortran打开文件时)。也就是说,如果文件不存在或者如果文件存在则替换它,我很难以创建文件的方式设置MPI。有没有首选的方法呢?我觉得很奇怪,MPI没有这种模式。
这是一个MWE:
PROGRAM main
use mpi
integer ierr, i, global_rank, BUFSIZE, thefile
integer, parameter :: nx=200, ny=200, nz=10
integer, dimension(nx,ny,nz) :: uu, vv, ww
integer :: np
integer(kind=MPI_OFFSET_KIND) disp
bufsize=size(uu)
call MPI_INIT(ierr)
call MPI_COMM_size(MPI_COMM_WORLD, np, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, global_rank, ierr)
do i = 1, nx
uu(i,:,:) = i
enddo
do i = 1, ny
vv(:,i,:) = i
enddo
do i = 1, nz
ww(:,:,i) = i + nz*global_rank
enddo
call MPI_FILE_OPEN(MPI_COMM_WORLD, 'testfile.bin', &
MPI_MODE_WRONLY + MPI_MODE_CREATE + MPI_MODE_EXCL, &
MPI_INFO_NULL, thefile, ierr)
print*,ierrr
disp = global_rank * BUFSIZE * 4 ! 4 byte integers
call MPI_FILE_SET_VIEW(thefile, disp, MPI_INTEGER, &
MPI_INTEGER, 'native', &
MPI_INFO_NULL, ierr)
call MPI_FILE_WRITE(thefile, uu, BUFSIZE, MPI_INTEGER, &
MPI_STATUS_IGNORE, ierr)
disp = np*bufsize*4 + global_rank * BUFSIZE * 4
call MPI_FILE_SET_VIEW(thefile, disp, MPI_INTEGER, &
MPI_INTEGER, 'native', &
MPI_INFO_NULL, ierr)
call MPI_FILE_WRITE(thefile, vv, BUFSIZE, MPI_INTEGER, &
MPI_STATUS_IGNORE, ierr)
disp = 2*np*bufsize*4 + global_rank * BUFSIZE * 4
call MPI_FILE_SET_VIEW(thefile, disp, MPI_INTEGER, &
MPI_INTEGER, 'native', &
MPI_INFO_NULL, ierr)
call MPI_FILE_WRITE(thefile, ww, BUFSIZE, MPI_INTEGER, &
MPI_STATUS_IGNORE, ierr)
call MPI_FILE_CLOSE(thefile, ierr)
call MPI_FINALIZE(ierr)
END PROGRAM main
P.S。:我在C中遇到了一些类似的问题,但我无法做出任何声称在Fortran中解决问题的工作(可能是由于我对C的无知)。
答案 0 :(得分:0)
MPI标准中没有MPI_FILE_TRUNCATE
这样的东西。
随意在Mailing list中提出要求。
与此同时,您可以无条件MPI_File_delete()
并忽略MPI_ERR_NO_SUCH_FILE
错误代码。