正在执行的程序为执行该程序的初始(或主)线程维护一个主堆栈,并为每个从属线程维护不同的堆栈。堆栈是临时内存地址空间,用于保留子程序或函数引用调用期间的参数和自动变量。如果线程堆栈的大小太小,则可能会出现堆栈溢出,从而导致无提示数据损坏或段故障。
使用 f95 -stackvar 选项编译 Fortran 程序会强制在堆栈中分配局部变量和数组,就好像它们是自动变量。显式并行化的程序暗指对 OpenMP 程序使用 -stackvar,因为该选项可提高优化器将循环中的调用并行化的能力。(有关 -stackvar 标志的讨论,请参见 Fortran 用户指南。)但是,如果为堆栈分配的内存不足,该使用会导致堆栈溢出。
使用 limit C-shell 命令或者 ulimit Bourne 或 Korn shell 命令可显示或设置初始线程(或主线程)的堆栈大小。一般而言,初始线程的缺省堆栈大小为 8 MB。
OpenMP 程序的每个从属线程均具有其自身的线程堆栈。此堆栈模拟初始(或主)线程堆栈,但对于线程是唯一的。线程的 PRIVATE 数组和变量(对于线程是局部的)在线程堆栈中分配。在 32 位 SPARC V8 和 x86 平台上,缺省大小为 4 MB;在 64 位 SPARC V9 和 x86 平台上,缺省大小为 8 MB。从属线程堆栈的大小通过 OMP_STACKSIZE 环境变量来设置。