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

印刷ビューの終了

更新: 2014 年 12 月
 
 

9.6 プロセッサバインディング (スレッドアフィニティー)

OpenMP 4.0 仕様では、プロセッサという用語は 1 つ以上の OpenMP スレッドを実行できる実装によって定義されたハードウェアユニットとして定義されています。

この実装では、プロセッサという用語は、Oracle Solaris の processor_bind(2) マニュアルページに記述されているように、1 つ以上の OpenMP スレッドをスケジュール、バインド、および実行できる最小のハードウェア実行ユニットとして定義されています。プロセッサの同義語には、CPU、仮想プロセッサ、ハードウェアスレッドがあります。明確にするために、このマニュアルでは、ハードウェアスレッドという用語を一貫して使用しています。

この実装での、OMP_PLACES 環境変数で使用される抽象名 (threadscores、およびsockets) の正確な定義は次のとおりです。

  • threads は、マシン上のハードウェアスレッドを指します。

  • cores は、マシン上の物理コアを指します。

  • sockets は、マシン上の物理ソケット (プロセッサチップ) を指します。

詳細は、OMP_PLACES および OMP_PROC_BINDを参照してください。OpenMP 4.0 のスレッドのアフィニティーに関連する、Oracle Solaris Studio の実装によって定義される動作は次のとおりです。

  • close スレッドバインドポリシーを使用すると、T > P で P によって T が等分に分割されない場合、場所へのスレッドの割り当ては次のようになります。最初に、P の場所にそれぞれ S = floor(T/P) スレッドが割り当てられます。場所に割り当てられるスレッドの ID は、チーム内のスレッド ID の連続したサブセットになります。次に、最初の T - (P*S) の場所 (親スレッドの場所から始まりラップアラウンドする) にそれぞれ追加のスレッドが 1 つ割り当てられます。

  • spread スレッドバインドポリシーを使用すると、T > P で P によって T が等分に分割されない場合、サブパーティションへのスレッドの割り当ては次のようになります。最初に、P のサブパーティションにそれぞれ S = floor(T/P) スレッドが割り当てられます。サブパーティションに割り当てられるスレッドの ID は、チーム内のスレッド ID の連続したサブセットになります。次に、最初の T - (P*S) のサブパーティション (親スレッドの場所が含まれているサブパーティションから始まりラップアラウンドする) にそれぞれ追加のスレッドが 1 つ割り当てられます。

  • アフィニティー要求を処理できない場合、プロセスはゼロ以外のステータスで終了します。

  • OMP_PLACES 環境変数に指定された数値は、ハードウェアスレッド ID を指しています。

  • 抽象名の後ろに数値 n を付加することによって n 要素の場所のリストを作成する場合、場所のリストは場所のリストが作成されるときにメインスレッドが実行されていたハードウェアスレッドが含まれているリソースで始まる N 個の連続したリソースで構成され、使用可能な最後の名前付きリソースに達するとラップアラウンドします。

  • マシンで使用可能なリソースよりも多いリソースが要求された場合は、エラーメッセージが発行され、プロセスがゼロ以外のステータスで終了します。リソースに少なくとも 1 つのオンラインのハードウェアスレッドが含まれている場合は、そのリソースを使用できます。

  • 実行環境で OMP_PLACES リスト内の数値 (明示的に定義されたか、間隔から暗黙的に導出された数値) をターゲットプラットフォーム上のハードウェアスレッドにマップできない場合、または使用できないハードウェアスレッドにマップされる場合は、エラーメッセージが発行され、プロセスがゼロ以外のステータスで終了します。

  • OMP_PLACES 環境変数が抽象名を使用して定義されている場合、抽象名によって表されたリソースの各ユニットは単一の場所として割り当てられます。割り当てられるユニットの数は、マシン上の使用可能なユニットの合計数よりも小さい値のカウント n によって指定できます。Oracle Solaris プラットフォームでは、管理者が psrset(1M) を使用してプリエンプティブに予約したハードウェアスレッドは使用可能と見なされません。OMP_PLACES によって定義されたセットに使用可能なハードウェアスレッドが残っていない場合は、エラーメッセージが発行され、プロセスがゼロ以外のステータスで終了します。

  • parallel 構文のアフィニティー要求を処理できない場合 (OpenMP スレッドをハードウェアスレッドにバインドするシステムコールが失敗した場合など)、結果の動作は未定義です。

  • OMP_PLACES を使用する場合は、間隔を使用して場所を指定できます。この実装では、間隔によって一連の場所を指定する場合、length はそこに含まれる場所の数であり、stride はその連続する場所を区切るハードウェアスレッド ID の数であると想定されます。stride 値が指定されていない場合は、ユニットの刻み幅が想定されます。