回 帖 发 新 帖 刷新版面

主题:[讨论]请问这个程序在LINUX下,使用ifort、MPI如何改编成并行程序

这是主程序中的一段,只需对这一部分进行并行计算,多谢了,各位
DO 760 ND=1,NDE
      ND1=ND
      ND2=NBLD0(ND)

      NBLD=NBLD0(ND)
      NGPF=NGPFD(ND)
      NGPI=NGPID(ND)
      NGPL=NGPLD(ND)
      RRC=DRRC(ND)
      PHIRC=DPHIRC(ND)
      ZRC=DZRC(ND)
      CDET(1)=RRC
      CDET(2)=PHIRC
      CDET(3)=ZRC
  。。。                                                   
                                  
      CALL SLITE (1)                                                    
      CALL  TITLE   ( 3, MRC, NORC, CDET(1), ID(1),6)                   
      IP = 10                                                           
224  XSRC = XS                                                         
      YSRC = YS                                                         
      ZSRC = ZS                                                         
      CALL  LENGTH                                                      
     *   ( SREG(1), XRELL, SSO, XSRC, YSRC, ZSRC, XRCVR, YRCVR, ZRCVR,  
     *      IERR1 )    
                                                 
  。。。
                         
 400  CALL  LENGTH                                                      
     *   ( SREG(1), XRELL, SSO, XSRC, YSRC, ZSRC, XRCVR, YRCVR, ZRCVR,  
     *      IERR1)                                                      
      IF  ( IERR1 )  420,420,800                                        
 420  CALL  KERNEL                                                      
     *   ( SREG(1), XRELL, ANEUT(1,1), AW A, AGAM(1), UAGAM(1), NERR)   
   
 。。。
                                    
 750 CALL PRINT(ID(1),NBMID(1,1),UNITG(1),UNITN(1),UNITGI(1),UNITNI(1)
     1          ,UNITND(1),WIDTHT(1,1),WIDTHG(1,1),WIDTHN(1,1),NGINT,
     2          NNINT,NORC,MRC,CDET(1),EG(1),EN(1),EGAV(1),ENAV(1),
     3          TOTALG(1),TOTALN(1,1),GRPG(1,1),GRPN(1,1,1),TOTLGI(1)
     4          ,TOTLNI(1,1),GRPGI(1,1),GRPNI(1,1,1),NRGY,NSET(20),NERR
     5          ,NSIND(1,1),NSET(12),XNLMAX,XNLMIN,ISMAX(1),ISMIN(1),
     6          ID1(1))
 760  CONTINUE

回复列表 (共13个回复)

11 楼

例如:
    DO 760 ND=1,NDE
...
760 continue
我说的点就是上面的NDE,想把NDE分成若干份,每一份交给一个进程来算。

12 楼

跟我8楼的意思一样. 这种循环一般是按照NDE分成若干个进程去处理(omp对do循环默认的方法). 这是最简单, 另外你说的分成若干段是不是说这个循环可以拆分成几个循环?

在mpi下循环就要改写一下, 大概思路我写一下, 具体翻翻书吧
LoopStep  = NDE/all_process  ! NDE除以所有进程数,进程数可以由mpi的函数活得, 至于不整除可以自己想想办法处理, 例如让最后一个进程辛苦点多过几个或者每个进程多分配一个任务让后面的进程空闲一点点.
LoopBegin = processID*LoopStep + 1 ! 当前进程号也可以由mpi函数获得, 这是按照进程分配任务的方式
LoopEnd = (processID+1)*LoopStep
DO ND=LoopBegin, LoopEnd
  ...
ENDDO

13 楼


恩,这个我看明白了,多谢哈

我来回复

您尚未登录,请登录后再回复。点此登录或注册