24小时热门版块排行榜    

查看: 469  |  回复: 1
当前主题已经存档。
【有奖交流】积极回复本帖子,参与交流,就有机会分得作者 futurehero 的 100 个金币

futurehero

新虫 (正式写手)

[交流] 【求助】诚求助并行计算中的一个问题,谢谢大家!

这个程序大致如下,我想用并行计算解决“do循环中包含积分”的计算问题。如果将并行的线程设为1,则和串行计算的结果一直,但是线程大于1时,计算的结果就不正确了。小弟刚刚接触并行计算两天,做了很多种方案都发现线程大于1时计算的结果都不对,请诸位大侠帮助,我想得到争取的并行计算结果。如果将程序中的call omp_set_num_threads(4 )线程改为call omp_set_num_threads(1 )就和串行结果是一致的。(可能您只需要看一下并行区就可以发现问题所在了)
程序如下:

program main  
implicit none
            
integer:: Num, i, p, j, k ,var, r ,Y
real(kind=8):: D, epsl21, epsl22, T, eta, Gama, GamaL, GamaR, epsl0, VL, VR

parameter(D=1.0_8, Num=10001, Gama=0.01_8, GamaL=0.005_8, GamaR=0.005_8, epsl0=-0.1_8, VL=0.0_8, VR= 0.0_8)

real(kind=8):: pi, Dc, Hc, fL(Num), fR(Num), f0(Num), epsl(Num), epsl11, epsl12, dIdV(Num)
complex(kind=8):: sigma0, FG11(Num), FG12(Num), FG21(Num), FG22(Num)

complex(kind=8):: G011(Num), G012(Num), G021(Num), G022(Num), G11(Num), G12(Num), G21(Num), G22(Num)
complex(kind=8):: DDOS(Num), DOS, D11, D12, D21, D22
complex(kind=8):: n11, n12, n21, n22

complex(kind=8):: delta1211(Num), delta2111(Num), delta2211(Num)
complex(kind=8):: delta1112(Num), delta2112(Num), delta2212(Num)

complex(kind=8):: delta1121(Num), delta1221(Num), delta2221(Num)
complex(kind=8):: delta1122(Num), delta1222(Num), delta2122(Num)

complex(kind=8)::   FZB11(Num),   FZB12(Num),   FZB21(Num),   FZB22(Num)

complex(kind=8)::   B1211(Num),   B2111(Num),   B2211(Num)  
complex(kind=8)::   FB1211(Num),  FB2111(Num),  FB2211(Num)

complex(kind=8)::   B1112(Num),   B2112(Num),   B2212(Num)  
complex(kind=8)::  FB1112(Num),  FB2112(Num),  FB2212(Num)  

complex(kind=8)::  B1121(Num),   B1221(Num),   B2221(Num)
complex(kind=8)::  FB1121(Num),  FB1221(Num),  FB2221(Num)

complex(kind=8)::   B1222(Num),   B2122(Num),   B1122(Num)
complex(kind=8)::  FB1222(Num),  FB2122(Num),  FB1122(Num)

real(kind=8)::    m, Field, SOC, Tk   

Dc=2*D / (Num-1)  
eta =2.0*Dc                       
pi=4.0_8*datan(1.0_8)  

m=0.00_8  
T=0.0_8   
SOC=0.00000_8   
Field=0.00000_8  
epsl11=epsl0 - SOC/2.0_8 - m*Field - Field
epsl12=epsl0 + SOC/2.0_8 + m*Field - Field  
epsl21=epsl0 + SOC/2.0_8 - m*Field + Field
epsl22=epsl0 - SOC/2.0_8 + m*Field + Field
do i=1, Num, 1
   epsl(i)=-D + (i-1)  *Dc                                                                           
end do
do i=1, Num, 1        
   if(  epsl(i)           <  VL       )  fL(i)=1.0_8         
   if(  epsl(i)           >  VL       )  fL(i)=0.0_8               
   if(  dabs(epsl(i)-VL)  <  0.01_8*Dc ) fL(i)=0.5_8   
   if(  epsl(i)           <  VR       )  fR(i)=1.0_8                     
   if(  epsl(i)           >  VR       )  fR(i)=0.0_8         
   if(  dabs(epsl(i)-VR)  <  0.01_8*Dc ) fR(i)=0.5_8            
