Sun Studio 12: Fortran プログラミングガイド

10.1.6 スタック、スタックサイズ、並列化

プログラムの実行は、プログラムを最初に実行したスレッドのためにメインメモリーのスタックを保持し、各ヘルパースレッドのために個々のスタックを保持します。スタックとは、副プログラムの呼び出し時に引数と AUTOMATIC 変数を保持するために使用される一時的なメモリーアドレス空間です。

メインスタックのデフォルトのサイズは、約 8M バイトです。Fortran コンパイラは、通常、局所変数と配列を (スタックにではなく) STATIC として割り当てます。しかし、-stackvar オプションを使用すると、すべての局所変数と配列をスタックに割り当てます (あたかもそれが AUTOMATIC 変数であるかのように)。-stackvar は並列化とともに使用することを推奨します。なぜなら、ループ中の CALL を並列化するオプティマイザの能力を向上させるからです。 -stackvar は、副プログラム呼び出しを持つ明示的に並列化されたループには必須です。-stackvar については、『Fortran ユーザーズガイド』を参照してください。

C シェル (csh) を使用し limit コマンドにより現在のメインスタックのサイズを表示し、設定します。


demo% limit             C シェルの例
cputime       制限無し
filesize       制限無し
datasize       2097148 kbytes
stacksize       8192 kbytes            <- 現在のメインスタックのサイズ
coredumpsize       0 kbytes
descriptors       64
memorysize       制限無し
demo% limit stacksize 65536       <- メインスタックを 64M バイトに設定
demo% limit stacksize
stacksize       65536 kbytes

Bourne シェルまたは Korn シェルの場合、対応するコマンドは ulimit です。


demo$ ulimit -a         Korn シェルの例
time(seconds)        制限無し
file(blocks)         制限無し
data(kbytes)         2097148
stack(kbytes)        8192
coredump(blocks)     0
nofiles(descriptors) 64
vmemory(kbytes)      制限無し
demo$ ulimit -s 65536
demo$ ulimit -s
65536

マルチスレッド化されたプログラムの各スレッドは、独自のスレッドスタックを持っています。このスタックは、初期スレッドのスタックと似ています。 しかし、スレッド固有のものです。スレッドの PRIVATE 配列と変数 (スレッドに局所的な) は、スレッドスタックに割り当てられます。 64 ビット SPARC および 64 ビット x86 プラットフォームでのデフォルトのサイズは 8M バイトです。そのほかのプラットフォームでは 4M バイトです。 このサイズは、STACKSIZE 環境変数で設定されます。


demo% setenv STACKSIZE 8192    <- スレッドスタックサイズを 8M バイトに設定 C シェル
                          または
demo$ STACKSIZE=8192           Bourne/Korn Shell
demo$ export STACKSIZE

いくつかの並列化された Fortran コードに対しては、スレッドスタックのサイズをデフォルトより大きく設定することが必要になります。しかし、どれくらいの大きさに設定すればいいのかを知る方法はなく、試行錯誤してみるしかありません。 特に、専用配列または局所配列が関連する場合はわかりません。スタックのサイズが小さすぎてスレッドが実行できない場合、プログラムはセグメンテーションフォルトで異常終了します。