2017-05-24 162 views
0

我看到有人用MPI_Brier使用C(Segmentation fault while using MPI_Barrier in `libpmpi.12.dylib`)和C++(Why does MPI_Barrier cause a segmentation fault in C++)產生段錯誤。但是,我不會重現他們得到的錯誤。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個節點崩潰。它會運行正常,1到10個節點除外2.因爲這也發生在C和C++中隨機發生,所以我認爲MPI庫中某處可能存在一些隱藏的錯誤。這只是我的猜測。任何人都可以幫忙嗎?

+0

不要使用'include'mpif.h''。使用'使用mpi'和編譯器將幫助你捕獲許多像這樣的錯誤。 –

回答

1

只需更換

call MPI_Barrier(MPI_COMM_WORLD) 

call MPI_Barrier(MPI_COMM_WORLD, impi_error) 

請注意,如果你的Fortran編譯器和MPI庫支持Fortran的2008年,你也可以選擇與

取代

include mpif.h 

use mpi_f08 

並且您將不再需要impi_error參數,因爲Fortran 2008綁定使此可選

+0

非常有趣!添加可選參數可以讓分段故障消失。尼斯答案兄弟! –

+0

它不是可選的!無論如何,直到mpi_f08。 –

+2

另外,如果您的編譯器/庫不支持Fortran 2008,您仍可以使用mpi而不是include(如其他地方所述)。 –