MPI_Exscan-如何用于并行文件写入

时间:2012-11-03 20:36:58

标签: mpi

我正在研究并行IO的一些MPI代码。 假设我有一个用文件写的数组[2,5,6,9,0,4,3,1,8,7],我有2个进程。

我定义文件视图以读取此文件的一部分。 过程0看到:2,5,6,9,0(5个元素) 过程1看到:4,3,1,8,7(5个元素) 两个进程都调用sort函数。作为排序功能的结果, 过程0有:0,1,2,3(4个元素) 过程1具有:4,5,6,7,8,9(6个元素)

现在我需要将此输出写入新的输出文件。 进程0会在偏移0处写入时正确写入。但是进程1如何知道偏移量在何处写入文件?我知道我需要定义一个文件视图来编写,但是新的位移是什么。我觉得MPI_Exscan可以做到这一点..但我不确定如何......有人可以帮忙吗?

先谢谢

2 个答案:

答案 0 :(得分:4)

不确定;在本地元素数量上使用MPI_ExscanMPI_SUM来获取您的“左”的总数,并在视图中使用它(作为偏移量,或者在您创建的类型中)定义你的观点。)

这是一个小的Fortran程序,其中每个排名生成一个“随机”(井,2*rank+1)大小的字符数组(等级0的'0'等),使用MPI_Exscan找出它应该使用的偏移量在写作时,然后写道:

program testexscan
    use mpi
    implicit none

    integer :: nelements, nleft, total
    character, allocatable, dimension(:) :: array

    integer :: rank, nprocs, ierr, fh
    integer(kind=MPI_OFFSET_KIND) :: disp

    call MPI_Init(ierr)

    call MPI_Comm_rank(MPI_COMM_WORLD, rank,  ierr)
    call MPI_Comm_rank(MPI_COMM_WORLD, nprocs, ierr)

    call generatedata(rank, array)

    nelements = size(array)
    call  MPI_Exscan   (nelements, nleft,  1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)

    print *, 'rank = ', rank, ' nelements = ', nelements, ' nleft= ', nleft

    call MPI_File_open(MPI_COMM_WORLD, 'output.txt', ior(MPI_MODE_WRONLY,MPI_MODE_CREATE),  &
                       MPI_INFO_NULL, fh, ierr)

    disp = nleft * 1    ! offset in bytes
    call MPI_File_set_view(fh, disp, MPI_CHARACTER, MPI_CHARACTER, "native", MPI_INFO_NULL, ierr )
    call MPI_File_write_all(fh, array, nelements, MPI_CHARACTER, MPI_STATUS_IGNORE, ierr)
    call MPI_File_close(fh, ierr)

    deallocate(array)

    call MPI_Finalize(ierr)

    contains

        subroutine generatedata(rank, arr)
        character, dimension(:), allocatable, intent(inout) :: arr
        integer, intent(in) :: rank

        nelements = rank * 2 + 1

        allocate(array(nelements))
        array = char(ichar("0")+rank)

        end subroutine generatedata

end program testexscan

运行此命令:

$ mpif90 -o testexscan testexscan.f90 
$ mpirun -np 4 ./testexscan
 rank =            0  nelements =            1  nleft=            0
 rank =            1  nelements =            3  nleft=            1
 rank =            2  nelements =            5  nleft=            4
 rank =            3  nelements =            7  nleft=            9
$ cat output.txt 
0111222223333333 

答案 1 :(得分:0)

您的描述有点模糊,但无论如何,进程1只能向进程2发送一条消息,其中包含要使用的偏移量。