假设计算域为[kb, ke],将之分给p个进程,每个进程分到的计算域为[mykb, myke]。
!The iterations are divided into p parts, where p is the number of processors
!Written by Albert 2011.7.11
program stagprojection
implicit none
include 'mpif.h'
integer,parameter::kmax=200
integer i,j,k,kb,ke
integer myid, numprocs, ierr, tag, mykb, myke,res
integer dp(0:kmax),delta
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
kb = 3
ke = 202
if(myid.eq.0) write(*,*) '[',kb,'-----------------------',ke,']'
! partition the task
delta =(ke-kb+1) / numprocs
res = mod(ke-kb+1,numprocs)
if(myid.eq.0) print *,delta,res
dp(0) = kb
do i = 1, numprocs
dp(i) = dp(i-1) + delta
if(i.lt.res) dp(i)=dp(i)+1
enddo
dp(numprocs) = ke
mykb = dp(myid)
myke = dp(myid+1) - 1
if(myid.eq.numprocs-1) then
myke = myke +1
endif
write(*,*) '[',mykb,'-----------------------',myke,']'
call MPI_FINALIZE(ierr)
end
还有一种,可以写成子例行子程序的形式
SUBROUTINE para_range(kb,ke, numprocs, myid, mykb, myke)
implicit none
integer kb,ke,numprocs,myid,mykb,myke
integer delta, rest
delta = (ke-kb+1) / numprocs
rest = MOD(ke-kb+1, numprocs)
mykb = myid * delta + kb + MIN(myid, rest)
myke = mykb + delta -1
if(myid.lt.rest) myke = myke +1
END