Sun Studio 12: OpenMP API ユーザーズガイド

2.5 スタックとスタックサイズ

実行プログラムは、各スレーブスレッド用の個別スタックのほか、プログラムを実行する初期スレッド用のメインメモリースタックを保持します。スタックは、サブプログラムまたは関数参照の呼び出し中、引数および自動変数を保持するために使用される一時的なメモリーアドレス空間です。

デフォルトのメインスタックのサイズは 8M バイトです。f95 にオプション -stackvar を指定して Fortran プログラムをコンパイルすると、自動変数であるかのようにスタック上にローカル変数と配列が割り当てられます。OpenMP プログラムでの -stackvar 指定は、明示的に並列化されたプログラムで必要になります。これは、オプティマイザのループでの呼び出しの並列化機能を向上させるためです (-stackvar フラグについては、『Fortran ユーザーズガイド』を参照)。ただし、スタックに十分なメモリーが割り当てられていない場合は、スタックのオーバーフローが発生する可能性があります。

メインスタックのサイズを表示または設定するには、C シェルの limit コマンド、または ksh、sh の ulimit コマンドを使用します。

OpenMP プログラムの各スレーブスレッドは、それぞれスレッドスタックを持ちます。このスタックは最初の (メイン) スレッドスタックに似ていますが、そのスレッドに固有のものです。スレッドの PRIVATE 配列および変数 (スレッドにローカル) は、スレッドスタックに割り当てられます。デフォルトのサイズは、32 ビット SPARC V8 および x86 プラットフォームで 4M バイト、64 ビット SPARC V9 および x86 プラットフォームで 8M バイトです。ヘルパースレッドスタックのサイズは、STACKSIZE 環境変数で設定されます。


demo% setenv STACKSIZE 16384   <-スレッドのスタックサイズを 16 Mb に設定 (C シェル)

demo$ STACKSIZE=16384          <-同上 (Bourne/Korn シェル)
demo$ export STACKSIZE

最適なスタックサイズを判定するには、試行とエラーを経る必要があるかもしれません。スタックサイズがスレッドに対して小さすぎて実行できない場合、エラーメッセージが出力されないまま、隣接するスレッドでデータ破壊やセグメントエラーが発生する可能性があります。スタックオーバーフローが発生するかどうか不確かな場合、-xcheck=stkovf コンパイラオプションを指定して Fortran や C、C++ プログラムをコンパイルすると、スタックオーバーフローのセグメント例外を発生させることができます。この場合、データ破壊が発生する前にプログラムの実行が停止します (注: -xcheck=stkovf コンパイラオプションは、SPARC システム上でのみ使用できます)。