2017-06-19 4 views
1

Ich habe ein Problem mit meinem Hauptcode, also habe ich versucht, das Problem zu isolieren. Daher habe ich diesen kleinen Code:Fortran seltsame Segmentierung Fehler

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 

Vorerst bin ich zu verstehen, nicht in der Lage, warum, wenn ich mit ifort kompilieren, habe ich eine segmentation fault haben, und es funktioniert, wenn ich mit gfortran kompilieren. Und am schlimmsten, wenn ich kompiliere mit ifort und gfortran mit ihren fast Optionen, bekomme ich wieder einen segmentation fault (core dumped) Fehler. Und noch verwirrender, wenn ich auch mit beiden Compilern versuchte, mit traceback Optionen zu kompilieren, funktioniert alles einwandfrei.

Ich weiß, dass segmentation fault (core dumped) Fehler bedeutet normalerweise, dass ich versuche, an einem falschen Ort zu lesen oder zu schreiben (Matrix-Indizes usw.); Aber hier mit diesem kleinen Code sehe ich keinen Fehler wie diesen.

Kann mir jemand helfen zu verstehen, warum diese Fehler auftreten?

+1

Lesen Sie diese - https://software.intel.com/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors - und melden Sie sich zurück, nachdem Sie alle Probleme überprüft haben es steigt. –

+0

Es ist gut, ein kleines MCVE zu haben. Versuchen Sie dennoch, die Debugging-Optionen zu verwenden, die Ihre Compiler bieten: -g -fcheck = all -Wall' -g -traceback -check -warn'. –

+0

Ich werde weiter untersuchen, Dinge in Ihrem Link. Aber ich denke, dass das Problem ein Stapelüberlaufproblem war. Ich werde dir das bestätigen. Wie auch immer, Danke für diesen nützlichen Link, den ich beim googlen nicht gefunden habe. –

Antwort

0

Das Problem kommt von der Größe des Stapels, der von einigen Compilern standardmäßig verwendet wird (ifort) oder von einigen anderen, wenn sie die Kompilierung optimieren (gfortran -Ofast). Hier überschreiten unsere Schriften die Größe des Stapels.

Um dies zu lösen, verwende ich die Optionen -heap-arrays für ifort Compiler und -fno-stack-arrays für gfortran Compiler.