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?
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. –
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'. –
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. –