2010-05-19 61 views
4

我很少使用Fortran,但是我一直負責將遺留代碼重寫爲並行運行。我正在使用gfortran編譯器選擇。我在https://computing.llnl.gov/tutorials/openMP/以及其他一些地方發現了一些優秀的資源。Fortran中的OpenMP

我的問題是這樣的,以前我添加任何OpenMP指令,如果我只是編譯遺留程序:

gfortran Example1.F90 -o例1

一切正常,但即使打開OpenMP的編譯器選項無添加指令:

gfortran -openmp Example1.F90 -o例1

當我運行遺留程序與分段故障結束。使用我編寫的較小的測試程序,我已經成功編譯了其他程序,其中包含可在多個線程上運行的-openmp,但是我爲什麼單獨啓用此選項並且沒有任何指令導致seg故障而感到茫然。

我很抱歉,如果我的問題很簡單。我可以發佈代碼,但它很長。它的故障,因爲我分配初始值:

REAL, DIMENSION(da,da) :: uconsold 
    REAL, DIMENSION(da,da,dr,dk) :: uconsolde 

    ... 

    uconsold=0.0  
    uconsolde=0.0  

的第一項任務,以「uconsold」工作正常,第二個似乎是錯的,當我發表意見線作爲源出下幾行執行歡快,直到「 uconsolde「再次使用。

謝謝你在這件事情上的任何幫助。

+0

就我所見,這不是遺留代碼。這是聲明數組的現代方式。至於openmp而言,對鏈接上的教程充分尊重,我虛心推薦「使用OpenMP」一書。對於從來沒有處理過的人來說,這是非常友好的http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=11387 ...還有一個,但我不'現在就把它放在我的書架上,不能重新記錄作者。如果你有興趣給我發一條評論,當我回家時我會查看它。 – Rook 2010-05-19 21:25:02

回答

7

也許你正在運行堆棧空間?使用openmp變量將在堆棧中,以便每個線程都有自己的副本。也許你的數組很大,甚至有一個線程(沒有openmp指令),他們正在使用堆棧。只是猜測...嘗試操作系統的方法來增加堆棧空間的大小,並查看分段故障是否消失。

另一種方法:指定數組應該放在堆上,可以使其「可分配」。 OpenMP版本3.0允許Fortran可分配數組的更多用途 - 我不確定細節。

+0

雖然我認爲@MSB提出了一個合理的建議,但我堅持不同意'每個線程都有自己的副本'的陳述。除非你聲明一個變量是私有的,否則所有的線程都會共享這個變量。我從未遇到OpenMP系統,它通過將共享變量複製到所有線程並管理幕後一致性來實現共享變量。 – 2010-05-19 18:19:10

+0

你完全正確,在我的Linux機器上: ulimit -s unlimited ./實例1 工作就像一個魅力。這可能超出了範圍(以及我95%的時間花在Java中這一事實的悲傷結果),但我不知何故都認爲通常編譯的fortran和openmp會使用堆棧空間。由於我寧願讀一本書,而不願意讓你煩惱,你是否碰巧知道一個好的資源,我可以檢查一下,瞭解我已經把自己變得更好一點了? – Dio 2010-05-19 18:39:54

+0

@高性能標記是正確的,默認是變量是共享的。然而,編譯器在啓用openmp的情況下切換到在堆棧上放置本地數組是很常見的。這對於可能從平行區域調用的子例程很有用。 推薦書籍:Chapman,Jost,van der Pas&Kuck的「使用OpenMP」。我的推薦 – 2010-05-19 18:54:30

2

我有這個問題。這很奇怪:我只是爲了聲明33x33數組或11x11x11數組而沒有OpenMP指令而得到segfaults;這些段錯誤發生在具有4 GB RAM的英特爾Mac上。讓它們「可分配」而不是靜態分配解決了這個問題。