循环的计算域划分

21 篇文章 2 订阅

假设计算域为[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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值