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,它开始工作了!非常感谢你!