インテル® C++ コンパイラー 16.0 ユーザー・リファレンス・ガイド

omp teams

スレッドチームを複数作成し、各チームのマスタースレッドの構造化ブロックを実行します。

構文

#pragma omp teams [clause, clause, ...]

structured-block

引数

clause

省略するか、次の節を 1 つ以上指定できます。

default(shared | none)

firstprivate(list)

private 節で指定される機能のスーパーセットを指定します。各プライベート・データ・オブジェクトはオリジナルのオブジェクトの値を使用して初期化されます。

num_teams(integer expression)

thread_limit(integer expression)

private(list)

チーム内の各スレッドに対して変数を private にすることを宣言します。

reduction(operator:list)

スカラー変数の削減を実行します。

shared(list)

チーム内のすべてのスレッド間で list の変数を共有します。

説明

この宣言子に到達したスレッドは、各チームのマスタースレッドの構造化ブロックを実行するスレッドチームを構築します。num_teams ( integer expression ) 節は構築するスレッドチーム数を指定し、thread_limit ( integer expression ) 節は各チームで開始するグループの最大スレッド数を指定します。integer expression は正の整数値でなければなりません。このプラグマで thread_limit 節は 1 つのみ使用できます。num_teams を指定しない場合、デフォルトは 1 です。

各チームには、一意のチーム番号 (0 ~ チーム数 - 1 の範囲) が割り当てられます。この番号は、OpenMP* ライブラリー・ルーチン omp_get_team_num() を呼び出すことで取得できます。

チーム内の各スレッドには、一意のスレッド ID が割り当てられます。この ID は、omp_get_thread_num() によって返されます。どのスレッドチームでも、スレッド ID は 0 ~ スレッド数 -1 の範囲で、マスタースレッドが 0 になります。

このプラグマの直後は、各チームのマスタースレッドのみが実行し、ほかのチームメンバーは次の (入れ子構造の) 並列領域からのみ実行を開始します。そのため、実行中のスレッド数は num_teams のみで、それぞれのスレッドは omp_get_thread_num() == 0 になります。

チーム数は、このプラグマの範囲では一定です。

構造化ブロックは、プラグマの範囲を超えることはできません。また、プラグマ内の節の順序に依存しません。

構造化ブロックには、次の構造を含めることができます。

2 つの最外ループを並列化して 2 つの正方行列を乗算する例

#include <omp.h>

void matmul (float *a, float const *b, float const * c, int N) {
 	#pragma omp teams {
    int i;

				#pragma omp distribute
    for (i=0; i<N; i++) {
      int j;

						#pragma omp parallel for
      for (j=0; j<N; j++) {
        int k;
        for (k=0; k<N; k++) {
          a[i*N+k] = a[i*N+k] + b[i*N+j] * c[j*N+k];
        }
      }
    }
  }
}