インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
スレッドチームを複数作成し、各チームのマスタースレッドの構造ブロックを実行します。
clause |
省略するか、次の節を 1 つ以上指定できます。
|
この宣言子に到達したスレッドは、各チームのマスタースレッドの構造ブロックを実行するスレッドチームを構築します。 num_teams (integer expression) 節は構築するスレッドチーム数を指定し、num_threads (integer expression) 節は構築する各チーム内の最大スレッド数を指定します。 このプラグマで num_threads 節は 1 つのみ使用できます。 num_teams を指定しない場合、デフォルトは 1 です。num_threads を指定しない場合、デフォルトは利用可能なハードウェア・スレッド数をチーム数で割った数です。
各チームには、一意のチーム番号 (0 ~ チーム数 - 1 の範囲) が割り当てられます。この番号は、OpenMP* ライブラリー・ルーチン omp_get_team_num() を呼び出すことで取得できます。
チーム内の各スレッドには、一意のスレッド ID が割り当てられます。この ID は、omp_get_thread_num() によって返されます。 どのスレッドチームでも、スレッド ID は 0 ~ スレッド数 -1 の範囲で、マスタースレッドが 0 になります。
このプラグマの直後は、各チームのマスタースレッドのみが実行し、ほかのチームメンバーは次の (入れ子構造の) 並列領域からのみ実行を開始します。そのため、実行中のスレッド数は num_teams のみで、それぞれのスレッドは omp_get_thread_num() == 0 になります。
チーム数は、この宣言子の範囲では一定です。
構造ブロックは、プラグマの範囲を超えることはできません。また、プラグマ内の節の順序に依存しません。
distribute
parallel
parallel loop
parallel loop simd
parallel sections
parallel workshare
次の例は、このプラグマを使用し、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];
}
}
}
}
}