我有我想要並行化的代碼,但我發現我使用的線程數量給了我大約0.5倍的減速。例如,我使用4個線程,運行速度慢兩倍。爲什麼OpenMP慢我的代碼與線程數成比例
- 編輯:對不起,在這裏有前面的程序錯誤的部分。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!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部分,但我認爲他們都可能試圖讀取相同的值,並且正在減慢它的速度,但似乎並不是這樣,因爲它的速度相同,無論哪個循環它結束。
作爲參考,內環是在約20000次迭代和外約1000
我使用英特爾編譯器40年4月1日與標誌-mcmodel =介質-shared-英特爾(因爲它使用> 2GB的mem)和-openmp當然。我已經用1,2,4,8,16個內核嘗試過了,每次內核的倍增時間讓我有1.5倍的運行時間。
任何想法讚賞!
空行太多,註釋過多的代碼,沒有足夠的縮進。我認爲這不會讓你的代碼變慢,但它肯定會讓它無法閱讀。 –
你可以發佈實際的時間,以及內部循環與外部循環的時間爲1線程運行? – steabert
對不起,我使用前4行,所以當我在這裏發佈時,所有確實已經結構化的東西都轉移到了第四行。 – user1993893