スタックは、サブプログラムまたは関数の呼び出し中、引数および自動変数を保持するために使用される一時的なメモリーアドレス空間です。スレッドのスタックのサイズが小さすぎる場合は、スタックオーバーフローが発生して、通知なしでデータが壊れたり、セグメント例外が発生したりすることがあります。
実行プログラムは、プログラムを実行する最初の (メイン) スレッドのメインスタックを維持します。最初の (メイン) スレッドのスタックサイズを表示または設定するには、C シェルの limit コマンドか、Bourne シェルまたは Korn シェルの ulimit コマンドを使用します。
また、プログラムの各 OpenMP ヘルパースレッドには、独自のスレッドスタックがあります。このスタックは最初の (メイン) スレッドスタックに似ていますが、そのスレッドに固有のものです。スレッドの private 変数は、スレッドスタックに割り当てられます。ヘルパースレッドスタックのデフォルトのサイズは、32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイトです。ヘルパースレッドスタックのサイズを設定するには、OMP_STACKSIZE 環境変数を使用します。
-stackvar オプションを指定して Fortran プログラムをコンパイルすると、自動変数であるかのようにスタック上にローカル変数と配列が割り当てられます。-xopenmp、-xopenmp=parallel、または -xopenmp=noopt オプションを指定してコンパイルされたプログラムは、-stackvar を意味しています。スタックに十分なメモリーが割り当てられていない場合は、これによりスタックのオーバーフローが発生する可能性があります。スタックの大きさが十分であることを確認してください。
C シェルの例:
% 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 シェルまたは Korn シェルの例:
$ 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
スタックオーバーフローを検出するには、-xcheck=stkovf コンパイラオプションを指定して C、C++、または Fortran プログラムをコンパイルします。構文は次のとおりです。
-xcheck=stkovf[:detect | :diagnose]
-xheck=stkovf:detect を指定した場合、そのエラーに通常関連付けられているシグナルハンドラを実行することによって、検出されたスタックオーバーフローエラーが処理されます。
-xcheck=stkovf:diagnose を指定した場合、関連付けられているシグナルをキャッチし、stack_violation(3C) を呼び出してエラーを診断することによって、検出されたスタックオーバーフローエラーが処理されます。スタックオーバーフローが診断されると、エラーメッセージは stderr に出力されます。これは -xcheck=stkovf のみを指定した場合のデフォルトの動作です。
-xcheck=stkovf コンパイラオプションについては、cc(1)、CC(1)、または f95(1) のマニュアルページを参照してください。