付録 B. OpenMP 準拠とサポート

OpenMP アプリケーション・プログラム・インターフェース (API) は、移植可能で拡張が容易な プログラミング・モデルであり、マルチプラットフォームでメモリーを共用する並列アプリケーションを C、C++、および Fortran で開発するための標準インターフェースを提供します。 OpenMP API の仕様は、OpenMP 組織という、IBM を含む主なコンピューター・ハードウェアおよび ソフトウェア・ベンダーの集まりによって定義されます。

XL C/C++ は、OpenMP 仕様 2.0 に準拠しています。 コンパイラーは、以下の OpenMP V2.0 エレメントのセマンティクスを認識し、保持します。

以下に説明するディレクティブ、ライブラリー関数、 および環境変数を使用すると、移植性を維持しながら 並列プログラムを作成し管理できます。

OpenMP 並列処理を使用できるようにするには、-qsmp コンパイラー・オプションを指定してください。

関連参照


OpenMP ディレクティブ

それぞれのディレクティブは #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 になるファイル・スコープ、 名前スペース・スコープ、または静的ブロック・スコープ変数を宣言します。

OpenMP データ・スコープ属性文節

文節は、並列または作業共用構成の間に変数のスコープ属性を 制御するために、ディレクティブで指定できます。


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 ライブラリー関数

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 環境変数

OpenMP 環境変数は並列コードの実行を制御します。環境変数の名前は、 常に大文字でなければなりませんが、 それらの値は大/小文字の区別はありません。

XL C/C++ での OpenMP 環境変数
説明 構文
OMP_SCHEDULE

ランタイム・スケジュール・タイプとチャンク・サイズを設定します。 runtime にスケジューリング・タイプ・セットを持つ OpenMP ディレクティブにのみ適用します。

                 .-static--+------+-------.
                 |         '-,--n-'       |
>>-OMP_SCHEDULE=-+-+-affinity-+--+------+-+--------------------><
                 | +-dynamic--+  '-,--n-' |
                 | '-guided---'           |
                 '-runtime----------------'
 
 

ここで、

親和性
C にのみ有効な IBM 拡張。最初にループの反復がスレッド数によって分割された反復数の上限に等しいサイズのローカル区画に 分割されることを指定します CEILING(number_of_iterations ÷ number_of_threads)。 各ローカル区画はさらにローカル区画に残る反復数の半分の上限に等しいサイズのチャンクに細分されます CEILING(iterations_left_in_local_partition ÷ 2)。スレッドがフリーになると、そのローカル区画から次のチャンクを取ります。 ローカル区画にチャンクがなくなると、スレッドは他のスレッドの区画から使用可能なチャンクを取ります。 n が指定されると、各ローカル区画はサイズ n のチャンクに細分されます。 n が指定されない場合は、デフォルト値は 1 です。

動的
for ループの反復を一連の n サイズのチャンクに分ける必要があり、チャンクは次のプロセスに沿って処理されることを指定します。 割り当てを待つスレッドに反復のチャンクが割り当てられると、スレッド はそのチャンクを実行し、次の割り当てを待ちます。 このプロセスはすべてのチャンクが割り当てられるまで繰り返されます。n が指定されない場合は、 デフォルトのチャンク・サイズは 1 です。

ガイド
for ループの反復がサイズが減少しているチャンクのスレッドに割り当てられる必要があり、 チャンクは次のプロセスに沿って処理されることを指定します。 割り当てられた反復のチャンクを終了するスレッドには、動的に他のチャ ンクが割り当てられます。これは、すべてのチャンクが割り当てられるまで続きます。 n が指定されない場合は、最初のチャンク・サイズのデフォルト値は 1 です。

静的
for ループの反復を一連の n サイズのチャンクに分割する必要があり、チャンクは次のプロセスに沿って処理されることを指定します。 使用可能なスレッドは、スレッド数によって決定された順序でチャンクを割り当てます。 n が指定されない場合、反復スペースは サイズがほぼ等しいチャンクに分割され、1 つのチャンクが各スレッドに割り当てられます。

n
正数で、チャンク・サイズを示します。
OMP_DYNAMIC

並列領域の実行で使用可能なスレッド数の動的調整を使用可能または使用不可にします。

                .-true--.
>>-OMP_DYNAMIC=-+-false-+--------------------------------------><
 
 

ここで、

true
使用可能なスレッド数の動的調整を使用可能にします。

false
使用可能なスレッド数の動的調整を使用不可にします。
OMP_NUM_THREADS

実行可能なスレッド数のセット。

>>-OMP_NUM_THREADS=n-------------------------------------------><
 
 

ここで、

n
スレッド数を示します。
OMP_NESTED

ネストされた並列性を使用可能または使用不可にします。

               .-true--.
>>-OMP_NESTED=-+-false-+---------------------------------------><
 
 

ここで、

true
ネストされた並列性を使用可能にします。

false
ネストされた並列性を使用不可にします。

OpenMP インプリメンテーション定義動作

以下の情報は標準では指定されていません。標準のそれぞれのインプリメンテーションは、 独自のインプリメンテーション定義値があります。

条件付きコンパイル
_OPENMP マクロは 199810 に定義されました。

スケジューリング
schedule 文節は、for ループの反復がどのようにチーム内のスレッド間で分割されるかを指定します。可能な OpenMP 標準値は、staticdynamicguided、 および runtime です。さらに、IBM C は値 affinity を拡張子として追加します。明示的に定義された schedule 文節がない場合は、XL C/C++ のデフォルトのスケジュールは static です。
IBM Copyright 2003