2017-05-24 3 views
0

C(Segmentation fault while using MPI_Barrier in `libpmpi.12.dylib`)とC++(Why does MPI_Barrier cause a segmentation fault in C++)を使用してMPI_Barrierでセグメンテーションフォルトを生成する人がいました。しかし、私は彼らが得るエラーを再現しません。fortran MPI_Barrierでセグメンテーションフォールト

しかし、今私は同じエラーfortran MPI_Barrierを取得します。 私のコードは次のように簡単です:

program main 

implicit none 

include 'mpif.h' 


! local variables 
! 
character(len=80) :: filename, input 
character(len=4) :: command 
integer :: ierror, i, l, cmdunit 
logical :: terminate 
integer :: num_procs, my_id, impi_error 
real :: program_start, program_end 
call MPI_INIT(impi_error) 
call MPI_COMM_RANK(MPI_COMM_WORLD,my_id,impi_error) 
call MPI_COMM_SIZE(MPI_COMM_WORLD,num_procs,impi_error) 
call MPI_Barrier(MPI_COMM_WORLD) 
program_start = MPI_Wtime() 
filename='sc.cmd' 
cmdunit=8 
print *, my_id, cmdunit 
call MPI_Barrier(MPI_COMM_WORLD) 
call MPI_Barrier(MPI_COMM_WORLD) 
call MPI_Barrier(MPI_COMM_WORLD) 
call MPI_Barrier(MPI_COMM_WORLD) 
call MPI_Barrier(MPI_COMM_WORLD) 
program_end = MPI_Wtime() 
if (my_id == 0) then 
    write(*,'(a,F25.16,a)') "MDStressLab runs in ", program_end -    program_start, " s." 
endif 
call MPI_FINALIZE(impi_error) 
end program 

コードについて特別な何もありません。しかし、コマンドmpif90 tmp.f90を使用してコードをコンパイルした後、コマンドmpirun -n 2 ./a.outを実行してください。それは私に与えます:

  0   8 
      1   8 

Program received signal SIGSEGV: Segmentation fault - invalid memory  reference. 

Backtrace for this error: 

Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 

Backtrace for this error: 
#0 0x7FBF2C700E08 
#1 0x7FBF2C6FFF90 
#0 0x7F2EDF972E08 
#2 0x7FBF2C3514AF 
#1 0x7F2EDF971F90 
#2 0x7F2EDF5C34AF 
#3 0x7FBF2CA4F808 
#4 0x400EB4 in MAIN__ at tmp.f90:? 
#3 0x7F2EDFCC1808 
#4 0x400EB4 in MAIN__ at tmp.f90:? 
-------------------------------------------------------------------------- 
mpirun noticed that process rank 1 with PID 35660 on node min-virtual-machine exited on signal 11 (Segmentation fault). 
-------------------------------------------------------------------------- 

面白いことは、2つのノードでクラッシュすることです。 2を除いて1〜10のノードでうまく動作します。これはCやC++でもランダムに起こるので、MPIライブラリのどこかに隠れたバグがあるかもしれません。それは私の推測です。誰も助けてくれますか?

+0

'include 'mpif.h''を使用しないでください。 'use mpi'を使うと、コンパイラはこのような多くのエラーを捕まえるのに役立ちます。 –

答えて

1

あなたのFortranコンパイラと2008年FortranのMPIライブラリのサポート場合、あなたも

include mpif.h 

を交換するためのオプションを持っていることだけ

call MPI_Barrier(MPI_COMM_WORLD, impi_error) 

call MPI_Barrier(MPI_COMM_WORLD) 

を交換ノート

use mpi_f08 

Fortran 2008バインディングでこれを任意にするため、impi_errorパラメータは必要ありません

+0

非常に興味深い!オプションの引数を追加すると、セグメンテーションフォルトが消えます。ニースアンサー! –

+0

これはオプションではありません!とにかくmpi_f08まで。 –

+2

コンパイラ/ライブラリがFortran 2008をサポートしていない場合でも、インクルードの代わりに 'use mpi'を使用することができます(他の場所で述べたように)。 –

関連する問題