1

ParallelIO用の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要素)両方のプロセスはソート関数を呼び出します。ソート機能の結果、プロセス0は:0,1,2,3(4要素)プロセス1は:4,5,6,7,8,9(6要素)

次に、この出力を新しい出力ファイルに書き込む必要があります。プロセス0は、オフセット0に書き込むときに正しく書き込みます。しかし、プロセス1は、ファイルを書き込む場所のオフセットをどのように知るのでしょうか。書き込むためにファイルビューを定義する必要があることはわかっていますが、新しい変位はどうなるでしょうか。MPI_Exscanでできると思いますが、どうすればいいのかわかりません...誰か助けてくれませんか??

前もって感謝します

4

2 に答える 2

4

もちろん; MPI_Exscanローカルの要素数でwithを使用しMPI_SUMて、自分の「左側」の総数を取得し、それをビューで使用します(オフセットとして、またはビューを定義するために作成するタイプで)。

これは、各ランクが「ランダムな」(まあ、2*rank+1)サイズの文字配列(ランク0の場合は「0」など)を生成し、MPI_Exscanを使用して書き込み時に使用するオフセットを見つけてから、書き込みを行う小さなFortranプログラムです。

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 
于 2012-11-04T00:23:35.530 に答える
0

あなたの説明は少しあいまいですが、いずれにせよ、プロセス 1 は、使用するオフセットを含むメッセージをプロセス 2 に送信するだけです。

于 2012-11-03T21:15:52.860 に答える