在 Fortran 90 的模块中定义的数组存储(例如 a(10000))在哪里?是否放入栈中?

Where is the storage of the array (e.g. a(10000)) defined in module in Fortran 90 ? Is it put in the stack?

我的 Fortran 90 程序面临堆栈溢出问题。我将所有参数都放在模块中,当 运行 大示例时出现段错误,这让我很困惑 TAT。我写了一个小程序来验证我对问题可能出在哪里的假设。发现了一些有趣的现象,想请教一下它们的原理是什么

  1. 我在模块中放入了一个非常大的数组(等等REAL a(10000000))。当我在子程序中使用它时,不会出现段错误。因此我想知道数组的存储在哪里?

  2. 我在一个子程序A中分配了一个非常大的数组(等allocate(a(10000000))),并将其传送到另一个子程序B。在B中,我定义为a(10000000),不会出现segment fault。因此我想知道可分配数组的两个子程序之间传输什么?

  3. 对于我自己的复杂程序,我检查了好几次,我分配了模块中的每个数组,但是当示例变大时,仍然出现段错误。我只想知道我是否遗漏了什么会影响堆栈的使用。

现在,我不知道在哪里检查 TAT,所以有没有人可以给我一些调试堆栈溢出段错误的见解?对此我将不胜感激!

我能够使用 Intel Fortran(oneAPI HPC 套件,ifort)重现该问题。为了缓解这个问题,我在大小超过 1000 kb 时设置了堆数组。

以下测试代码

program Console2
use LU_MODULE
    
integer, parameter :: n = 359
real(wp) :: A(n,n), LU(n,n), b(n), x(n), delta
integer :: indx(n), d, ierr

call RANDOM_SEED()
call RANDOM_NUMBER(A)
call RANDOM_NUMBER(b)

A = 3*(A + eye(n))   ! Line 18, where error occus
print *, 'n=', n, ' mem=', sizeof(A)/1024, 'kb'

...

如果 n>=359 没有此设置则失败。

forrtl: severe (170): Program Exception - stack overflow
Image              PC                Routine            Line        Source
FortranConsole2.e  00007FF7F363A727  Unknown               Unknown  Unknown
FortranConsole2.e  00007FF7F363509A  MAIN__                     18  program.f90
FortranConsole2.e  00007FF7F3637E6E  Unknown               Unknown  Unknown
FortranConsole2.e  00007FF7F363AA59  Unknown               Unknown  Unknown
FortranConsole2.e  00007FF7F363A97E  Unknown               Unknown  Unknown
FortranConsole2.e  00007FF7F363A83E  Unknown               Unknown  Unknown
FortranConsole2.e  00007FF7F363AACE  Unknown               Unknown  Unknown
KERNEL32.DLL       00007FFC336A7034  Unknown               Unknown  Unknown
ntdll.dll          00007FFC33B42651  Unknown               Unknown  Unknown

但是启用设置后我得到了预期的输出

 n=         359  mem=                  1006 kb
 ...