尽可能在堆栈上分配局部变量。
此选项使编写递归代码和可重入代码更容易,并在并行化循环时为优化器提供更多自由。
建议将 -stackvar 与任何并行化选项一起使用。
局部变量是除哑元参数、COMMON 变量、从外部作用域继承的变量或可通过 USE 语句访问的模块变量之外的变量。
在 -stackvar 有效的情况下,局部变量是在堆栈上分配的,除非它们具有属性 SAVE 或 STATIC。请注意,显式初始化的变量是使用 SAVE 属性隐式声明的。缺省情况下,未显式初始化但其某些组件已初始化的结构变量,没有使用 SAVE 隐式声明。此外,与具有 SAVE 或 STATIC 属性的变量等效的变量,也隐式具有 SAVE 或 STATIC。
以静态方式分配的变量隐式初始化为零,除非程序为其显式指定了初始值。在堆栈上分配的变量并未隐式初始化(缺省情况下可进行初始化的结构变量的组件除外)。
使用 -stackvar 将大数组放在 堆栈上可以使堆栈溢出 ,从而导致段故障。此时可能需要增加堆栈大小。
执行程序的初始线程有一个主堆栈,而多线程程序的每个从线程都有自己的线程堆栈。
对于从线程,在 32 位系统上线程堆栈的缺省大小为 4 兆字节,在 64 位系统上的缺省大小为 8 兆字节。limit 命令(不带参数)显示当前的主堆栈大小。 如果使用 -stackvar 时出现段故障,请尝试增加主堆栈和线程堆栈的大小。
示例: 显示当前的主堆栈大小:
demo% limit cputime unlimited filesize unlimited datasize 523256 kbytes stacksize 8192 kbytes <––– coredumpsize unlimited descriptors 64 memorysize unlimited demo%
demo% limit stacksize 65536
通过设置 STACKSIZE 或 OMP_STACKSIZE 环境变量,可以设置每个从线程使用的线程堆栈大小:有关这些环境变量的更多信息,请参见《OpenMP API 用户指南》。
使用 -xcheck=stkovf 进行编译,可启用堆栈溢出情况的运行时检查。有关更多信息,请参见 -xcheck。