Fortran mpi_聚集问题
我已经编写了一个简单的代码来熟悉mpi\u gather:Fortran mpi_聚集问题,fortran,mpi,intel-fortran,Fortran,Mpi,Intel Fortran,我已经编写了一个简单的代码来熟悉mpi\u 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
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
我正在使用ifort版本14.0.2中的mpiifort
:
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)。然后,我将所有布尔值
收集到数组所有布尔值
到根处理器。当我输出all_booleans
的值时,除了myid=10
之外,我希望得到所有索引的.FALSE.
,情况并非如此。我做错了什么?你对mpi\u聚集的参数有点错误。上面说的记录是从
重新计数
任何单个接收的元素数(整数,仅在根处有效)
注意单词single。所以如果你把电话改成
call mpi_gather(boolean, 1, mpi_logical, all_booleans, 1, mpi_logical, root_id, &
& mpi_comm_world, ierror)
这对我很有用:
Wot now? mpif90 gath.f90
Wot now? mpirun -np 12 ./a.out
nprocs = 12
************************************************************
From each processor
myid = 11 boolean = F
myid = 3 boolean = F
myid = 7 boolean = F
myid = 8 boolean = F
myid = 0 boolean = F
myid = 4 boolean = F
myid = 9 boolean = F
myid = 10 boolean = T
myid = 6 boolean = F
myid = 2 boolean = F
myid = 5 boolean = F
myid = 1 boolean = F
******************************************************************
From the root processor, proc # : 10
processor 0 = F
processor 1 = F
processor 2 = F
processor 3 = F
processor 4 = F
processor 5 = F
processor 6 = F
processor 7 = F
processor 8 = F
processor 9 = F
processor10 = T
processor11 = F
******************************************************************
From each processor
myid = 6 boolean = F
myid = 11 boolean = F
myid = 0 boolean = F
myid = 2 boolean = F
myid = 1 boolean = F
myid = 3 boolean = F
myid = 7 boolean = F
myid = 9 boolean = F
myid = 5 boolean = F
myid = 10 boolean = T
myid = 4 boolean = F
myid = 8 boolean = F
调用mpi_聚集(布尔值,1,mpi_逻辑,所有布尔值,NPROC,mpi_逻辑,根id,mpi_通信世界,ierror)
错误。它应该是调用mpi\u聚集(boolean,1,mpi\u logical,all\u boolean,1,mpi\u logical,root\u id,mpi\u comm\u world,ierror)
这不是有点多余吗?i、 e.我希望sendcount
和recvcount
始终是相同的数据类型,但两侧的数据类型不必相同。是的,疯狂就在这条路上,但这是允许的。。。对于基本类型来说不太有趣,但是当涉及派生类型时,它可能有它的用途。@solalito,基本数据类型(也称为类型签名)的计数和顺序在两侧都必须匹配。但这些基本数据类型可以按不同的方式分组,例如派生数据类型。