end do                                                                                             
f0=(    fL*GamaL  +  fR*GamaR    ) /Gama         
delta1211=dcmplx(  epsl12 - epsl11,      eta  ) - epsl                 
delta2111=dcmplx(  epsl21 - epsl11,      eta  ) - epsl              
delta2211=dcmplx(  epsl22 - epsl11,      eta  ) - epsl                 
      
delta1112=dcmplx(  epsl11 - epsl12,      eta  ) - epsl         
delta2112=dcmplx(  epsl21 - epsl12,      eta  ) - epsl         
delta2212=dcmplx(  epsl22 - epsl12,      eta  ) - epsl  
delta1121=dcmplx(  epsl11 - epsl21,      eta  ) - epsl         
delta1221=dcmplx(  epsl12 - epsl21,      eta  ) - epsl      
delta2221=dcmplx(  epsl22 - epsl21,      eta  ) - epsl            
delta1122=dcmplx(  epsl11 - epsl22,      eta  ) - epsl                  
delta1222=dcmplx(  epsl12 - epsl22,      eta  ) - epsl         
delta2122=dcmplx(  epsl21 - epsl22,      eta  ) - epsl      
!================================
sigma0=dcmplx(0.0_8, -Gama)                                                                        
G011  =epsl-epsl11-sigma0                                                              
G012  =epsl-epsl12-sigma0                                                              
G021  =epsl-epsl21-sigma0                                                              
G022  =epsl-epsl22-sigma0                                                              
!********************************************
call omp_set_num_threads(4 )
!$OMP parallel                                                                        
!$OMP do private (Y)
do Y=1, Num, 1                                                                              
   FB1211=f0/( epsl(Y) + delta1211  )                                                                    
   FB2111=f0/( epsl(Y) + delta2111  )                                                                    
   FB2211=f0/( epsl(Y) + delta2211  )                                                                    
   FB1112=f0/( epsl(Y) + delta1112  )                                                                    
   FB2112=f0/( epsl(Y) + delta2112  )                                                                    
   FB2212=f0/( epsl(Y) + delta2212  )                                                                    
   FB1121=f0/( epsl(Y) + delta1121  )                                                                    
   FB1221=f0/( epsl(Y) + delta1221  )                                                                    
   FB2221=f0/( epsl(Y) + delta2221  )                                                                    
   FB1122=f0/( epsl(Y) + delta1122  )                                                                    
   FB1222=f0/( epsl(Y) + delta1222  )                                                                    
   FB2122=f0/( epsl(Y) + delta2122  )                                                                    
call INTEGRAL(Num, Dc,  FB1211, B1211(Y))
call INTEGRAL(Num, Dc,  FB2111, B2111(Y))   
call INTEGRAL(Num, Dc,  FB2211, B2211(Y))
call INTEGRAL(Num, Dc,  FB1112, B1112(Y))
call INTEGRAL(Num, Dc,  FB2112, B2112(Y))
call  INTEGRAL(Num, Dc,  FB2212, B2212(Y))
call  INTEGRAL(Num, Dc,  FB1121, B1121(Y))
call  INTEGRAL(Num, Dc,  FB1221, B1221(Y))
call  INTEGRAL(Num, Dc,  FB2221, B2221(Y))
call  INTEGRAL(Num, Dc,  FB1122, B1122(Y))      
call  INTEGRAL(Num, Dc,  FB1222, B1222(Y))   
call  INTEGRAL(Num, Dc,  FB2122, B2122(Y))
end do                                                                             
!$OMP end do
!$OMP end parallel  
!******************************************
B1211=B1211*Gama/pi
B2111=B2111*Gama/pi
B2211=B2211*Gama/pi   
                     
B1112=B1112*Gama/pi  
B2112=B2112*Gama/pi   
B2212=B2212*Gama/pi   
                     
B1121=B1121*Gama/pi   
B1221=B1221*Gama/pi   
B2221=B2221*Gama/pi   
                        
B1122=B1122*Gama/pi     
B1222=B1222*Gama/pi     
B2122=B2122*Gama/pi      
G11= (   1.0_8 - 3.0_8*0.245_8    )/(   G011 - B1211-B2111-B2211   )   
G12= (   1.0_8 - 3.0_8*0.245_8    )/(   G012 - B1112-B2112-B2212   )
G21= (   1.0_8 - 3.0_8*0.245_8    )/(   G021 - B1121-B1221-B2221   )
G22= (   1.0_8 - 3.0_8*0.245_8    )/(   G022 - B1122-B1222-B2122   )

