Oracle Solaris Studio 12.2:OpenMP API 用户指南

2.4 栈和栈大小

正在执行的程序为执行该程序的初始(或主)线程维护一个主栈,并为每个从属线程维护不同的栈。栈是临时内存地址空间,用于保留子程序或函数引用调用期间的参数和自动变量。

通常,主栈的缺省大小为 8 兆字节。使用 f95 -stackvar 选项编译 Fortran 程序会强制在栈中分配局部变量和数组,就好像它们是自动变量。显式并行化的程序暗指对 OpenMP 程序使用 -stackvar,因为该选项可提高优化器将循环中的调用并行化的能力。(有关 -stackvar 标志的讨论,请参见《Fortran 用户指南》。)但是,如果为栈分配的内存不足,这会导致栈溢出。

使用 limit C-shell 命令或 ulimit ksh/sh 命令可显示或设置主栈的大小。

OpenMP 程序的每个从属线程均具有其自身的线程栈。此栈模拟初始(或主)线程栈,但对于线程是唯一的。线程的 PRIVATE 数组和变量(对于线程是局部的)在线程栈中分配。在 32 位 SPARC V8 和 x86 平台上,缺省大小为 4 兆字节;在 64 位 SPARC V9 和 x86 平台上,缺省大小为 8 兆字节。从属线程栈的大小通过 OMP_STACKSIZE 环境变量来设置。


demo% setenv OMP_STACKSIZE 16384   <-Set thread stack size to 16 Mb (C shell)

demo$ OMP_STACKSIZE=16384          <-Same, using Bourne/Korn shell
demo$ export OMP_STACKSIZE

可能需要反复试验才能确定最佳栈大小。如果栈大小太小,不足以满足线程的运行需要,可能会导致无提示数据损坏或段故障。如果无法确定是否发生栈溢出,请使用 -xcheck=stkovf 编译器选项编译 Fortran、C 或 C++ 程序,以强制在栈溢出时发生段故障。这样便可以在发生数据损坏前停止程序。