如何模拟Fortran"替换"相当于MPI的file_open

时间:2018-04-07 01:27:40

标签: io fortran mpi

我一直在尝试编写一个子程序,它将使用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的无知)。

1 个答案:

答案 0 :(得分:0)

MPI标准中没有MPI_FILE_TRUNCATE这样的东西。

随意在Mailing list中提出要求。

与此同时,您可以无条件MPI_File_delete()并忽略MPI_ERR_NO_SUCH_FILE错误代码。