我有一个我试图并行化的代码,但我发现我使用的线程数给了我大约0.5倍的减速。例如,我使用4个线程,运行速度慢两倍。
-edit:抱歉,以前在这里有错误的程序部分。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!Compute Dynamic Structure Factor of Q,T=const
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SUBROUTINE COMPUTE_SQ(i_vmax,ION_COUNT,ions,t2,lines,lf,rx,ry,rz,r,x,y,z,s,simtype,vmax,q)
IMPLICIT NONE
Integer*4, INTENT(IN) ::i_vmax,ION_COUNT,ions,t2,lines
Real*8, INTENT(IN) ::lf,vmax
Integer*4, INTENT(IN), DIMENSION(1:51200) ::rx,ry,rz
Real*4, INTENT(IN), DIMENSION(1:51200,0:1000) ::x,y,z
Real*8, INTENT(INOUT),DIMENSION(1:i_vmax) ::s
Complex*16,INTENT(INOUT),DIMENSION(1:i_vmax,2) ::r
Complex*16,INTENT(INOUT),DIMENSION(1:i_vmax,2) ::q
Real*8, DIMENSION(1:i_vmax) ::si,co
Integer*4 ::k,i,p_start,p_end
Real*8 ::dotprod,co_temp,si_temp
Character*5,INTENT(IN) ::simtype
!!!!!!RE-INITIALIZE VARIABLES
Do 300 k=1,i_vmax
!if (mag(k).gt.vmax) then
!cycle
!endif
co(k)=0
si(k)=0
co_temp=0
si_temp=0
write(*,*) vmax
300 continue
!!!!!!!!!!!!!!!!!!!!
if (simtype.eq.'pfrac') then
p_start=30721
p_end=51200
else if (simtype.eq.'nfrac') then
p_start=0
p_end=30720
else
write (*,*) 'simtype not specified'
endif
!!!!!!!!!!!!!!!!!!!!!!
Do 31 k=1,i_vmax
! if (mag(k).gt.vmax) then
! cycle
! endif
co_temp=0
si_temp=0
!$OMP PARALLEL DO PRIVATE(dotprod,Qcur,co_temp,si_temp)
Do 41 i=p_start,p_end
dotprod=(rx(k)*x(i,t2)+ry(k)*y(i,t2)+rz(k)*z(i,t2))*lf
co_temp=co_temp+COS(dotprod) !Qcur/Qavg
si_temp=si_temp+SIN(dotprod) !Qcur/Qavg
41 continue
!$OMP END PARALLEL DO
q(k,2)= cmplx(co_temp,si_temp)
r(k,2)=r(k,2)+q(k,2)
s(k)=s(k) +(q(k,1) * conjg(q(k,2)))
s(k)=s(k)/(p_end-p_start+1)**2
!r(k,2)=r(k,2)/(p_end-p_start+1)
31 continue
RETURN
END SUBROUTINE COMPUTE_SQ
以下是相关代码的一部分。起初我在整个子程序中都有OMP部分,但我认为它们都可能试图读取相同的值并且它正在减慢速度,但这似乎并非如此,因为它的速度相同,无论哪个循环它过去了。
作为参考,内环超过约20,000次迭代,外部约为1000次。
我正在使用英特尔编译器4.1.40和标志-mcmodel = medium -shared-intel(因为它使用> 2GB内存)和-openmp当然。我已经尝试过1,2,4,8,16个核心,并且每次连续加倍核心都可以让我运行大约1.5倍。
任何想法都赞赏!
答案 0 :(得分:2)
您确定要获得正确的结果吗?在进入并行区域并退出后,私有变量的值未定义。在您的情况下,有问题的是si_temp
和co_temp
。您应该改为使用REDUCTION
子句。