具有动态内存分配的MPI中的seg故障

时间:2012-10-20 23:35:39

标签: fortran mpi fortran90

我正在使用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来绕过这个问题,但我想知道这里出了什么问题 - 障碍应该保证没有任何乱序。

1 个答案:

答案 0 :(得分:0)

print *语句隐藏的分段错误并不罕见,通常是程序中某处内存损坏的症状。

在像这样的情况下,Valgrind的memcheck工具可以节省很多麻烦,尽管你需要正确地configure the tool for its usage with MPI(并且可能期望一些易于检测到的误报)。