Fortran 如果端口MPICH MPI\u GATHERV不工作

Fortran 如果端口MPICH MPI\u GATHERV不工作,fortran,mpi,Fortran,Mpi,我正在尝试使用MPI\u GATHERV命令,但它对我不起作用。我期望的结果是MYID和a_总数的[0 0 0 5 1 1 1 5,1 0 0 5 1 1 5],但这是我得到的[0 0 5 5 5,1 0 0 5 5 5 5 5]。我尝试了不同的计算机,但得到了相同的结果 program test use MPI implicit none integer:: IERR,NPROC,MYID integer(kind=8),allocatable:: a(:),a

我正在尝试使用
MPI\u GATHERV
命令,但它对我不起作用。我期望的结果是MYID和a_总数的[0 0 0 5 1 1 1 5,1 0 0 5 1 1 5],但这是我得到的[0 0 5 5 5,1 0 0 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\u INTEGER
作为MPI类型,但这是指默认的整数(最有可能是4字节长)。您必须使用适当的MPI类型
MPI_INTEGER8
可能会起作用,但它不是100%确定的,因为
integer(kind=8)
是一个不可移植的声明,它不必是8字节长


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

use iso_fortran_env
integer(int64) :: a

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

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

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


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

use iso_fortran_env
integer(int64) :: a

那你得到了什么样的结果呢?0 0 0 5 5 5 5,1 0 0 5 5 5 5这是我得到的MYID和a_total的输出。你可以使用更有效的
MPI_ALLGATHERV
而不是
MPI_GATHERV
MPI_BCAST
组合。非常感谢你的建议!那你得到了什么样的结果呢?0 0 0 5 5 5 5,1 0 0 5 5 5 5这是我得到的MYID和a_total的输出。你可以使用更有效的
MPI_ALLGATHERV
而不是
MPI_GATHERV
MPI_BCAST
组合。非常感谢你的建议!嗨,Vladimir F,我把integer(kind=8)改成integer,它开始工作了!非常感谢你!嗨,Vladimir F,我把integer(kind=8)改成integer,它开始工作了!非常感谢你!