我正在使用 MPI 并行化一个 Fortran 90 程序,我得到了一些真正奇怪的行为。我有一个长度为 nn+1 的数组 ia,我将它从进程 0 分块发送到进程 1,...,ntasks-1。每个进程还有一个列表 proc_start,它告诉 ia 中所有其他进程的起始位置,以及一个列表 pts_per_proc,它告诉每个进程具有的点数。以下代码有效:
if (me == 0) then
print *, 'Eat my shorts'
else
allocate( ia(pts_per_proc(me+1)+1) )
endif
! If this is the boss process, send the array ia,
if (me == 0) then
do n=1,ntasks-1
call mpi_send(ia(proc_start(n+1)),pts_per_proc(n+1)+1, &
& mpi_integer,n,n,mpi_comm_world,ierr)
enddo
! but if it's a worker, receive this array.
else
call mpi_recv(ia,pts_per_proc(me+1)+1,mpi_integer, &
& 0,me,mpi_comm_world,stat,ierr)
endif
没有段错误。当我注释掉该行时
print *, 'Eat my shorts'
无论我在哪里调用 mpi_barrier,它都会出现故障。例如,用代码替换第一位
call mpi_barrier(mpi_comm_world,ierr)
if (me /= 0) then
allocate( ia(pts_per_proc(me+1)+1) )
endif
call mpi_barrier(mpi_comm_world,ierr)
给我一个段错误。我可以改用 mpi_scatterv 来规避这个问题,但我想知道这里出了什么问题——障碍应该保证不会出现任何问题。