プログラムの実行は、プログラムを最初に実行したスレッドのためにメインメモリーのスタックを保持し、各ヘルパースレッドのために個々のスタックを保持します。スタックとは、副プログラムの呼び出し時に引数と 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 コードに対しては、スレッドスタックのサイズをデフォルトより大きく設定することが必要になります。しかし、どれくらいの大きさに設定すればいいのかを知る方法はなく、試行錯誤してみるしかありません。 特に、専用配列または局所配列が関連する場合はわかりません。スタックのサイズが小さすぎてスレッドが実行できない場合、プログラムはセグメンテーションフォルトで異常終了します。