Sun Studio 12:OpenMP API 用户指南

2.5 栈和栈大小

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

通常,主栈的缺省大小为 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 兆字节。辅助线程栈的大小使用 STACKSIZE 环境变量来设置。


demo% setenv STACKSIZE 16384   <-将线程栈大小设置为 16 Mb (C shell)

demo$ STACKSIZE=16384          <-相同,使用 Bourne/Korn shell
demo$ export STACKSIZE

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