在 Fortran 中使用 MPI_Gather 时出现无效指针和分段错误

Invalid pointer and segmentation fault when using MPI_Gather in Fortran

我有一个简单的程序,它应该使用 MPI 将许多小数组聚集成一个大数组。

PROGRAM main 
    include 'mpif.h' 

    integer ierr, i, myrank, thefile, n_procs
    integer, parameter          :: BUFSIZE = 3
    complex*16, allocatable    :: loc_arr(:), glob_arr(:)

    call MPI_INIT(ierr) 
    call MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr) 
    call MPI_COMM_SIZE(MPI_COMM_WORLD, n_procs, ierr)

    allocate(loc_arr(BUFSIZE))
    loc_arr = 0.7 * myrank - cmplx(0.3, 0, kind=8)


    allocate(glob_arr(n_procs* BUFSIZE))

    write (*,*) myrank, shape(glob_arr)

    call MPI_Gather(loc_arr, BUFSIZE, MPI_DOUBLE_COMPLEX,&
                    glob_arr, n_procs * BUFSIZE, MPI_DOUBLE_COMPLEX,&
                    0, MPI_COMM_WORLD, ierr)
    write (*,*) myrank,"Errorcode:" , ierr
    call MPI_FINALIZE(ierr) 

END PROGRAM main

我对 C 中的 MPI 有一些经验,但对于 Fortran 90 似乎没有任何效果。这是我编译(我使用 ifort)和 运行 的方式:

 mpif90 test.f90 -check all && mpirun -np 4 ./a.out
           1          12
           3          12
           3 Errorcode:           0
           1 Errorcode:           0
           0          12
           2          12
           2 Errorcode:           0
           0 Errorcode:           0
*** Error in `./a.out': free(): invalid pointer: 0x0000000000a25790 ***

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 10889 RUNNING AT LenovoX1kabel
=   EXIT CODE: 6
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 10889 RUNNING AT LenovoX1kabel
=   EXIT CODE: 6
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================

我做错了什么?有时我会遇到这个指针问题,有时我会遇到分段错误,但对我来说它看起来不像任何 ifort 检查抱怨。

所有错误代码都是0,所以我不确定我哪里出错了。

永远不要指定 MPI 集合中的进程数。这是一个简单的经验法则。

因此 n_procs * BUFSIZE 行显然是错误的。

事实上,手册指出:recvcount 任何单个接收的元素数量(整数,仅在根部有效)。

你应该只使用 BUFSIZE。 C 和 Fortran 也是如此。