我正在尝试使用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
答案 0 :(得分:4)
代码中可能存在其他问题,但很明显。
decltype
是一种非可移植的整数,但很可能大于默认的integer(kind=8)
。
您使用integer
作为MPI类型,但它指的是默认整数(最可能是4个字节长)。您必须使用适当的MPI类型。 MPI_INTEGER
可能会起作用,但由于MPI_INTEGER8
是一个非可移植的声明,它不是100%肯定的,它不必是8个字节长。
如果你想要一个8字节的整数,那么最好做
integer(kind=8)