FG11=-f0*G11/pi              
FG12=-f0*G12/pi   
FG21=-f0*G21/pi         
FG22=-f0*G22/pi                 
call INTEGRAL(Num, Dc, FG11, n11)  
call INTEGRAL(Num, Dc, FG12, n12)
call INTEGRAL(Num, Dc, FG21, n21)
call INTEGRAL(Num, Dc, FG22, n22)

write(*,*) "n11=", dimag(n11), "n12=", dimag(n12)
write(*,*) "n21=", dimag(n21), "n22=", dimag(n22)

stop
end program main

subroutine INTEGRAL(Num, Dc, Y, answer)                                                                  
implicit none                                                         
integer::  Num                                                               
real(kind=8):: Dc                                                         
complex(kind=8):: Y(Num), answer
integer:: i                                                                           
complex:: s1                                                                     
                                                                                               
s1=(Y(1)+ Y(Num))/2                                                                              
do i=2, Num-1, 1                                                                       
   s1=s1+ Y(i)                                                                                   
end do                                                                        
answer=s1*Dc                                                                       
                                                                    
return                                                                                       
end subroutine INTEGRAL  

stop
end program main

[ Last edited by futurehero on 2010-3-4 at 23:09 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

futurehero

新虫 (正式写手)

已经解决了!错误原因在于不同的线程会同时将中间变量写到同一个内存单元FB1211,造成结果错误.只需用将再为每个线程定义不同的变量就解决问题了.
2楼2010-03-20 16:08:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 futurehero 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[找工作] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 Vi50GxzrFcSG 2026-08-07 4/200 2026-08-08 10:39 by 3OOjAIS77qg2
[硕博家园] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 Vi50GxzrFcSG 2026-08-07 6/300 2026-08-08 10:19 by 3OOjAIS77qg2
[基金申请] fileCode有新解读? +8 Tide man 2026-08-08 16/800 2026-08-08 09:59 by Tide man
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 HEQlVqMTIA7d 2026-08-07 4/200 2026-08-08 08:27 by 6vVgjDL4CnGu
[基金申请] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 KXLV3nuBVBY7 2026-08-07 4/200 2026-08-08 08:21 by 6vVgjDL4CnGu
[考博] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 HEQlVqMTIA7d 2026-08-07 3/150 2026-08-08 03:47 by 6vVgjDL4CnGu
[基金申请] 基金中了 +14 laoda193707 2026-08-06 14/700 2026-08-08 00:23 by 实验小白ha
[基金申请] 化学口download_prp&amp;fileCode的固定段好像这几天一直没变,有变的大神么? +3 Tide man 2026-08-07 4/200 2026-08-07 22:39 by Tide man
[基金申请] 听说今天filecode变了 +24 布布和一二 2026-08-06 47/2350 2026-08-07 16:02 by zhiyanjiang
[基金申请] filecode与中标关系的预测 +3 布布和一二 2026-08-07 3/150 2026-08-07 15:09 by gltch
[基金申请] filecode变化情况 +6 布布和一二 2026-08-07 22/1100 2026-08-07 14:45 by 且听虎啸
[基金申请] 大家散了吧,后缀研究没有意义,别浪费时间了,过好目前的每一天,不要焦虑 +5 Tide man 2026-08-06 7/350 2026-08-07 13:11 by 医学老男孩
[基金申请] 求各位大神看下 100+6 hpkpkpkp 2026-08-05 33/1650 2026-08-06 14:49 by zhiyanjiang
[基金申请] 影响面上的因素 +8 布布和一二 2026-08-05 11/550 2026-08-06 10:41 by 宝贝虫子
[基金申请] 8月时间戳变的,举个手。玩一下,释放压力 +9 archvillain 2026-08-04 11/550 2026-08-05 20:06 by wlwhappy
[考博] 【2027博士申请】纳米药物递送方向 20+3 13586093586 2026-08-03 4/200 2026-08-05 09:59 by lfy8008
[基金申请] 有没有H口的?有收到消息的吗? +3 超级海虾 2026-08-04 3/150 2026-08-04 17:26 by 学教育滴
[基金申请] 纯娱乐,不喜欢勿喷 +7 Tide man 2026-08-04 10/500 2026-08-04 15:10 by loufangrui
[基金申请] 面上提前没消息,有中的吗 +14 archvillain 2026-08-02 18/900 2026-08-04 14:42 by archvillain
[基金申请] 什么时候能放榜呀? +3 Jacob678 2026-08-03 3/150 2026-08-03 16:14 by gltch
信息提示
请填处理意见