2017-06-19 119 views
1

我的主代碼存在一些問題,所以我試圖找出問題所在。 因此,我有這樣的小碼:Fortran奇怪的分段錯誤

MODULE Param 
    IMPLICIT NONE 

    integer, parameter :: dr = SELECTED_REAL_KIND(15, 307) 
    integer     :: D =3 
    integer     :: Q=10 
    integer     :: mmo=16 
    integer     :: n=2 
    integer     :: x=80 
    integer     :: y=70 
    integer     :: z=20 
    integer     :: tMax=8 
END MODULE Param 

module m 
contains 
    subroutine compute(f, r) 
     USE Param, ONLY: dr, mmo, x, y, z, n 
     IMPLICIT NONE 

     real (kind=dr), intent(in) :: f(x,y,z, 0:mmo, n) 
     real (kind=dr), intent(out) :: r(x, y, z, n) 
     real (kind=dr) :: fGlob(x,y,z, 0:mmo) 
     !------------------------------------------------------------------------- 

     print*, 'We are in compute subroutine' 

     r= 00.0 

     fGlob=sum(f,dim=5) 
     r=sum(f, dim=4) 

     print*, 'fGlob=', fGlob(1,1,1, 1) 
     print*, 'f=', f(1,1,1, 0,1) 
     print*, 'r=', r(1,1,1, 1) 
    end subroutine compute 
end module m 


PROGRAM test_prog 
    USE Param 
    USE m 
    Implicit None 

    integer :: tStep 
    real (kind=dr), dimension(:,:,:, :,:), allocatable :: f 
    real (kind=dr), dimension(:,:,:,:), allocatable :: r 
    !---------------------------------------------------------------------------- 

    ! Initialise the parameters. 
    print*, 'beginning of the test' 

    ! Allocate 
    allocate(f(x,y,z, 0:mmo,n)) 
    allocate(r(x,y,z, n)) 

    f=1.0_dr 

    ! --------------------------------------------------------- 
    !  Iteration over time 
    ! --------------------------------------------------------- 
    do tStep = 1, tMax 
     print *, tStep 
     call compute(f,r) 
     f=f+1 
     print *, 'tStep', tStep 
    enddo 

    print*, 'f=', f(1,1,1, 0,1) 
    print*, 'r=', r(1,1,1, 1) 

    ! Deallacation 
    deallocate(f) 
    deallocate(r) 
    print*, 'End of the test program' 
END PROGRAM test_prog 

現在,我無法理解爲什麼當我ifort編譯,我有一個segmentation fault,當我與gfortran編譯工作。而最糟糕的是,當我編譯ifortgfortran以及它們的fast選項時,我再次遇到segmentation fault (core dumped)錯誤。而更令人困惑的是,當我也試着用兩種編譯器編譯traceback選項時,一切正常。

我知道segmentation fault (core dumped)錯誤通常意味着我嘗試讀取或寫入錯誤的位置(矩陣索引等);但是在這個小代碼中,我沒有看到像這樣的錯誤。

有沒有人可以幫助我理解爲什麼會出現這些錯誤?

+1

閱讀此內容 - https://software.intel.com/zh-CN/articles/determining-root-cause-of-sigsegv-or-sigbus-errors - 並在檢查完所有問題後回報它引發了。 –

+0

有一個小的mcve很好。儘管如此,請嘗試編譯器提供的調試選項:-g -fcheck = all -Wall''-g -traceback -check -warn'。 –

+0

我會繼續調查您的鏈接中的內容。但我認爲這個問題是堆棧溢出問題。我會向你證實這一點。無論如何,感謝這個有用的鏈接,我沒有發現當我谷歌搜索。 –

回答

0

問題來自於某些編譯器在默認情況下使用的堆棧大小(ifort)或其他優化編譯(gfortran -Ofast)時所使用的堆棧大小。在這裏,我們的作品超過了堆棧的大小。

爲了解決這個問題,我使用-heap-arrays作爲ifort編譯器的選項,-fno-stack-arrays作爲gfortran編譯器。