JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: OpenMP API ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  OpenMP API について

2.  OpenMP プログラムのコンパイルと実行

2.1 コンパイラオプション

2.2 OpenMP 環境変数

2.2.1 OpenMP 環境変数のデフォルト

2.2.2 Oracle Solaris Studio の環境変数

2.2.2.1 PARALLEL

2.2.2.2 SUNW_MP_WARN

2.2.2.3 SUNW_MP_THR_IDLE

2.2.2.4 SUNW_MP_PROCBIND

2.2.2.5 SUNW_MP_MAX_POOL_THREADS

2.2.2.6 SUNW_MP_MAX_NESTED_LEVELS

2.2.2.7 STACKSIZE

2.2.2.8 SUNW_MP_GUIDED_WEIGHT

2.2.2.9 SUNW_MP_WAIT_POLICY

2.3 プロセッサ結合

2.3.1 仮想および論理プロセッサ ID

2.3.2 SUNW_MP_PROCBIND に指定された値の解釈

2.3.3 OS プロセッサセットとの相互作用

2.4 スタックとスタックサイズ

2.5 OpenMP プログラムの確認と分析

3.  実装によって定義される動作

4.  入れ子並列処理

5.  タスク化

6.  変数の自動スコープ宣言

7.  スコープチェック

8.  パフォーマンス上の検討事項

A.  指令での節の記述

索引

2.3 プロセッサ結合

プロセッサ結合では、プログラマはプログラムの実行を通じてプログラム内のスレッドを同じプロセッサで実行すべきであることを、オペレーティングシステムに指示します。

static スケジュール指定ととともにプロセッサ結合を使用すると、並列領域またはワークシェアリング領域の前回呼び出し以降、その領域内のスレッドがアクセスするデータがローカルキャッシュに存在する、特定のデータ再利用パターンを持つアプリケーションにメリットがあります。

ハードウェアから見ると、コンピュータシステムは 1 つまたは複数の「物理」プロセッサから構成されています。オペレーティングシステムから見ると、これらの「物理」プロセッサはそれぞれ、プログラム内のスレッドを実行可能な 1 つまたは複数の「仮想」プロセッサにマッピングされます。n 個の仮想プロセッサを使用する場合、n 個のスレッドを同時に実行するようスケジューリングできます。システムによっては、仮想プロセッサは実際のプロセッサ、コア、ハードウェアスレッドなどの場合もあります。

たとえば、SPARC T3 物理プロセッサには 8 つのコアがあり、各コアは処理スレッドを 8 つ同時に実行できます。Oracle Solaris システムから見ると、スレッドを実行するようスケジューリングできる 64 個の仮想プロセッサが存在します。Oracle Solaris プラットフォームでは、psrinfo(1M) コマンドを使用して仮想プロセッサの数を特定できます。Linux システムでは、テキストファイル /proc/cpuinfo に利用可能なプロセッサの情報が記述されています。

オペレーティングシステムがスレッドをプロセッサに結合すると、スレッドは実質的に「物理」プロセッサではなく、特定の「仮想」プロセッサに結合されます。

OpenMP プログラム内のスレッドを結合するには、SUNW_MP_PROCBIND 環境変数を設定します。SUNW_MP_PROCBIND には、次のいずれかの値を指定できます。

前述の非負整数は論理識別子 (ID) を表しています。論理 ID は「仮想」プロセッサ ID とは異なります。その違いについては次の節で説明します。

2.3.1 仮想および論理プロセッサ ID

システム内の各仮想プロセッサは一意のプロセッサ ID を持ちます。Oracle Solaris の 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 のようになります。

一方、論理プロセッサ ID は、0 から始まる連続した整数です。システムで利用可能な仮想プロセッサの数が n の場合、論理 ID は、0、1、…、n-1 のように psrinfo(1M) に示された順番になります。

SUNW_MP_PROCBIND によって許可される値の解釈については、「2.3.2 SUNW_MP_PROCBIND に指定された値の解釈」を参照してください。

2.3.2 SUNW_MP_PROCBIND に指定された値の解釈

SUNW_MP_PROCBIND に指定された値が FALSE の場合、スレッドはどのプロセッサにも結合されません。これはデフォルト設定です。

SUNW_MP_PROCBIND に指定された値が TRUE の場合、スレッドは、ラウンドロビン方式で仮想プロセッサに結合されます。結合を行う際の最初のプロセッサは、最適なパフォーマンスを実現するために、実行時ライブラリによって決定されます。

SUNW_MP_PROCBIND に指定された値が COMPACT の場合、スレッドは、システム上でできるだけ近くまとまっている仮想プロセッサに結合されます。COMPACT では、スレッドがデータキャッシュを共有できるため、データのローカル性が向上します。

SUNW_MP_PROCBIND に指定された値が SCATTER の場合、スレッドは、遠く離れた仮想プロセッサに結合されます。これにより、各スレッドのメモリー帯域幅を高めることができます。SCATTERCOMPACT の逆の働きをします。

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 プログラムのスレッドの数が多い場合、一部の仮想プロセッサには複数のスレッドが結合されます。これはパフォーマンスに悪影響を与えることがあります。

2.3.3 OS プロセッサセットとの相互作用

Oracle Solaris プラットフォーム上では psrset ユーティリティーを、Linux プラットフォーム上では taskset コマンドを使うと、プロセッサセットを指定できます。SUNW_MP_PROCBIND ではプロセッサセットは考慮されません。プロセッサセットを使用する場合、SUNW_MP_PROCBIND の設定と、使用しているプロセッサセットとの整合性の確認は、ユーザーの責任で行なってください。整合していない場合、Linux システム上では SUNW_MP_PROCBIND の設定がプロセッサセットの設定より優先され、Oracle Solaris システム上ではエラーメッセージが表示されます。