OpenMPIのコンパイル
本項ではOpenMPIの依存関係を含めてビルドを行う方法を
OpenMPIの依存関係のグラフ

図は 4.8. Required support libraries — Open MPI main documentation から引用。下の方、つまり依存関係が少ないライブラリからビルドする。
Makefile
- 後述するビルドをまとめたMakefile: Makefile · GitHub
- さらにStampを用いてビルド済みのコンポーネントを再ビルドするのを防ぐMakefile: Makefile · GitHub
事前設定
export OMPI_PATH=/XXX/ompi # cloneしたompiディレクトリのパス export PREFIX=/YYY # どこか
依存関係のビルド
libevent
高性能な非同期イベント駆動型プログラムを構築するためのCライブラリ。主にネットワークプログラミングや非同期I/Oに関連するタスクで使用される。
cd $OMPI_PATH/3rd-party/libevent-2.1.12-stable-ompi ./configure --prefix=$PREFIX && make -j && make install
hwloc
hwloc(Hardware Locality)は、システムのハードウェアトポロジーを管理および可視化するためのライブラリ
cd $OMPI_PATH/3rd-party/hwloc-2.7.1 ./configure --prefix=$PREFIX && make -j && make install
OpenPMIX
並列計算(特に高性能コンピューティング:HPC)環境におけるプロセス管理と情報共有のためのフレームワーク
▶︎詳細
- プロセス管理の標準化: 並列アプリケーションのプロセス起動、終了、同期などを効率的に管理
- ランタイム環境間の相互運用性: OpenMPI、SLURM、PBSなど異なるHPCランタイム環境の連携を実現
- プロセス間情報共有: プロセスやリソースの状態、メタデータを効率的に交換
- リソース管理との統合: リソースマネージャと連携し、ジョブのスケジューリングやリソース割り当てを管理
- 非同期通信のサポート: 動的なプロセス間通信やデータ共有を効率化
- ジョブレジリエンスの提供: 障害発生時のジョブ維持や動的再構成をサポート
- データの公開と検索: プロセス間でデータを公開・取得できる機能を提供
- ジョブの同期とバリア操作: 並列プロセス間の同期を簡潔に実現
cd $OMPI_PATH/3rd-party/openpmix/ ./autogen.pl ./configure \ --prefix=$PREFIX \ --with-libevent=$PREFIX \ --with-hwloc=$PREFIX make -j && make install
PRRTE
Open MPIの実行時環境を管理するためのソフトウェア。
▶︎詳細
PRRTEは以下の機能を提供
- プロセスの起動と管理:リモートプロセスの起動、監視、終了、および収集を担当
- リソースの発見と割り当て:利用可能な計算リソースを検出し、適切に割り当てる
- 入出力のリダイレクト:リモートプロセスの標準出力やエラー出力を適切に処理
Open MPIのバージョン5.0.x以降では、PRRTEがデフォルトの実行時環境管理システムとして採用。これは、以前のORTEからの進化であり、PRRTEは独立したプロジェクトとして、ネイティブな実行時環境(例えばSlurm, PBS/Torque, LSF)を持たない環境に対して、実行時環境のインフラストラクチャを提供。
PRRTEは、その名の通りPMIxのリファレンス実装として開発。PMIxは、さまざまな実行時環境との通信を統一的なAPIで提供し、Open MPIが特定の実行時環境の詳細を意識せずに動作できるようにする。PRRTEは、特にスケジューラが存在しない環境や、リモートプロセスの管理機能が不足している環境で、これらの機能を補完。
MPI (Message Passing Interface) PRRTE(PMIx Reference RunTime Environment) PMIx(Process Management Interface for Exascale) ORTE(Open Run-Time Environment)
cd $OMPI_PATH/3rd-party/prrte/ ./autogen.pl ./configure \ --prefix=$PREFIX \ --with-libevent=$PREFIX \ --with-hwloc=$PREFIX \ --with-pmix=$PREFIX make -j && make install
通信ライブラリのビルド
UCXのビルド
UCX(Unified Communication X)とは、異なる計算リソース間での高性能な通信を実現するためのライブラリ。 特に、データセンタやスパコンにおいて、メッセージパッシングやRDMA(リモートメモリアクセス)を効率的に行うために設計されている。 UCXは、さまざまな通信プロトコル(例えば、InfiniBand、RoCE、TCPなど)をサポートし、アプリケーションがハードウェアの詳細を意識しなくても良いようになっている。
cd ucx ./autogen.sh ./contrib/configure-release --prefix=$PREFIX make -j && make install
- multithreadingをサポートする場合は、--enable-mtをつける
UCCのビルド
UCC(Unified Communication Collection)は、UCXのコレクションであり、UCXの上に構築された通信ライブラリのコレクション。
cd ucc ./autogen.sh ./configure --prefix=$PREFIX --with-ucx=$PREFIX --with-tls=all --enable-debug make -j && make install
SHARP TLを有効化する場合は --with-sharpをつける(e.g. --with-sharp=hpcx-v2.21-gcc-inbox-ubuntu20.04-cuda12-x86_64/sharp)。
- デバッグ実行でない場合は --enable-debug オプションを外す。
OpenMPI のビルド
cd $OMPI_PATH ./autogen.pl ./configure \ --prefix=$PREFIX \ --with-ucx=$PREFIX \ --with-ucc=$PREFIX \ --with-libevent=$PREFIX \ --with-hwloc=$PREFIX \ --with-pmix=$PREFIX \ --with-prrte=$PREFIX \ --enable-debug make -j && make install
- デバッグ実行でない場合は --enable-debug オプションを外す。
そのほか
事後処理
最後にLD_LIBRARY_PATHとPATHを更新すればok
export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH export PATH=$PREFIX/bin:$PATH
関連
CUDA-awareにするためのビルドについてはこちら