【问题标题】:Fortran strange segmentation faultFortran 奇怪的分段错误
【发布时间】:2017-06-19 14:41:12
【问题描述】:

我的主代码有问题,所以我试图找出问题所在。 因此,我有这个小代码:

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) 错误通常意味着我尝试在错误的位置进行读取或写入(矩阵索引等...);但是这里有这个小代码,我看不出这样的错误。

谁能帮我理解为什么会出现这些错误?

【问题讨论】:

  • 阅读这篇文章 -- software.intel.com/en-us/articles/… -- 在你检查了它提出的所有问题后报告。
  • 有一个小的 mcve 真是太好了。不过,请尝试您的编译器提供的调试选项-g -fcheck=all -Wall-g -traceback -check -warn
  • 我会继续调查,你链接里的东西。但我认为问题是堆栈溢出问题。我会向你确认这一点。无论如何,感谢这个有用的链接,我在谷歌搜索时没有找到。
  • fGlob 可能会被某些编译器(英特尔)默认放入堆栈。试试-heap-arrays
  • @VladimirF 我尝试了您的调试选项,没有返回任何内容。我尝试使用-heap-arrays -fast -O3(ifort) 和-fno-stack-arrays -Ofast -O3(gfortran),它成功了。使用-fno-stack-arrays可以吗?我应该在-heap-arrays 之后放一个数字以供一般用途还是保持这样?这些选项是否破坏了优化?我想你可以评论这些新问题的答案/解释,形成一个完整的答案。谢谢

标签: fortran gfortran intel-fortran


【解决方案1】:

问题来自某些编译器默认使用的堆栈大小 (ifort) 或其他一些编译器在优化编译时使用的堆栈大小 (gfortran -Ofast)。在这里,我们的作品超过了堆栈的大小。

为了解决这个问题,我对ifort 编译器使用选项-heap-arrays,对gfortran 编译器使用-fno-stack-arrays

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多