0

我有我想要並行化的代碼,但我發現我使用的線程數量給了我大約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倍的運行時間。

任何想法讚賞!

+2

空行太多,註釋過多的代碼,沒有足夠的縮進。我認爲這不會讓你的代碼變慢,但它肯定會讓它無法閱讀。 –

+0

你可以發佈實際的時間,以及內部循環與外部循環的時間爲1線程運行? – steabert

+0

對不起,我使用前4行,所以當我在這裏發佈時,所有確實已經結構化的東西都轉移到了第四行。 – user1993893

回答

2

你確定你得到正確的結果嗎?進入並行區域並退出後,私有變量的值未定義。在你的情況下,有問題的是si_tempco_temp。您應該改用REDUCTION子句。

+0

非常感謝!我改變了一些東西,忘了讓這些變量減少!結果發生了很大變化,更加有意義! – user1993893

相關問題