【问题标题】:segmentation fault with fortran MPI_Barrier [duplicate]fortran MPI_Barrier 的分段错误 [重复]
【发布时间】:2017-10-25 11:21:45
【问题描述】:

我看到人们使用 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 相同的错误。 我的代码很简单:

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,编译器将帮助您捕获许多类似这样的错误。

标签: fortran 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 绑定使其成为可选参数

【讨论】:

  • 非常有趣!添加可选参数确实让分段错误消失。不错的答案兄弟!
  • 这不是可选的!!!无论如何,直到 mpi_f08。
  • 此外,如果您的编译器/库不支持 Fortran 2008,您仍然可以使用 use mpi 而不是包含(如其他地方所述)。
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多