【问题标题】:How to simulate Fortran's "replace" equivalent for MPI's file_open如何为 MPI 的 file_open 模拟 Fortran 的“替换”等效项
【发布时间】: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 来执行一个进程来进行文件替换?

标签: io fortran mpi


【解决方案1】:

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

请随时在Mailing list 中询问。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2018-04-03
    • 2018-02-24
    • 2020-12-23
    相关资源
    最近更新 更多