我写了一个简单的代码来自己熟悉与mpi_gather
:问题与mpi_gather
program main
use mpi
implicit none
integer :: myid, ierror, root_id, nprocs, ii
logical :: boolean
logical, dimension(:), allocatable :: all_booleans
call mpi_init(ierror)
call mpi_comm_rank(mpi_comm_world,myid,ierror)
call mpi_comm_size(mpi_comm_world, nprocs, ierror)
if(myid==0) then
print '(A9,I2)', "nprocs = ", nprocs
print*, "************************************************************"
print*, "From each processor"
end if
call mpi_barrier(mpi_comm_world,ierror)
boolean = .FALSE.
root_id = 10
if(myid==root_id) then
boolean = .TRUE.
allocate(all_booleans(0:nprocs-1))
end if
print '(A7,I2,A11,L2)', "myid = ", myid, " boolean = ", boolean
call mpi_barrier(mpi_comm_world,ierror)
call mpi_gather(boolean, 1, mpi_logical, all_booleans, nprocs, mpi_logical, root_id, &
& mpi_comm_world, ierror)
call mpi_barrier(mpi_comm_world,ierror)
if(myid==root_id) then
print*, "******************************************************************"
print *, "From the root processor, proC# : ", myid
do ii=0,nprocs-1
print '(A9,I2,A3,L2)', "processor ", ii, " = ", all_booleans(ii)
end do
end if
call mpi_barrier(mpi_comm_world,ierror)
if(myid==root_id) then
print*, "******************************************************************"
print*, "From each processor"
end if
call mpi_barrier(mpi_comm_world,ierror)
print '(A7,I2,A11,L2)', "myid = ", myid, " boolean = ", boolean
call mpi_barrier(mpi_comm_world,ierror)
call mpi_finalize(ierror)
end program main
我使用mpiifort
从ifort 14.0.2版本:
nprocs = 12
************************************************************
From each processor
myid = 0 boolean = F
myid = 1 boolean = F
myid = 3 boolean = F
myid = 4 boolean = F
myid = 5 boolean = F
myid = 6 boolean = F
myid = 7 boolean = F
myid = 8 boolean = F
myid = 9 boolean = F
myid = 10 boolean = T
myid = 11 boolean = F
myid = 2 boolean = F
******************************************************************
From the root processor, proC# : 10
processor 0 = F
processor 1 = T
processor 2 = F
processor 3 = T
processor 4 = T
processor 5 = T
processor 6 = T
processor 7 = T
processor 8 = T
processor 9 = T
processor10 = T
processor11 = T
******************************************************************
From each processor
myid = 0 boolean = F
myid = 1 boolean = F
myid = 2 boolean = F
myid = 3 boolean = F
myid = 4 boolean = F
myid = 5 boolean = F
myid = 6 boolean = F
myid = 7 boolean = F
myid = 8 boolean = F
myid = 9 boolean = F
myid = 10 boolean = T
myid = 11 boolean = F
我设置变量boolean
到.TRUE.
仅用于根处理器(这里是proc 10)。然后我将所有boolean
值收集到数组all_booleans
到根处理器。当我输出all_booleans
的值时,除了myid = 10
之外,我预计会得到.FALSE.
,但情况并非如此。我究竟做错了什么?
'调用mpi_gather(布尔值,1,mpi_logical,all_booleans,nprocs,mpi_logical,root_id,MPI_COMM_WORLD,IERROR)'是错误的。它应该读取'调用mpi_gather(布尔,1,mpi_logical,all_booleans,1,mpi_logical,root_id,mpi_comm_world,错误)' – Gilles