スタックは、サブプログラムまたは関数の呼び出し中、引数および自動変数を保持するために使用される一時的なメモリーアドレス空間です。スレッドのスタックのサイズが小さすぎる場合は、スタックオーバーフローが発生して、通知なしでデータが壊れたり、セグメント例外が発生したりすることがあります。
実行プログラムは、プログラムを実行する最初の (メイン) スレッドのメインスタックを維持します。最初の (メイン) スレッドのスタックサイズを表示または設定するには、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