2010-06-18 62 views
0

我刷新openmp有點,並陷入這種奇怪的情況。剃掉了一堆,我創建了一個顯示問題段錯誤與-fopenmp爲一個簡單的程序

program ex2 
    implicit none 
    integer, parameter :: n=10000000 
    integer :: i 
    real :: x(n) 

    do i=1,n 
     x(i) = 0.0d0 
    enddo 

end program 

與在mac上指定標誌,gfortran 4.3.4(10.6)編譯,程序正確執行這個最小的小例子。

但是,如果我使用-fopenmp啓用openmp,程序將終止並出現分段錯誤。顯然,沒有代碼被執行,因爲它立即崩潰。正如您所看到的,openmp在代碼中不會用於並行化任何事情。我試圖修改堆棧大小,都使用ulimit -fmax-stack-var-size,並且在任何情況下,千萬個實數都不是我定義的一個大數組。

我在做什麼錯?

回答

4

是的,openmp通常會改變分配內存的方式。先前的討論:OpenMP in Fortran

搜索在網絡上,我發現http://homepage.mac.com/eric.c/hpc/contents/documentation/How%20to%20increase%20the%20stack%20size%20on%20Mac%20OS%20X.pdf

gfortran-MP-4.3 -fopenmp ex2.f90輪候冊,-stack_size,0x40000000之後,-stack_addr,0xf0000000 -o ex2.exe

解決了我的Mac上的問題。

+0

它適用於我,但只能通過刪除-stack_addr規範。我得到頁面零段和堆棧段之間的段重疊。我想指定stack_size,這將離開編譯器安排的堆棧地址。 – 2010-06-18 23:14:58

0

下面是一個模糊的嘗試答案:openmp標誌是否將數組從堆棧移動到堆?如果是這樣,那可能會有什麼影響?

2

我同意M.S.B.這是一個常見的堆棧大小問題。我建議在堆上分配x字段。我也儘量避免在堆棧上使用數組(對於所有局部變量,在您的情況下,堆棧式分配會發生)。這可以防止像子例程這樣的一些令人討厭的錯誤在某個問題大小時開始出現故障,或者在另一臺機器上出現不同堆棧大小的問題。同樣從我的經驗來看,堆上的分配和釋放操作並不會導致很大的運行時間開銷。