回 帖 发 新 帖 刷新版面

主题:[讨论]请问这个程序在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个回复)

沙发

如果不是跨节点的话建议用openmp算了. 对于内部不相关的循环几下就搞定了.
用mpi的话要引入些参数把循环分到不同进程上, 最后数据同步...
mpi一年多没摸了.

板凳

[quote]如果不是跨节点的话建议用openmp算了. 对于内部不相关的循环几下就搞定了.
用mpi的话要引入些参数把循环分到不同进程上, 最后数据同步...
mpi一年多没摸了.[/quote]
夜兄,还没睡啊,我已经把lic文件发给你了:)
先去了,安:)

3 楼

[quote][quote]如果不是跨节点的话建议用openmp算了. 对于内部不相关的循环几下就搞定了.
用mpi的话要引入些参数把循环分到不同进程上, 最后数据同步...
mpi一年多没摸了.[/quote]
夜兄,还没睡啊,我已经把lic文件发给你了:)
先去了,安:)[/quote]
我也要……

4 楼

这几天都搞到一点多才睡, lic已经收到, 谢谢!!
勋哥你也那么晚还没睡啊...

5 楼

[quote][quote][quote]如果不是跨节点的话建议用openmp算了. 对于内部不相关的循环几下就搞定了.
用mpi的话要引入些参数把循环分到不同进程上, 最后数据同步...
mpi一年多没摸了.[/quote]
夜兄,还没睡啊,我已经把lic文件发给你了:)
先去了,安:)[/quote]
我也要……[/quote]
给完了:)

6 楼

[quote]如果不是跨节点的话建议用openmp算了. 对于内部不相关的循环几下就搞定了.
用mpi的话要引入些参数把循环分到不同进程上, 最后数据同步...
mpi一年多没摸了.[/quote]

多谢yeg001的答复。出去实习几天,没能及时回复。 十分抱歉。 


并行用的服务器的确是多结点的。请问yeg001,具体如何做,我看了都志辉的高性能计算并行编程技术,可是还不理解。能使用MPI—BCAST(广播)或者MPI—SCATTER(散发)解决"把循环分到不同进程上"这个问题吗?同样,能用MPI—GATHER或者MPI—ALLGATHER解决“数据同步”吗?

7 楼

[quote][quote]如果不是跨节点的话建议用openmp算了. 对于内部不相关的循环几下就搞定了.
用mpi的话要引入些参数把循环分到不同进程上, 最后数据同步...
mpi一年多没摸了.[/quote]
夜兄,还没睡啊,我已经把lic文件发给你了:)
先去了,安:)[/quote]

请问yeg001,这个lic文件跟我没什么关系吧,呵呵

8 楼

那个"广播"跟"收集" 是对信息发布和传递. 不过我还没有用过这两个函数, 我之用最简单的发送与接收函数.
其实那些循环不是发布过去的, 是在那些节点上本身就有一份"副本"程序. 只是不同的进程号对应执行不同的循环段. 所以这个循环要拆开来写. 具体可以看看例程, 这个还挺容易的. 最后才是把各个节点计算的结果收集起来.
我个人是把结果收集到一个节点上然后再让这个节点去写文件的.

p.s. 那个lic跟这个主题没关系,主要是我向cgl_lgs兄索要ivf windows版的lic. 他见到我就留言而已.

9 楼


您的意思是把这个大循环拆成若干个循环段,而我的想法是把进行计算的点(成千上万)分成若干份。您觉得哪个更可行啊,呵呵,我是刚接触并行计算,可能问的问题太低级,请多包涵。

10 楼

你所说的"计算的点"是循环外面的"量", 然后每一个点都包含一个这样的大循环? 还是循环内部的某个部分称为"计算的点"? 我不熟悉你的算法.

并行想效率高就尽量使得每个部分的运算量都尽量大(粗粒), 但有时候我们缺需要小规模的并行(细粒)这时候同步次数多效率就降低. 相对来说mpi是进程级别的, 它同步的代价比较大, 如果跨节点还需要通过网络, 所以更应该做粗点. omp是线程级别的相对代价小些, 比较适合做中小到粗型的并行. 现在流行的显卡并行就反而只适合做细的并行.

我来回复

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