我正在使用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
没有seg故障。当我注释掉这行
时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来绕过这个问题,但我想知道这里出了什么问题 - 障碍应该保证没有任何乱序。
答案 0 :(得分:0)
print *
语句隐藏的分段错误并不罕见,通常是程序中某处内存损坏的症状。
在像这样的情况下,Valgrind的memcheck工具可以节省很多麻烦,尽管你需要正确地configure the tool for its usage with MPI(并且可能期望一些易于检测到的误报)。