Fortran 奇怪的分段错误
Fortran strange segmentation fault
我的主要代码有一些问题,所以我试图找出问题所在。
因此,我有这个小代码:
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
编译时它可以工作。最糟糕的是,当我同时使用 ifort
和 gfortran
以及它们的 fast
选项进行编译时,我再次遇到 segmentation fault (core dumped)
错误。更令人困惑的是,当我还尝试使用两个编译器使用 traceback
选项进行编译时,一切正常。
我知道 segmentation fault (core dumped)
错误通常意味着我尝试在错误的位置读取或写入(矩阵索引等...);但是这里有这个小代码,我看不出有这样的错误。
有谁能帮我理解为什么会出现这些错误?
问题来自某些编译器默认使用的堆栈大小 (ifort
) 或其他一些编译器在优化编译时使用的堆栈大小 (gfortran -Ofast
)。在这里,我们的写法超过了栈的大小
为了解决这个问题,我对 ifort
编译器使用选项 -heap-arrays
,对 gfortran
编译器使用选项 -fno-stack-arrays
。
我的主要代码有一些问题,所以我试图找出问题所在。 因此,我有这个小代码:
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
编译时它可以工作。最糟糕的是,当我同时使用 ifort
和 gfortran
以及它们的 fast
选项进行编译时,我再次遇到 segmentation fault (core dumped)
错误。更令人困惑的是,当我还尝试使用两个编译器使用 traceback
选项进行编译时,一切正常。
我知道 segmentation fault (core dumped)
错误通常意味着我尝试在错误的位置读取或写入(矩阵索引等...);但是这里有这个小代码,我看不出有这样的错误。
有谁能帮我理解为什么会出现这些错误?
问题来自某些编译器默认使用的堆栈大小 (ifort
) 或其他一些编译器在优化编译时使用的堆栈大小 (gfortran -Ofast
)。在这里,我们的写法超过了栈的大小
为了解决这个问题,我对 ifort
编译器使用选项 -heap-arrays
,对 gfortran
编译器使用选项 -fno-stack-arrays
。