OpenMP アプリケーション・プログラム・インターフェース (API) は、移植可能で拡張が容易な プログラミング・モデルであり、マルチプラットフォームでメモリーを共用する並列アプリケーションを C、C++、および Fortran で開発するための標準インターフェースを提供します。 OpenMP API の仕様は、OpenMP 組織という、IBM を含む主なコンピューター・ハードウェアおよび ソフトウェア・ベンダーの集まりによって定義されます。
XL C/C++ は、OpenMP 仕様 2.0 に準拠しています。 コンパイラーは、以下の OpenMP V2.0 エレメントのセマンティクスを認識し、保持します。
以下に説明するディレクティブ、ライブラリー関数、 および環境変数を使用すると、移植性を維持しながら 並列プログラムを作成し管理できます。
OpenMP 並列処理を使用できるようにするには、-qsmp コンパイラー・オプションを指定してください。
関連参照
それぞれのディレクティブは #pragma omp で始まり、
他のプラグマ・ディレクティブとの潜在的な競合を削減します。
XL C/C++ での OpenMP ディレクティブ | |
ディレクティブ名 | ディレクティブ説明 |
---|---|
parallel | parallel ディレクティブは、並列領域 を定義します。 これはマルチスレッドによって並列して実行されるプログラムの領域です。 |
for | for ディレクティブは、 反復作業共用構成を識別します。これは、関連するループの反復が並列して実行される必要のある領域を 指定します。 for ループの反復は既存のスレッド間で分散されます。 |
sections | sections ディレクティブは反復しない 作業共用構成を識別します。これはチーム内のスレッド間で分割される構成のセットを 指定します。 それぞれのセクションはチーム内のスレッドで 1 度実行されます。 |
single | single ディレクティブは構成を識別します。 これは関連する構造化ブロックがチーム内のただ 1 つのスレッドでのみ実行されることを指定します (マスター・スレッドである必要はありません)。 |
parallel for | parallel for ディレクティブは、 単一 for ディレクティブを含む並列領域用のショートカット形式です。 セマンティクスは、for ディレクティブのすぐ前に parallel ディレクティブを明示的に指定することと同じです。 |
parallel sections | parallel sections ディレクティブは、 単一 sections ディレクティブを含んでいる並列セクションを指定するためのショートカット形式を 提供します。セマンティクスは、sections ディレクティブのすぐ前に parallel ディレクティブを明示的に指定することと同じです。 |
master | master ディレクティブは、 チームのマスター・スレッドによって実行される構造化ブロックを指定する構成を識別します。 |
critical | critical ディレクティブは、関連した構造化ブロックの実行を行えるのは 一時点では 1 つのスレッドのみに限定する構成を識別します。 クリティカル領域を識別するために、オプションの名前 を使用することもできます。 スレッドは、同じ名前で他のスレッドがクリティカル領域を 実行しなくなるまで、クリティカル領域の開始で待ちます。 すべての名前なし critical ディレクティブは、 同じ未指定の名前にマップします。 |
barrier | barrier ディレクティブは、チーム内の すべてのスレッドを同期化します。 スレッドがこのディレクティブに遭遇すると、それぞれのスレッドは他のスレッドが このポイントに達するまで待ちます。 すべてのスレッドがバリアに遭遇したら、 各スレッドは barrier ディレクティブ後でステートメントの実行を並列に開始します。 |
atomic | atomic ディレクティブは、自動的に更新されなければならず、 複数の同時書き込みスレッドに公開されない特定のメモリー・ロケーションを識別します。 |
flush | flush ディレクティブは、コンパイラーによって並列領域のすべてのスレッドが メモリー内の指定されたオブジェクトの同じビューを持つようにする ポイントを識別します。 |
ordered | ordered ディレクティブは、 順序付けられた順で実行しなければならない構造化されたブロックのコードを識別します。 |
threadprivate | threadprivate ディレクティブは、スレッドに private になるファイル・スコープ、 名前スペース・スコープ、または静的ブロック・スコープ変数を宣言します。 |
文節は、並列または作業共用構成の間に変数のスコープ属性を 制御するために、ディレクティブで指定できます。
XL C/C++ での OpenMP データ・スコープ属性文節 | |
データ・スコープ属性文節名 | データ・スコープ属性文節記述 |
---|---|
private | private 文節は、リスト内の変数がチーム内のそれぞれのスレッドに対して private で あることを宣言します。 |
firstprivate | firstprivate 文節は、 private 文節によって提供される機能のスーパーセットを提供します。 |
lastprivate | lastprivate 文節は、 private 文節によって提供される機能のスーパーセットを提供します。 |
copyprivate | copyprivate 文節は、チームに値をブロードキャストする共用変数を使用する代替手段を提供します。 このメカニズムでは、private 変数を使用して、あるチーム・メンバーから他のメンバーに値を ブロードキャストします。 |
num_threads | num_threads 文節は、並列構成でスレッドの特定の数を要求する機能を提供します。 |
shared | shared 文節は、チーム内のすべてのスレッド間でリストに 表示される変数を共用します。 チーム内のすべてのスレッドは、shared 変数用に同じストレージ域を使用できます。 |
reduction | reduction 文節は、 指定された演算子で、リスト内に表示されたスカラー変数の縮小を実行します。 |
default | default 文節は、変数の データ・スコープ属性をユーザーが操作できるようにします。 |
OpenMP ランタイム・ライブラリー関数は、ヘッダー<omp.h> に組み込まれます。これらは、
並列実行環境を制御および照会するために使用できる実行環境関数、
およびデータへのアクセスを同期化するために使用できるロック機能 を含んでいます。
XL C/C++ での OpenMP ランタイム・ライブラリー関数 | |
ランタイム・ライブラリー関数名 | ランタイム・ライブラリー関数の説明 |
---|---|
omp_set_num_threads | これに続く並列領域で使用するために、スレッド数を設定します。 |
omp_get_num_threads | 呼び出される並列領域を実行しているチーム内で現在実行しているスレッド数を戻します。 |
omp_get_max_threads | omp_get_num_threads への呼び出しによって戻すことができる最大値を戻します。 |
omp_get_thread_num | チーム内の関数を実行しているスレッドのスレッド番号を戻します。 チームのマスター・スレッドはスレッド 0 です。 |
omp_get_num_procs | プログラムに割り当てることのできるプロセッサーの最大数を戻します。 |
omp_in_parallel | 並列で実行している並列領域の動的エクステント内で呼び出された場合に、ゼロ以外を戻します。 それ以外の場合は 0 を戻します。 |
omp_set_dynamic | 並列領域の実行で使用可能なスレッド数の動的調整を使用可能または使用不可にします。 |
omp_get_dynamic | 動的スレッド調整が使用可能な場合にゼロ以外を戻し、 それ以外の場合は 0 を戻します。 |
omp_set_nested | ネストされた並列性を使用可能または使用不可にします。 |
omp_get_nested | ネストされた並列性が使用可能な場合にゼロ以外を戻し、 使用不可の場合に 0 を戻します。 |
omp_init_lock | 単純ロックを初期設定します。 |
omp_destroy_lock | 単純ロックを除去します。 |
omp_set_lock | 単純ロックが使用可能になるのを待ちます。 |
omp_unset_lock | 単純ロックをリリースします。 |
omp_test_lock | 単純ロックをテストします。 |
omp_init_nest_lock | ネストできるロックを初期設定します。 |
omp_destroy_nest_lock | ネストできるロックを除去します。 |
omp_set_nest_lock | ネストできるロックが使用可能になるのを待ちます。 |
omp_unset_nest_lock | ネストできるロックをリリースします。 |
omp_test_nest_lock | ネストできるロックをテストします。 |
omp_get_wtick | 連続する時計の 1 刻み間の秒数を戻します。 |
omp_get_wtime | 経過した時刻を秒単位で戻します。 |
OpenMP 環境変数は並列コードの実行を制御します。環境変数の名前は、
常に大文字でなければなりませんが、
それらの値は大/小文字の区別はありません。
XL C/C++ での OpenMP 環境変数 | |
説明 | 構文 |
---|---|
OMP_SCHEDULE
ランタイム・スケジュール・タイプとチャンク・サイズを設定します。 runtime にスケジューリング・タイプ・セットを持つ OpenMP ディレクティブにのみ適用します。 |
.-static--+------+-------. | '-,--n-' | >>-OMP_SCHEDULE=-+-+-affinity-+--+------+-+-------------------->< | +-dynamic--+ '-,--n-' | | '-guided---' | '-runtime----------------'
ここで、
|
OMP_DYNAMIC
並列領域の実行で使用可能なスレッド数の動的調整を使用可能または使用不可にします。 |
.-true--. >>-OMP_DYNAMIC=-+-false-+--------------------------------------><
ここで、
|
OMP_NUM_THREADS
実行可能なスレッド数のセット。 |
>>-OMP_NUM_THREADS=n-------------------------------------------><
ここで、
|
OMP_NESTED
ネストされた並列性を使用可能または使用不可にします。 |
.-true--. >>-OMP_NESTED=-+-false-+---------------------------------------><
ここで、
|
以下の情報は標準では指定されていません。標準のそれぞれのインプリメンテーションは、 独自のインプリメンテーション定義値があります。