この記事は、Dr.Dobb’s Go Parallel に掲載されている「Intel Cluster Studio XE 2012 and Hybrid MPI/OpenMP Applications: Optimize Up To the Node Level」 (http://drdobbs.com/go-parallel/blogs/parallel/232600105) の日本語参考訳です。
インテル® Cluster Studio XE 2012 は、ハイパフォーマンス・クラスター開発者向けに MPI/OpenMP* ハイブリッド開発環境を提供します。このスイートには、OpenMP* との互換性を持つインテル® MPI ライブラリー 4.0 Update 3 が含まれているため、ハイパフォーマンス・クラスターの機能を最大限に活用する MPI/OpenMP* ハイブリッド・アプリケーションを開発し最適化することができます。
インテル® MPI ライブラリーを使って MPI と OpenMP* を統合する場合は、-mt_mpi
コンパイラー・オプションを指定して、インテル® MPI ライブラリーのスレッドセーフなバージョンをリンクする必要があります。インテル® C/C++ コンパイラーの -openmp
オプションまたは -parallel
オプションを指定すると、-mt_mpi
コンパイラー・オプションを指定しなくても、自動的にインテル® MPI ライブラリーのスレッドセーフなバージョンがリンクされます。
スレッドセーフなインテル® MPI ライブラリーを使用する場合は、次の 3 つのレベルを利用できます。
- MPI_THREAD_FUNNELED
- MPI_THREAD_SERIALIZED
- MPI_THREAD_MULTIPLE
I_MPI_PIN_DOMAIN
環境変数にも適切な値を指定する必要があります。この変数は、MPI/Open MP* ハイブリッド・アプリケーションのプロセスピニングのスキームを制御します。ノード上の論理プロセッサーがオーバーラップしないドメインを定義し、それらドメインへ MPI プロセスをバインドするルールを設定することができます。常にドメインごとに 1 つの MPI プロセスがあり、各ドメインは特定の論理プロセッサーで構成されています。各 MPI プロセスは、そのプロセスに割り当てられているドメイン内の論理プロセッサーで実行可能なスレッドを生成することができます。I_MPI_PIN_DOMAIN
環境変数に値を設定すると、I_MPI_PIN_PROCESSOR_LIST
に設定されている値は無視されます。
I_MPI_PIN_DOMAIN
環境変数には、ドメインを定義する次の 3 つの構文があります。
I_MPI_PIN_DOMAIN=
— マルチコア関連のキーワードを使用してドメインを定義します。例えば、I_MPI_PIN_DOMIAN=core
の場合、各ドメインは特定のコアを共有する論理プロセッサーで構成されます。この値を設定すると、ノードのドメイン数はノードのコア数と等しくなります。この他にも、論理プロセッサーで共有されるソケット、ノード、または異なるキャッシュレベルによってドメインを定義できるキーワードがあります。I_MPI_PIN_DOMAIN=[:]
— ドメインのサイズとメンバーレイアウトを指定してドメインを定義します。サイズだけを指定してドメインを定義することもできます。サイズにより、各ドメインの論理プロセッサーの数が決まります。任意の論理プロセッサー数になるようにサイズを指定できますが、 MPI/OpenMP* ハイブリッド・アプリケーションでは通常、ドメインサイズがOMP_NUM_THREADS
環境変数の値と同じになるI_MPI_PIN_DOMAIN=omp
オプションを使用すると便利です。そうすることで、プロセスピニングのドメインサイズがOMP_NUM_THREADS
と等しくなり、各 MPI プロセスが対応するドメインで実行するスレッドをOMP_NUM_THREADS
個生成することができます。OPM_NUM_THREADS
を設定しないと、各ノードは個別のドメインとして処理され、各 MPI プロセスは最大で利用可能なコア数と同じ数のスレッドしか生成することができません。 オプションのレイアウト引数を使用すると、ドメインメンバーの配置を指定できます。デフォルト値は compact です。つまり、I_MPI_PIN_DOMAIN=omp
を指定すると、I_MPI_PIN_DOMAIN=omp:compact
を指定した場合と同じになります。compact は、ドメインメンバーが共通のリソース (コア、キャッシュ、ソケットなど) に応じてできるだけ近い位置に配置されるようにします。そのため、共通のリソースを利用するscatter
は、隣接するドメインによる共通リソースの共有を最小限に抑えるようにドメインメンバーを配置します。最適な値は、利用可能なハードウェアとアプリケーション要求によって異なります。I_MPI_PIN_DOMAIN=]
— ドメインマスク値を使用してドメインを定義します。例えば、16 進数のカンマ区切りのリスト (ドメインマスク) を使用して、各ドメインに含めるプロセッサーを指定したり、BIOS のプロセッサー番号を使用しないように指定できます。
-mt_mpi
コンパイラー・オプションを指定する場合は、I_MPI_PIN_DOMAIN=omp
を指定し、OpenMP* で使用するスレッド数を OMP_NUM_THREADS
に設定すると、ハイパフォーマンス・クラスターを最大限に活用して MPI/OpenMP* ハイブリッド・アプリケーションを実行できます。mpiexec
ジョブ・スタートアップ・コマンドを使用すると、I_MPI_PIN_DOMAIN
と OMP_NUM_THREADS
にそれぞれの値を簡単に設定できます。例えば、mpiexec
オプションの一部として -env I_MPI_PIN_DOMAIN omp
を指定し、I_MPI_PIN_DOMAIN
の値を omp
に設定できます。また、setenv OMP_NUM_THREADS=8
のように指定し、OMP_NUM_THREADS
の値を 8
に設定できます。
このように、OpenMP* を使用して並列にコードを実行し、MPI を使用して高レベルな通信を行うスレッドの生成が可能です。インテル® Cluster Studio XE 2012 に含まれるインテル® Trace Analyzer/Collector、インテル® VTune™ Amplifier XE、インテル® Inspector XE、インテル® MPI Benchmarks などの各種ツールにより、さまざまなオプションでアプリケーションを実行し解析して、コードと設定のチューニングを行うことで、異なるレベルの最適化を達成することができます。
インテル® Cluster Studio XE 2012 は商用製品ですが、こちらから無料体験版をダウンロードすることができます。