2017-06-19 25 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/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors - すべての問題をチェックした後に報告するそれが起こる。 –

+0

小さなmcveを持つのが良いです。それでも、コンパイラが '-g -fcheck = all -Wall'' -g -traceback -check -warn'を指定してデバッグオプションを試してみてください。 –

+0

私はあなたのリンクの中で、調査を続けます。しかし、私は問題がスタックオーバーフローの問題だと思う。私はあなたにこれを確認します。とにかく、私がグーグルで見つけていないこの便利なリンクをありがとう。 –

答えて

0

問題は、コンパイル時にデフォルト(ifort)またはコンパイル時に最適化(gfortran -Ofast)されたコンパイラによって使用されるスタックのサイズに起因します。ここでは、私たちの著作はスタックのサイズを超えています。

これを解決するために、ifortコンパイラの場合は-heap-arraysgfortranコンパイラの場合は-fno-stack-arraysというオプションを使用します。