Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran mpi_聚集问题_Fortran_Mpi_Intel Fortran - Fatal编程技术网

Fortran mpi_聚集问题

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

我已经编写了一个简单的代码来熟悉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(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,基本数据类型(也称为类型签名)的计数和顺序在两侧都必须匹配。但这些基本数据类型可以按不同的方式分组,例如派生数据类型。