ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: OpenMP API ユーザーガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
2.2.2 Oracle Solaris Studio の環境変数
2.2.2.5 SUNW_MP_MAX_POOL_THREADS
2.2.2.6 SUNW_MP_MAX_NESTED_LEVELS
実行プログラムは、各スレーブスレッド用の個別スタックのほか、プログラムを実行する初期 (またはメイン) スレッド用のメインスタックを保持します。スタックは、サブプログラムまたは関数参照の呼び出し中、引数および自動変数を保持するために使用される一時的なメモリーアドレス空間です。スレッドのスタックのサイズが小さすぎる場合は、スタックオーバーフローが発生して、通知なしでデータが壊れたり、セグメント例外が発生したりすることがあります。
f95 にオプション -stackvar を指定して Fortran プログラムをコンパイルすると、自動変数であるかのようにスタック上にローカル変数と配列が割り当てられます。OpenMP プログラムでの -stackvar 指定は、明示的に並列化されたプログラムで必要になります。これは、オプティマイザの呼び出しでのループの並列化機能を向上させるためです (-stackvar フラグについては、『Fortran ユーザーズガイド』を参照)。ただし、スタックに十分なメモリーが割り当てられていない場合は、これを使用するとスタックのオーバーフローが発生する可能性があります。
最初の (メイン) スレッドのスタックサイズを表示または設定するには、C シェルの limit コマンドか、Bourne シェルまたは Korn シェルの ulimit コマンドを使用します。通常、最初のスレッドのデフォルトのスタックサイズは 8M バイトです。
OpenMP プログラムの各スレーブスレッドは、それぞれスレッドスタックを持ちます。このスタックは最初の (メイン) スレッドスタックに似ていますが、そのスレッドに固有のものです。スレッドの PRIVATE 配列および変数 (スレッドにローカル) は、スレッドスタックに割り当てられます。デフォルトのサイズは、32 ビット SPARC V8 および x86 プラットフォームで 4M バイト、64 ビット SPARC V9 および x86 プラットフォームで 8M バイトです。スレーブスレッドスタックのサイズは、OMP_STACKSIZE 環境変数で設定されます。
demo% setenv OMP_STACKSIZE 16384 <-Set thread stack size to 16 Mb (C shell) demo$ OMP_STACKSIZE=16384 <-Set thread stack size to 16 Mb (Bourne/Korn shell) demo$ export OMP_STACKSIZE
スタックオーバーフローを検出するには、-xcheck=stkovf コンパイラオプションを指定して Fortran や C、C++ プログラムをコンパイルし、スタックオーバーフローでセグメント例外を発生させることにより、データが壊れる前にプログラムを停止します。