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

时间:2016-09-04 10:30:43

标签: fortran mpi fortran90

我有一个简单的程序,它应该使用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,所以我不确定哪里出错了。

1 个答案:

答案 0 :(得分:2)

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

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

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

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