2017-06-25 12 views
0

並列プログラムを実行する場合、後処理のために結果をファイルに書き込む必要があります。これらのファイルは、タイトル(文字/文字列)+バイナリ配列(実数/浮動小数点数)などの特定の形式を持つことがよくあります。これは2つのステップで行うことができます:1.マスタープロセッサーを使用して新しいファイルを作成し、タイトルを書き込みます。 2. MPI IOを使用して配列データをこのファイルに追加します。 MPI_FILE_OPENのamodとしてMPI_MODE_APPENDを使用して、既存のファイルにデータを追加しようとしましたが、この手順は失敗します。 FORTRANコードMPI IOを使用して既存のファイルに配列を追加する

(私だけMPI_MODE_APPENDを試してみましたが、MPI_MODE_APPEND + MPI_MODE_WRONLY)である
call MPI_File_open(comm, filename, MPI_MODE_APPEND+MPI_MODE_WRONLY, & 
       MPI_INFO_NULL, fh, ierr) 

はまた、新しい結果は、古いデータを上書きします。この声明をどのように修正すればよいですか?どうもありがとう。

+1

完全なコードはどうですか? PoisFFTの私のtestmpi.f90と同じ手順でビューを設定していますか?コードを他の人にも表示してください。 –

答えて

0

ありがとうございました。私はそれを作ると思う。 MPI_MODE_APPEND + MPI_MODE_WRONLY:元のコードスニペットは

integer (kind=MPI_OFFSET_KIND) :: disp = 0 
integer :: n1, n2, n3 
double precision, dimension(0:n1+1,0:n2+1,0:n3+1) :: iodata 
integer, dimension(ndim) :: arraysize, arraystart 
integer, dimension(ndim) :: arraygsize, arraysubsize 

    ... 

    call MPI_Type_create_subarray(ndim, arraygsize, arraysubsize, arraystart, & 
           MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, & 
           filetype, ierr) 

    call MPI_Type_commit(filetype, ierr) 


    arraystart(:) = 1 

    call MPI_Type_create_subarray(ndim, arraysize, arraysubsize, arraystart, & 
           MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, & 
           mpi_subarray, ierr) 

    call MPI_Type_commit(mpi_subarray, ierr) 


    call MPI_File_open(cartcomm, filename, MPI_MODE_APPEND+MPI_MODE_WRONLY, & 
        MPI_INFO_NULL, fh, ierr) 

    call MPI_File_set_view(fh, disp, MPI_DOUBLE_PRECISION, filetype, 'native', & 
         MPI_INFO_NULL, ierr) 

    call MPI_File_write_all(fh, iodata, 1, mpi_subarray, status, ierr) 

は確かに、私は正しいモードを使用しました。しかし、私はオフセット/変位を設定せず、パラレルデータに0変位を付加しました。これはファイルを上書きすることを意味します。

私はそれは、引数DISPで現在位置を取得します

call MPI_FILE_GET_POSITION(fh, disp, ierr) 

あるMPI_FILE_OPEN後に別のステートメントを追加する必要があります。 dispは、追加されたデータの正しい位置を既存のファイルに与えます。

関連する問題