2011-08-20 51 views
1

我目前正在並行使用OpenMP Fortran語言編寫的一些多重網格代碼,我發現,OpenMP的調度條款作出對性能有很大的影響。回想一下,OpenMP調度子句是靜態的,動態的,運行時和引導的,它們決定了循環中的工作如何在線程之間分配。例如,將OpenMP並行SAXPY環路與調度子句將如下所示:關於產品特徵變量的參數爲OpenMP指令用Fortran

!$OMP Parallel Do Schedule(Static) 
Do i=1,n 
    z(i)=a*x(i)+y(i) 
End Do 
!$OMP End Parallel Do 

現在,假設我們有一段代碼,許多並行循環中,並沒有確定先驗的方式,也這些調度子句將使程序以最快的速度運行。手工更改每個調度條款將是一個痛苦的屁股,所以這裏就是我想我會做:

Character(Len=10)::sched="Dynamic" 

!$OMP Parallel Do Schedule(sched) 
Do i=1,n 
    z(i)=a*x(i)+y(i) 
End Do 
!$OMP End Parallel Do 

,然後我可以簡單地把「附表」該字符變量在每一個並行化的循環和改變他們全部一次,比如說,把sched =「Static」,然後做一個運行時測試,看哪一個最快!當然,它不起作用 - 至少不會與gfortran或Absoft編譯器一起工作。所以我的問題是以下任何或全部:爲什麼這不起作用?,我怎樣才能使它工作?或者我怎樣才能避免使用這種構造來解決這個問題?任何幫助是極大的讚賞。

回答

2

這是行不通的,因爲模式是不是真的字符串,沒有變量評估在這一點上做的,我想。我能想到的最好的事情是使用像CoCo或C-Preprocessor這樣的預處理器來實現這一點。 但是或者,您可以使用運行時模式,請使用環境變量OMP_SCHEDULE或omp_set_schedule常規設置模式。

+0

啊謝謝!我使用omp_set_schedule例程,它像冠軍一樣工作!那麼,gfortran 6不支持該程序,但Absoft公司編譯器和gfortran 7,我還沒有,聲稱將支持這一程序。但無論如何,這是我腦海中解決的問題。非常感謝您的幫助。 – user14717

0

您指定將在其中循環被編譯成機器代碼的方式產生巨大影響的調度子句。編譯代碼後,調度模式就會被鎖定,並且不能在運行時更改。我同意haraldkl,使用預處理器。