ifort MPICH MPI_GATHERV 不工作

ifort MPICH MPI_GATHERV not working

我正在尝试使用 MPI_GATHERV 命令,但它对我不起作用。对于 MYID 和 a_total,我期望的结果是 [0 0 0 0 5 1 1 1 5、1 0 0 0 5 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

代码中可能还有其他问题,但有一个是显而易见的。

integer(kind=8) 是某种不可移植的整数,但很可能大于默认值 integer

您正在使用 MPI_INTEGER 作为 MPI 类型,但它指的是默认整数(很可能是 4 个字节长)。您必须使用适当的 MPI 类型。 MPI_INTEGER8 可能有效,但不能 100% 确定,因为 integer(kind=8) 是一个不可移植的声明,它不必是 8 个字节长。


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

use iso_fortran_env
integer(int64) :: a