Sun Studio 12:Fortran 编程指南

10.1.6 栈、栈大小和并行化

执行程序可为执行该程序的初始线程维护一个主内存栈,还可为每个辅助线程维护不同的栈。栈为临时内存地址空间,用来保存子程序调用期间的参数和 AUTOMATIC 变量。

主栈的缺省大小约为 8 兆字节。Fortran 编译器通常会将局部变量和数组作为 STATIC 进行分配(而不是在栈中)。但是,-stackvar 选项强制在栈内分配所有局部变量和数组(就像它们是 AUTOMATIC 变量一样)。建议在并行化时使用 -stackvar,因为它可增强优化程序在循环中并行化子程序调用的功能。对于包含子程序调用的显式并行化循环,-stackvar必需的。(请参见《Fortran 用户指南》中对 -stackvar 的介绍。)

使用 C shell (csh) 时,limit 命令会显示当前主栈大小,而且会对其进行设置:


demo% limit             C shell example
cputime       unlimited
filesize       unlimited
datasize       2097148 kbytes
stacksize       8192 kbytes            <- current main stack size
coredumpsize       0 kbytes
descriptors       64
memorysize       unlimited
demo% limit stacksize 65536       <- set main stack to 64Mb
demo% limit stacksize
stacksize       65536 kbytes

对于 Bourne 或 Korn shell,相应的命令为 ulimit


demo$ ulimit -a         Korn Shell example
time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         2097148
stack(kbytes)        8192
coredump(blocks)     0
nofiles(descriptors) 64
vmemory(kbytes)      unlimited
demo$ ulimit -s 65536
demo$ ulimit -s
65536

多线程程序的每个辅助线程都有自己的线程栈。该栈模拟初始线程栈,但对于线程是唯一的。线程的 PRIVATE 数组和变量(线程的局部变量)在线程栈中分配。缺省大小在 64 位 SPARC 和 64 位 x86 平台上为 8 兆字节,在其他平台上为 4 兆字节。此大小是通过 STACKSIZE 环境变量设置的:


demo% setenv STACKSIZE 8192    <- Set thread stack size to 8 Mb    C shell
                          -or-
demo$ STACKSIZE=8192           Bourne/Korn Shell
demo$ export STACKSIZE

对于某些已并行的 Fortran 代码,可能需要将线程栈大小设置为比缺省值大的值。但是,除了反复进行错误试验,不可能知道其确切大小,特别是如果涉及到专用/局部数组就更是如此。如果栈大小太小不足以运行线程,程序将会因段故障而中止。