ifort MPICH MPI_GATHERV无法正常工作

时间:2015-11-02 14:22:29

标签: fortran mpi

我正在尝试使用MPI_GATHERV命令,但它对我不起作用。对于MYID和a_total,我期待的结果是[0 0 0 0 5 1 1 1 5,1 0 0 0 1 1 1 1 5],但这是我得到的[0 0 0 5 5 5 5 5 5,1 0 0 5 5 5 5 5 5]。我尝试了不同的计算机但得到了相同的结果。

program test
    use MPI
    implicit none
    integer:: IERR,NPROC,MYID
    integer(kind=8),allocatable:: a(:),a_number(:),a_start(:),a_total(:)
    integer:: i,j,k


call MPI_INIT(IERR)

call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROC,IERR)

call MPI_COMM_RANK(MPI_COMM_WORLD,MYID,IERR)

allocate(a(3),a_number(NPROC),a_start(NPROC))

allocate(a_total(8))

a=MYID

do i=1,NPROC
    a_number(i)=3
end do 

write(*,*) MYID,a

do i=1,NPROC

    a_start(i)=(i-1)*4

end do


a_total=5


CALL MPI_GATHERV (a(1),3,MPI_INTEGER,&
                  a_total,a_number,a_start,MPI_INTEGER,&
                  0,MPI_COMM_WORLD,IERR)

call MPI_BCAST(a_total,8,MPI_INTEGER,0,MPI_COMM_WORLD,IERR)


write(*,*) MYID,a_total

deallocate(a,a_number,a_start,a_total)

call MPI_FINALIZE(IERR)


end program

1 个答案:

答案 0 :(得分:4)

代码中可能存在其他问题,但很明显。

decltype是一种非可移植的整数,但很可能大于默认的integer(kind=8)

您使用integer作为MPI类型,但它指的是默认整数(最可能是4个字节长)。您必须使用适当的MPI类型。 MPI_INTEGER可能会起作用,但由于MPI_INTEGER8是一个非可移植的声明,它不是100%肯定的,它不必是8个字节长。

如果你想要一个8字节的整数,那么最好做

integer(kind=8)