プロセッサ結合では、プログラマはプログラムの実行を通じてプログラム内のスレッドを同じプロセッサで実行すべきであることを、オペレーティングシステムに指示します。
static スケジュール指定ととともにプロセッサ結合を使用すると、並列領域またはワークシェアリング領域の前回呼び出し以降、その領域内のスレッドがアクセスするデータがローカルキャッシュに存在する、特定のデータ再利用パターンを持つアプリケーションにメリットがあります。
ハードウェアから見ると、コンピュータシステムは 1 つまたは複数の「物理」プロセッサから構成されています。オペレーティングシステムから見ると、これらの「物理」プロセッサはそれぞれ、プログラム内のスレッドを実行可能な 1 つまたは複数の「仮想」プロセッサにマッピングされます。n 個の仮想プロセッサを使用する場合、n 個のスレッドを同時に実行するようスケジューリングできます。システムによっては、仮想プロセッサは実際のプロセッサやコアなどの場合もあります。
たとえば、UltraSPARC T2 物理プロセッサには 8 つのコアがあり、各コアはスレッドを 8 つ同時に処理できます。Solaris OS から見ると、スレッドの実行をスケジューリング可能な仮想プロセッサは 64 個あります。Solaris プラットフォームでは、psrinfo(1M) コマンドを使用して仮想プロセッサの数を特定できます。Linux システムでは、ファイル /proc/cpuinfo に利用可能なプロセッサの情報が記述されています。
オペレーティングシステムがスレッドをプロセッサに結合すると、スレッドは実質的に「物理」プロセッサではなく、特定の「仮想」プロセッサに結合されます。
OpenMP プログラム内のスレッドを特定の仮想プロセッサに結合するには、SUNW_MP_PROCBIND 環境変数を設定します。SUNW_MP_PROCBIND には、次のいずれかの値を指定できます。
文字列「TRUE」または「FALSE」 (小文字の「true」または「false」も可)。 たとえば、次を見てください。 % setenv SUNW_MP_PROCBIND "false"
非負整数。 次に例を示します。% setenv SUNW_MP_PROCBIND "2"
1 つ以上の空白で区切った 2 つ以上の非負整数のリスト。 次に例を示します。% setenv SUNW_MP_PROCBIND "0 2 4 6"
ハイフン 1 つ ("-") で区切った 2 つの非負整数 n1 と n2。n1 は n2 以下である必要があります。 次に例を示します。% setenv SUNW_MP_PROCBIND "0-6"
SUNW_MP_PROCBIND によって許可される値の解釈については、「2.3.3 SUNW_MP_PROCBIND に指定された値の解釈」を参照してください。
前述の非負整数は論理識別子 (ID) を表しています。論理 ID は「仮想」プロセッサ ID とは異なります。その違いを次に示します。
システム内の各仮想プロセッサは一意のプロセッサ ID を持ちます。Solaris OS の psrinfo(1M) コマンドを使用すると、システム内のプロセッサに関するプロセッサ ID などの情報を表示できます。さらに、prtdiag(1M) コマンドを使用すると、システム構成および診断情報を表示できます。
Solaris の最近のリリースでは psrinfo -pv を使用すると、システム内のすべての物理プロセッサ、および各物理プロセッサに関連付けられた仮想プロセッサを一覧表示できます。
仮想プロセッサ ID は、連番になることも、ID 番号が飛ぶこともあります。たとえば、8 個の UltraSPARC IV プロセッサ (16 コア) を持つ Sun Fire 4810 では、仮想プロセッサ ID が 0、1、2、3、8、9、10、11、512、513、514、515、520、521、522、523 のようになります。
前述のとおり、SUNW_MP_PROCBIND に指定された非負整数は論理 ID です。論理 ID は、0 から始まる連続した整数です。システムで利用可能な仮想プロセッサの数が n の場合、論理 ID は、0、1、…、n-1 のように psrinfo(1M) に示された順番になります。次の Korn シェルスクリプトを使用すると、仮想プロセッサ ID から論理 ID へのマッピングを表示できます。
#!/bin/ksh NUMV= `psrinfo | fgrep "on-line" | wc -l ` set -A VID `psrinfo | cut -f1 ` echo "Total number of on-line virtual processors = $NUMV" echo let "I=0" let "J=0" while [[ $I -lt $NUMV ]] do echo "Virtual processor ID ${VID[I]} maps to logical ID ${J}" let "I=I+1" let "J=J+1" done
1 つの物理プロセッサが複数の仮想プロセッサにマッピングされているシステムでは、同じ物理プロセッサに属す仮想プロセッサにどの論理 ID が対応しているかを知っておくと便利です。次の Korn シェルスクリプトを最近のリリースの Solaris で使用すると、この情報が表示されます。
#!/bin/ksh NUMV= `psrinfo | grep "on-line" | wc -l ` set -A VLIST `psrinfo | cut -f1 ` set -A CHECKLIST `psrinfo | cut -f1 ` let "I=0" while [ $I -lt $NUMV ] do let "COUNT=0" SAMELIST="$I" let "J=I+1" while [ $J -lt $NUMV ] do if [ ${CHECKLIST[J]} -ne -1 ] then if [ `psrinfo -p ${VLIST[I]} ${VLIST[J]} ` = 1 ] then SAMELIST="$SAMELIST $J" let "CHECKLIST[J]=-1" let "COUNT=COUNT+1" fi fi let "J=J+1" done if [ $COUNT -gt 0 ] then echo "The following logical IDs belong to the same physical processor:" echo "$SAMELIST" echo " " fi let "I=I+1" done
SUNW_MP_PROCBIND に指定された値が TRUE の場合、スレッドは、ラウンドロビン方式で仮想プロセッサに結合されます。結合を行う際の最初のプロセッサは、最適なパフォーマンスを実現するために、実行時ライブラリによって決定されます。
SUNW_MP_PROCBIND に指定された値が FALSE の場合、スレッドはどのプロセッサにも結合されません。これはデフォルト設定です。
SUNW_MP_PROCBIND に指定された値が非負整数の場合、その整数はスレッドの結合先の仮想プロセッサの開始論理 ID を表します。スレッドは、指定された論理 ID を持つプロセッサから順にラウンドロビン方式で仮想プロセッサに結合されます。論理 ID が n-1 のプロセッサに結合した後は、論理 ID が 0 のプロセッサに続きます。
SUNW_MP_PROCBIND に指定された値が非負の整数の 2 項目以上のリストの場合、スレッドはラウンドロビン方式で指定された論理 ID を持つ仮想プロセッサに結合されます。指定された以外の論理 ID を持つプロセッサは使用されません。
SUNW_MP_PROCBIND に指定された値が、マイナス記号 (-) で区切られた 2 つの非負整数の場合、スレッドは最初の論理 ID から 2 番目の論理 ID の範囲の仮想プロセッサに、ラウンドロビン式で結合されます。この範囲に含まれない論理 ID を持つプロセッサは使用されません。
SUNW_MP_PROCBIND に指定された値が前述のどの形式にも当てはまらないか、不正な論理 ID が指定された場合は、エラーメッセージが出力され、プログラムの実行が終了します。
OpenMP 実行時ライブラリ libmtsk で作成されるスレッドの数は、環境変数、ユーザーのプログラム内の API 呼び出し、および num_threads 節によって異なります。SUNW_MP_PROCBIND は、スレッドの結合先となる仮想プロセッサの論理 ID を指定します。スレッドは、その一連のプロセッサにラウンドロビン式で結合されます。プログラム内で使用しているスレッドの数が、SUNW_MP_PROCBIND で指定された論理 ID の数よりも少ない場合、一部の仮想プロセッサはそのプログラム内で使用されません。SUNW_MP_PROCBIND で指定された論理 ID の数よりもスレッドの数が多い場合、一部の仮想プロセッサには複数のスレッドが結合されます。
Solaris プラットフォーム上では psrset ユーティリティーを、Linux プラットフォーム上では taskset コマンドを使うと、プロセッサセットを指定できます。SUNW_MP_PROCBIND ではプロセッサセットは考慮されません。プログラマがプロセッサセットを使用する場合、SUNW_MP_PROCBIND の設定と、使用しているプロセッサセットとの整合性の確認は、プログラマの責任で行ってください。この確認を怠ると、Linux システム上では SUNW_MP_PROCBIND の設定がプロセッサセットの設定に上書きされ、Solaris システム上ではエラーメッセージが表示されます。