2017-10-24 10 views
0

私はMPIを初めて使用しており、バイナリファイルの読み取りに苦労しています。 具体的には、バイナリファイルに格納されている$ 198 \ times 50 \ times 50 $整数の配列(具体的には16ビットの整数)があります。このファイルを処理するために2つの計算ノードを使用したいと思います。したがって、2つのMPIプロセスがあり、各プロセスは入力の半分を処理します。私は関数MPI_FILE_READ_ATを使ってそれぞれの領域を読み込んでいます。私は、配列の値が関数呼び出しに渡す変数/引数 'バケット'を埋めることを期待しています。しかし、バケツのエントリから健全性のチェックをプリントすると、バケツの値がすべて間違っていることがわかります。私は議論に間違っていると感じています。MPI I/Oを使用してバイナリファイルを読み取るときに不正確な結果が発生する

program main 
use mpi 
implicit none 

integer :: i, error, num_processes, id, fh 
integer(MPI_OFFSET_KIND) :: filesize, offset 
integer(MPI_OFFSET_KIND) :: num_bytes_per_process 
integer(MPI_OFFSET_KIND) :: num_bytes_this_process 
integer :: num_ints_per_process, num_ints_this_process 
integer(kind = 2), dimension(:), allocatable :: bucket 
character(len=100) :: inputFileName 
integer, parameter :: INTKIND=2 

! Initialize 
inputFileName = 'xyz_50x50' 
print *, 'MPI_OFFSET_KIND =', MPI_OFFSET_KIND 

! MPI basics 
call MPI_Init (error) 
call MPI_Comm_size (MPI_COMM_WORLD, num_processes, error) 
call MPI_Comm_rank (MPI_COMM_WORLD, id, error) 

! Open the file 
call MPI_FILE_OPEN(MPI_COMM_WORLD, inputFileName, MPI_MODE_RDONLY, & 
      MPI_INFO_NULL, fh, error) 

! get the size of the file 
call MPI_File_get_size(fh, filesize, error) 

! Note: filesize is the TOTAL number of bytes in the file 
num_bytes_per_process = filesize/num_processes 
num_ints_per_process = num_bytes_per_process/INTKIND 
offset = id * num_bytes_per_process 

num_bytes_this_process = min(num_bytes_per_process, filesize - offset) 
num_ints_this_process = num_bytes_this_process/INTKIND 

allocate(bucket(num_ints_this_process)) 
call MPI_FILE_READ_AT(fh, offset, bucket, num_ints_this_process, & 
       MPI_SHORT, MPI_STATUS_SIZE, error) 

do i = 1, num_ints_this_process 
    if (bucket(i) /= 0) then 
     print *, "my id is ", id, " and bucket(",i,")=", bucket(i) 
    endif 
enddo 

! close the file 
call MPI_File_close(fh, error) 

! close mpi 
call MPI_Finalize(error) 

end program main 
+0

すべてのFortran質問について[tag:fortran]を使用してください。特定のバージョンはあまり重要ではありません。 MPIライブラリのバージョンとコンパイラのバージョンが重要です。 –

+0

gcc 5.2に付属のmvapich2/2.2を使用しています。012 –

答えて

2

は、あなたの代わりにMPI_STATUS_SIZEMPI_STATUS_IGNOREを使用する必要があります(FWIW、私はこれをFIXEない限り、私はこのプログラムをコンパイルすることができません)

call MPI_FILE_READ_AT(fh, offset, bucket, num_ints_this_process, & 
       MPI_SHORT, MPI_STATUS_IGNORE, error) 

ノートをそのすべてのMPIタスクは、でファイルを読み込むので、時には、パフォーマンスを向上させるために、集合的にMPI_File_read_at_all()サブルーチンを使用してください。

+0

公正であるために、ほとんどのMPI実装はこれをコンパイルします。しかし、いくつかはそれをキャッチします。 –

+0

十分に公正な、私はこれがコンパイラに関連するより多くの動作だと思います。 '' 'gfortran 7.1.0''はコンパイルに失敗しますが、' 'gfortran 4.8.5''は幸せなパンダです(どちらも最新のOpen MPIマスターでテスト済み) –

+0

ありがとうございます。 MPI_STATUSをMPI_STATUS_IGNOREに変更すると出力が固定されました。 –

関連する問題