2013-02-04 30 views
3

我嘗試使用OpenMP並行化Fortran90中的大程序。解決OpenMP中分段錯誤的最佳方法

我總是得到分段錯誤錯誤。我想知道是否有任何簡單的方法來解決它們。如果你有分段錯誤錯誤,你會怎麼做?

+2

除非你真的搞砸了,最可能的原因是私有靜態數組的堆棧空間不足。與串行情況不同,只要OpenMP處於活動狀態,自動堆數組就會被禁用,並且所有未保存的本地數組都會成爲堆棧數組。請參閱[此答案](http://stackoverflow.com/a/13266595/1374437)以獲取更多信息。 –

回答

7

首先將您的代碼恢復爲原始的非並行版本。你確實有版本控制下的這個問題嗎?

非常仔細地檢查您的串行程序不會導致任何分段錯誤。特別要注意this document from Intel中提出的問題。即使您未使用英特爾Fortran編譯器,也請閱讀本文。採取它所建議的糾正措施。

現在,平行你的第一個構造。如果可以的話,選擇一個簡單的,非嵌套的循環。重新測試你的程序。想想你已經做了什麼,並確保你明白髮生了什麼。選擇另一個簡單的構造來平行。當你完成了簡單的步驟後,就可以進入更復雜的步驟,隨時隨地進行測試,並隨時學習。

因此,要回答你的問題:解決這些問題的最佳方法是不要讓他們擺在首位。你報告你總是會出現分段錯誤,這表明你在走路之前就試圖跑步。

並回答另一個問題:不,沒有簡單的方法來解決它們。

+0

謝謝你的回答! – Ling0k

3

正如HPM建議的那樣,只有在使用OpenMP進行編譯時,或者在沒有OpenMP的情況下編譯時纔會出現分段錯誤?

我建議使用編譯器提供的所有調試選項進行編譯。您的編譯器可能能夠識別出一些問題,並將其作爲Fortran問題報告給您,而不是作爲內存訪問問題報告給您。例如,運行時間下標檢查將識別可導致分段錯誤的非法下標。其他編譯器選項可以執行良好的編碼實踐,從而減少錯誤的發生。你使用什麼編譯器?

+0

+1表示調試選項。 – dreamcrash