変数は、並列環境において共用コンテキストか private コンテキストのいずれかを持つことができます。
変数のデフォルトのコンテキストは、以下の規則によって決まります。
以下のコード・セグメントは、これらのデフォルト・ルールの例を示したものです。
int E1; /* shared static */
void main (argvc,...) { /* argvc is shared */ int i; /* shared automatic */
void *p = malloc(...); /* memory allocated by malloc */ /* is accessible by all threads */ /* and cannot be privatized */
#pragma omp parallel firstprivate (p) { int b; /* private automatic */ static int s; /* shared static */ #pragma omp for for (i =0;...) { b = 1; /* b is still private here ! */ foo (i); /* i is private here because it */ /* is an iteration variable */ }
#pragma omp parallel { b = 1; /* b is shared here because it */ /* is another parallel region */ } } }
int E2; /*shared static */
void foo (int x) { /* x is private for the parallel */ /* region it was called from */
int c; /* the same */ ... }
コンパイラーは、プログラムのセマンティクスの変更が必要でなければ、いくつかの共用変数を private にすることができます。例えば、それぞれのループ反復が共用変数の固有の値を使用する場合は、その変数を private にすることができます。private になった共用変数は、 -qinfo=private オプションによって報告されます。クリティカル・セクションを使用して、このレポートにリストされないすべての共用変数へのアクセスを同期化してください。
OpenMP プリプロセッサー・ディレクティブには、選択したデータ変数の可視性コンテキストを指定できるものがあります。データ・スコープ属性文節の概要を以下にリストします。
データ・スコープ属性文節 説明 private private 文節は、リスト内の変数がチーム内のそれぞれのスレッドに対して private であることを宣言します。 firstprivate firstprivate 文節は、private 文節によって提供される機能のスーパーセットを提供します。 lastprivate lastprivate 文節は、private 文節によって提供される機能のスーパーセットを提供します。 shared shared 文節は、チーム内のすべてのスレッド間でリストに表示される変数を共用します。チーム内のすべてのスレッドが、共用変数用の同じストレージ域にアクセスします。 reduction reduction 文節は、指定された演算子を使用して、リスト内に表示されたスカラー変数の縮小を実行します。 default default 文節は、変数のデータ・スコープ属性をユーザーが操作できるようにします。
詳しくは、OpenMP ディレクティブの説明、または OpenMP C および C++ アプリケーション・プログラム・インターフェースの仕様を参照してください。
並列処理を制御するプラグマ
並列処理のための OpenMP ランタイム・オプション
並列処理に使用する組み込み関数
OpenMP 仕様の完全な情報については、以下を参照してください。