ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: C ユーザーガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
C コンパイラは、共有メモリーの並列化に OpenMP API をネイティブで受け入れます。この API は、一連の並列化プラグマで構成されます。OpenMP API の仕様の情報は、OpenMP Web サイト (http://www.openmp.org) にあります。
コンパイラの OpenMP サポートと OpenMP プラグマの認識を有効にするには、-xopenmp オプションを使用してコンパイルします。-xopenmp を使用しないと、コンパイラは OpenMP プラグマをコメントとして扱います。「B.2.131 -xopenmp[= i]」を参照してください。
詳細は、『Oracle Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
OpenMP 実行時システムは、軽度のエラーに対し警告を発行できます。次の関数を使用すると、それらの警告を処理するコールバック関数が登録されます。
int sunw_mp_register_warn(void (*func) (void *) )
この関数のプロトタイプにアクセスするには、<sunw_mp_misc.h> に対する #include プリプロセッサ指令を発行します。
関数を登録したくない場合は、環境変数 SUNW_MP_WARN を TRUE に設定して警告メッセージを stderr に送ります。
OpenMP に関係するプラグマ、環境変数、実行時関数など、OpenMP のこの実装に固有の情報については、『Oracle Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
並列化された C に関係する環境変数の一部を次に示します。OpenMP API 仕様で定義されている追加の環境変数や、Oracle Solaris Studio 実装に固有のものがあります。並列化に関係するすべての環境変数については、『Oracle Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
PARALLEL または OMP_NUM_THREADS
マルチプロセッサ実行を活用できる場合は、PARALLEL 環境変数を設定します。PARALLEL 環境変数には、プログラムの実行に使用できるプロセッサの数を指定します。指定しない場合のデフォルトは、2 です。
対象マシンに複数のプロセッサが搭載されている場合は、スレッドは個々のプロセッサにマップできます。この例では、プログラムを実行すると、2 個のスレッドが生成され、各スレッド上でプログラムの並列化された部分が実行されるようになります。
PARALLEL または OMP_NUM_THREADS のどちらを使用してもかまいません。両者は同等です。
SUNW_MP_THR_IDLE
バリアーで待機しているか、または作業対象となる新しい並列領域を待っている OpenMP プログラム内のアイドル状態のスレッドのステータスを制御します。詳細は、『Oracle Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
SUNW_MP_WARN
この環境変数を TRUE に設定すると、OpenMP やその他の並列化実行時システムからの警告メッセージが出力されます。詳細は、『Oracle Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
STACKSIZE
実行中のプログラムは、マスタースレッド用のメインメモリースタックと、各スレーブスレッド用の個別のスタックを保持します。スタックとは、サブプログラムが呼び出されている間、引数と自動変数を保持するために使用される一時的なメモリーアドレス空間です。
メインスタックのデフォルトのサイズは、約 8M バイトです。現在のメインスタックサイズを表示し、それを設定するには、limit コマンドを使用します。
% limit cputime unlimited filesize unlimited datasize 2097148 kbytes stacksize 8192 kbytes <- current main stack size coredumpsize 0 kbytes descriptors 256 memorysize unlimited % limit stacksize 65536 <- set main stack to 64Mb
マルチスレッド化されたプログラムの各スレーブスレッドは、それ自体のスレッドスタックを持ちます。このスタックはマスタースレッドのメインスタックに似ていますが、各スレッド固有のものです。スレッドのスタックには、スレッド固有の配列とその (スレッドに対して局所的な) 変数が割り当てられます。
すべてのスレーブスレッドは、同じスタックサイズを持ちます。デフォルトでは、32 ビットアプリケーションの場合は 4M バイト、64 ビットアプリケーションの場合は 8M バイトです。このサイズは、STACKSIZE 環境変数で設定します。
% setenv STACKSIZE 16483 <- Set thread stack size to 16 Mb
一部の並列化されたコードでは、スレッドのスタックサイズをデフォルトより大きな値に設定する必要がある場合があります。
コンパイラが、より大きなスタックサイズが必要であるという警告メッセージをときどき生成することがあります。それをどのくらいの大きさに設定するかを決定することは通常、試行錯誤で行われます。スレッド固有/局所配列が関わる場合は特にそうです。スタックサイズが小さすぎてスレッドを実行できない場合は、セグメンテーション違反でプログラムが終了します。
STACKSIZE 環境変数の設定は、Oracle Solaris pthreads API を使用しているプログラムに影響しません。
キーワード restrict は、並列化された C で使用できます。キーワード restrict を適切に使用することは、コードシーケンスを並列化できるかどうかを判定するために必要なデータの別名をオプティマイザが評価するのに役立ちます。詳細については、「D.1.2 C99 のキーワード」を参照してください。