Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

5.2.1 OpenMP 4.0 でのスレッドアフィニティーの制御

このセクションでは、OpenMP 4.0 仕様の OpenMP スレッドアフィニティーの制御に関するセクション 2.5.2 について詳しく説明します。

スレッドが proc_bind 節を含む並列構文を検出すると、OMP_PROC_BIND 環境変数を使用して、スレッドを場所にバインディングするためのポリシーが決定されます。並列構文に proc_bind 節が含まれている場合は、その proc_bind 節で指定されたバインディングポリシーによって、OMP_PROC_BIND で指定されたポリシーがオーバーライドされます。チーム内のスレッドが場所に割り当てられると、実装時にそれが別の場所に移動されることはありません。

マスタースレッドアフィニティーポリシーは、チーム内のすべてのスレッドをマスタースレッドと同じ場所に割り当てるよう実行環境に指示します。このポリシーで場所パーティションは変更されないため、それぞれの暗黙的タスクは、親の暗黙的タスクの place-partition-var 内部制御変数 (ICV) を継承します。

クローズスレッドアフィニティーポリシーは、チーム内のスレッドを親スレッドの場所に近い場所に割り当てるよう実行環境に指示します。このポリシーで場所パーティションは変更されないため、それぞれの暗黙的タスクは、親の暗黙的タスクの place-partition-var ICV を継承します。T がチーム内のスレッド数で、P が親の場所パーティション内の場所の数である場合、チーム内のスレッドの場所への割り当ては次のようになります。

  • T <= P。マスタースレッドは親スレッド (つまり、並列構文を検出したスレッド) の場所で実行されます。次にもっとも小さいスレッド番号を持つスレッドが場所パーティション内の次の場所で実行され (以下同様に続く)、マスタースレッドの場所パーティションからラップアラウンドします。

  • T > P。それぞれの場所 P には連続するスレッド番号を持つ Sp のスレッドが入ります。ここでは、floor(T/P) <= Sp <= ceiling(T/P) です。最初の S0 スレッド (マスタースレッドを含む) は親スレッドの場所に割り当てられます。次の S1 スレッドは場所パーティション内の次の場所に割り当てられ (以下同様に続く)、マスタースレッドの場所パーティションからラップアラウンドします。T が P によって均等に分けられない場合、特定の場所に含まれるスレッドの正確な数は実装によって定義されます。

分散スレッドアフィニティーポリシーの目的は、T 個のスレッドから成るチームを親の場所パーティションの P 個の場所に配分するための疎配分を作成することです。疎配分を求めるには、最初に親パーティションを T 個のサブパーティション (T <= P の場合) または P 個のサブパーティション (T > P の場合) にさらに分けます。次に、1 つのスレッド (T <= P) または 1 組のスレッド (T > P) が各サブパーティションに割り当てられます。それぞれの暗黙的タスクの place-partition-var ICV がそのサブパーティションに設定されます。サブパーティション分割は、疎配分を求めるためのメカニズムであるだけでなく、入れ子並列領域の作成時に使用するスレッドの一部の場所も定義します。スレッドの場所への割り当ては次のとおりです。

  • T <= P。親スレッドの場所パーティションは T 個のサブパーティションに分けられ、各サブパーティションには floor(P/T) または ceiling(P/T) の連続する場所が含まれます。各サブパーティションには 1 つのスレッドが割り当てられます。マスタースレッドは、親スレッドの場所で実行され、その場所を含むサブパーティションに割り当てられます。次にもっとも小さいスレッド番号を持つスレッドが次のサブパーティション内の最初の場所に割り当てられ (以下同様に続く)、マスタースレッドの元の場所パーティションからラップアラウンドします。

  • T > P。親スレッドの場所パーティションは P 個のサブパーティションに分けられ、それぞれが 1 つの場所から成ります。各サブパーティションには連続するスレッド番号を持つ Sp のスレッドが割り当てられます。ここでは、floor(T/P) <= Sp <= ceiling(T/P) です。最初の S0 スレッド (マスタースレッドを含む) は親スレッドの場所を含むサブパーティションに割り当てられます。次の S1 スレッドは次のサブパーティションに割り当てられ (以下同様に続く)、マスタースレッドの元の場所パーティションからラップアラウンドします。T が P によって均等に分けられない場合、特定のサブパーティションに含まれるスレッドの正確な数は実装によって定義されます。


注 -  ラップアラウンドが必要になるのは、すべてのスレッド割り当てが行われる前に、場所パーティションの終わりに達した場合です。たとえば、クローズおよび T <= P の場合、マスタースレッドが場所パーティション内の最初の場所以外の場所に割り当てられる場合にラップアラウンドが必要になる可能性があります。この場合、スレッド 1 はマスタースレッドの場所のあとの場所に割り当てられ、スレッド 2 はそのあとの場所に割り当てられ、以下同様となります。すべてのスレッドが割り当てられる前に場所パーティションの終わりに達する可能性があります。その場合、スレッドの割り当ては場所パーティション内の最初の場所から再開されます。