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ライブラリのどこかに隠れたバグがあるかもしれません。それは私の推測です。誰も助けてくれますか?
'include 'mpif.h''を使用しないでください。 'use mpi'を使うと、コンパイラはこのような多くのエラーを捕まえるのに役立ちます。 –