Oracle® Solaris Studio 12.4:Fortran 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

3.4.88 –stackvar

尽可能在堆栈上分配局部变量。

此选项使编写递归代码和可重入代码更容易,并在并行化循环时为优化器提供更多自由。

建议将 -stackvar 与任何并行化选项一起使用。

局部变量是除哑元参数、COMMON 变量、从外部作用域继承的变量或可通过 USE 语句访问的模块变量之外的变量。

-stackvar 有效的情况下,局部变量是在堆栈上分配的,除非它们具有属性 SAVESTATIC。请注意,显式初始化的变量是使用 SAVE 属性隐式声明的。缺省情况下,未显式初始化但其某些组件已初始化的结构变量,没有使用 SAVE 隐式声明。此外,与具有 SAVESTATIC 属性的变量等效的变量,也隐式具有 SAVESTATIC

以静态方式分配的变量隐式初始化为零,除非程序为其显式指定了初始值。在堆栈上分配的变量并未隐式初始化(缺省情况下可进行初始化的结构变量的组件除外)。

使用 -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%

示例:将堆栈大小设置为 64 兆字节:

demo% limit stacksize 65536

通过设置 STACKSIZEOMP_STACKSIZE 环境变量,可以设置每个从线程使用的线程堆栈大小:有关这些环境变量的更多信息,请参见《OpenMP API 用户指南》。

使用 -xcheck=stkovf 进行编译,可启用堆栈溢出情况的运行时检查。有关更多信息,请参见 -xcheck