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
- 作者:Curcic, Milan
- 発売日: 2020/11/24
- メディア: ペーパーバック