サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

OpenMPIのコンパイル

本項ではOpenMPIの依存関係を含めてビルドを行う方法を

OpenMPIの依存関係のグラフ

図は 4.8. Required support libraries — Open MPI main documentation から引用。下の方、つまり依存関係が少ないライブラリからビルドする。

Makefile

事前設定

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にするためのビルドについてはこちら

参考