【发布时间】:2018-09-17 01:52:57
【问题描述】:
我一直在尝试编写一个子例程,该子例程将使用 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 的无知)。
【问题讨论】:
-
我同意这有点奇怪,没有 MPI 调用或选项,但如果有,我就逃过了。我想你可以只插入一行 Fortran 来执行一个进程来进行文件替换?