fortran66のブログ

fortran について書きます。

【メモ帳】block 内の配列 stack か static か

stack か static か

block 構文内部で宣言される変数は stack に確保されるので、大きな配列を取ると実行時に stack overflow が出ます。 しかしながら、配列に初期値を与えると Fortran の罠で save オプションが自動的につくので、配列が静的に確保され stack を使わなくなるので、実行時エラーが出なくなります。

block 内で大きな配列を使う時は、allocatable で heap に確保するほかに、save 属性を付けて static に確保する手段があることになります。メインプログラムなどでは、static に取る方が無駄なオーバヘッドを避けられますが、save 属性がつくともう一回同じ block に来た時に前回のデータを再利用するのではないかという印象を与えそうな気がします。

追記:intel fortran の場合 /heap-arrays100000 で大き目の配列をスタックからヒープへ移せます。暗黙的に利用されるものも移してくれるようです。

初期値与えず (stack 変数)

    program test
        implicit none

        block 
            real :: x(10**6)
            call random_number(x)
            print *, sum(x)
        end block     
    end program test
forrtl: 致命的なエラー (170): プログラム例外 - スタック・オーバーフロー
Image              PC                Routine            Line        Source
Console8.exe       00007FF6B7343698  Unknown               Unknown  Unknown
Console8.exe       00007FF6B734100B  MAIN__                      1  Console8.f90
Console8.exe       00007FF6B734120E  Unknown               Unknown  Unknown
Console8.exe       00007FF6B7343BB9  Unknown               Unknown  Unknown
Console8.exe       00007FF6B7343ADE  Unknown               Unknown  Unknown
Console8.exe       00007FF6B734399E  Unknown               Unknown  Unknown
Console8.exe       00007FF6B7343C29  Unknown               Unknown  Unknown
KERNEL32.DLL       00007FFC12106FD4  Unknown               Unknown  Unknown
ntdll.dll          00007FFC13C3CEC1  Unknown               Unknown  Unknown

初期値与える (static 変数)

    program test
        implicit none

        block 
            real :: x(10**6)=0.0 
            call random_number(x)
            print *, sum(x)
        end block     
    end program test
   499870.9

初期値を与えないが save option つける (static 変数)

    program test
        implicit none

        block 
            real, save :: x(10**6)
            call random_number(x)
            print *, sum(x)
        end block     
    end program test
   499870.9

Modern Fortran: Building efficient parallel applications

Modern Fortran: Building efficient parallel applications

  • 作者:Curcic, Milan
  • 発売日: 2020/11/24
  • メディア: ペーパーバック