Oracle® Solaris Studio 12.4:OpenMP API 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

2.3 堆栈和堆栈大小

堆栈是临时内存地址空间,用于保留子程序或函数调用期间的参数和自动变量。如果线程堆栈的大小太小,则可能会出现堆栈溢出,从而导致无提示的数据损坏或段故障。

正在执行的程序为执行该程序的初始线程(或主线程)维护一个主堆栈。使用 limit C shell 命令或者 ulimit Bourne 或 Korn shell 命令可显示或设置初始线程(或主线程)的堆栈大小。

另外,程序中的每个 OpenMP 辅助线程有自己的线程堆栈。此堆栈模拟初始(或主)线程堆栈,但对于线程是唯一的。线程的 private 变量在线程堆栈上进行分配。对于 32 位应用程序,辅助线程堆栈的缺省大小为 4 MB;对于 64 位应用程序,缺省值为 8 MB。使用 OMP_STACKSIZE 环境变量设置辅助线程堆栈的大小。

请注意,使用 -stackvar 选项编译 Fortran 程序将强制在堆栈中分配局部变量和数组,就好像它们是自动变量。对于使用 -xopenmp-xopenmp=parallel -xopenmp=noopt 选项编译的程序,-stackvar 为隐式选项。如果为堆栈分配的内存不足,会导致堆栈溢出。请务必确保堆栈足够大。

C shell 示例:

% limit stacksize 32768   <- Sets the main thread stack size to 32 Megabytes
% setenv OMP_STACKSIZE 16384   <- Sets the helper thread stack size to 16 Megabytes

Bourne shell 或 Korn shell 示例:

$ ulimit -s 32768   <- Sets the main thread stack size to 32 Megabytes

$ OMP_STACKSIZE=16384   <- Sets the helper thread stack size to 16 Megabytes 
$ export OMP_STACKSIZE