Do 循环卡在 MPI SCATTER 和 GATHER 中的第一个子数组
Do loop is stuck at the first subarray in MPI SCATTER and GATHER
我有两个数组,数组 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
你写了
local(j) = j * 2
print*, j
我认为这与您认为的不同。
你可能打算写
local(j) = local(j) * 2
print*, local(j)
我有两个数组,数组 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
你写了
local(j) = j * 2
print*, j
我认为这与您认为的不同。
你可能打算写
local(j) = local(j) * 2
print*, local(j)