【问题标题】:Do loop is stuck at the first subarray in MPI SCATTER and GATHERDo 循环卡在 MPI SCATTER 和 GATHER 中的第一个子数组
【发布时间】:2015-11-26 21:34:43
【问题描述】:

我有两个数组,数组 global 有 8 个值,它将分散在数组 local 中,有 2 个值。我正在尝试做的是, 将大数组拆分为小数组,做一些工作,然后将其重新组合在一起。

问题:
即使我成功分散了数据,所写的do 循环也仅适用于第一个子数组local。我想要的是分散的local 数组中的所有整数都应该乘以2,然后聚集到global 数组中。

do 循环的代码(这里已经完成了一些工作):

do j = 1,2
  local(j) = j*2
  print *, j
end do

这是完整的代码。如果你往下走,你会注意到我需要你帮助的部分。

MODULE MPI
    IMPLICIT NONE
    INCLUDE   'mpif.h'
    INTEGER   :: MYID,TOTPS, IERR, MPISTTS

CONTAINS 

    SUBROUTINE MPIINIT
        IMPLICIT NONE
        CALL MPI_INIT( IERR ) 
        CALL MPI_COMM_RANK(MPI_COMM_WORLD,MYID,IERR)
        CALL MPI_COMM_SIZE(MPI_COMM_WORLD,TOTPS,IERR)
    RETURN
    END SUBROUTINE MPIINIT
END MODULE MPI

PROGRAM SCATTER 
    USE MPI
    IMPLICIT NONE 
    CALL MPIINIT
    CALL TEST
    CALL  MPI_FINALIZE(IERR)

CONTAINS 

SUBROUTINE TEST
    USE MPI 
    IMPLICIT NONE 
    INTEGER :: I,J
    INTEGER,DIMENSION(8) :: GLOBAL
    INTEGER,DIMENSION(2) :: LOCAL 

    if (myid .eq. 0) then 
    do i = 1,8
    global(i) = i
    end do 
    end if

    call mpi_scatter(global,2,mpi_integer,local,2,mpi_integer,0, &
    mpi_comm_world,ierr)
    print*,"task",myid,":",local
    call mpi_barrier(mpi_comm_world,ierr)

    !!!!!!! do some work here
    do j = 1,2
    local(j) = j*2
    print*,j
    end do
    !!!!!! end work 


    call mpi_gather(local,2,mpi_integer,global,2,mpi_integer,0, &
    mpi_comm_world,ierr)
    if(myid .eq. 0) then
    print*,"task",myid,":",global
    end if
END SUBROUTINE TEST
END PROGRAM SCATTER 

注意事项:

(1) 我一直在阅读和学习 this 线程,但现在看起来很有挑战性。
(2) 运行代码mpif90 SCATTER.f90..mpirun -np 4 ./a.out

输出:

    task 0 : 1 2
    task 1 : 3 4
    task 2 : 5 6
    task 3 : 7 8
    1
    2
    1
    2
    1
    2
    1
    2
   task 0 : 2 4 2 4 2 4 2 4

我想得到的是:task 0 : 2 4 6 8 10 12 14 16

【问题讨论】:

  • 我同意 Mark 的观点,我们尤其错过了预期和观察到的行为。怎么了?问题出在哪里?
  • 知道了,我正在编辑它
  • 还不清楚!有什么问题?

标签: fortran mpi


【解决方案1】:

你写的

local(j) = j * 2
print*, j

我不认为你认为的那样。

你可能打算写

local(j) = local(j) * 2
print*, local(j)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2014-04-20
    • 2020-05-07
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多