OpenMPI v5.0.0をビルドする

## はじめに
メッセージ・パッシング・インターフェース（MPI）の実装の一つである[Open MPI](https://www.open-mpi.org/)の新バージョン5.0.0が2023年10月26日にリリースされました。

> #### [Open MPI Announce\] Open MPI v5.0.0 available
>
> Tomislav Janjusic via announce Thu, 26 Oct 2023 12:54:58 -0700
>
> ```
> Dear Open MPI Users,
> 
> We are thrilled to announce that Open MPI v5.0.0 is now officially available at 
> https://www.open-mpi.org/software/ompi/v5.0/ .
> Please test and send feedback either via the user mailing lists or create an 
> issue at https://github.com/open-mpi/ompi/issues/ .
> 
> We want to express our sincere gratitude to the many individuals whose 
> contributions were instrumental in making this release possible.
> 
> Thank you,
> v5.0 Release Managers
> _______________________________________________
> announce mailing list
> announce@lists.open-mpi.org
> https://lists.open-mpi.org/mailman/listinfo/announce
> ```

cf. https://www.mail-archive.com/announce@lists.open-mpi.org/msg00162.html

本稿では、このOpen MPIバージョン5.0.0をソースコードからビルドし、実行バイナリをインストールするまでの一連の手順について説明します。

例としてGentoo Linuxでのインストール方法を記述しますが、他のディストリビューションでも同様にして（手動で）インストールすることができると思います。

### 環境

- Gentoo Linux（kernel 6.1.57）
- Portage 3.0.51
- GCC 12.3.1

## ビルド

### 準備

cf. [Open MPI Documentation -- 4.7. Required support libraries](https://docs.open-mpi.org/en/v5.0.x/installing-open-mpi/required-support-libraries.html)

以下の依存関係パッケージをインストールします。

- Libevent 2.0.22
- hwloc 2.9.1
- [PMIx](https://pmix.github.io/) 4.2.7
- [PRRTE](https://github.com/openpmix/prrte) 3.0.2

```shell
% sudo emerge --ask dev-libs/libevent sys-apps/hwloc
```

PMIx 4.2.7とPRRTEはGentooの公式リポジトリには（現時点では）含まれていないのですが、手動でインストールするか、もしくは次のオーバーレイ[^1]を利用してインストールすることができます。

[ShinobuAmasaki/amasaki-overlay](https://github.com/ShinobuAmasaki/amasaki-overlay)

オーバーレイを利用してインストールする場合の例を以下に示します。

まず、オーバーレイを使用するためにリポジトリを登録して同期します。

```shell
% sudo emerge --ask app-select/eselect-repository
% sudo eselect repository add amasaki-overlay git https://github.com/ShinobuAmasaki/amasaki-overlay.git
% sudo emerge --sync
```

次に、オーバーレイに含まれるパッケージをインストールします。

```shell
% sudo emerge --ask ">=sys-cluster/pmix-4.2.7" ">=sys-cluster/prrte-3.0.2"
```

また、ドキュメントをビルドする場合には、Sphinxが必要です。

```shell
% sudo emerge --ask dev-python/sphinx dev-python/sphinx-rtd-theme dev-python/recommonmark
```

[^1]: Gentoo Linuxのサードパーティ・リポジトリのこと。 

### Open MPIのビルド

ソースコードを[公式サイトからダウンロード](https://www.open-mpi.org/software/ompi/v5.0/)します。

```shell 
% wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.0.tar.bz2
```

アーカイブを解凍して展開し、そのディレクトリに入ります。

```shell
% tar jxvf openmpi-5.0.0.tar.bz2
% cd ./openmpi-5.0.0
```

`./configure`コマンドを実行します（これには長くて5分くらいかかります）。

```shell
% ./configure --prefix=/usr/local     \
	--disable-mpi-java                \
	--enable-mpi-fortran=all          \
	--enable-pretty-print-stacktrace  \
	--enable-prte-prefix-by-default   \
	--sysconfdir=/etc/openmpi         \
	--with-hwloc=/usr                 \
	--with-hwloc-libdir=/usr/lib64    \
	--with-libltdl=/usr               \
	--with-libltdl-libdir=/usr/lib64  \
	--with-libevent=/usr              \
	--with-libevent-libdir=/usr/lib64 \
	--enable-heterogeneous            \
	--with-prrte=/usr                 \
	--enable-binaries                 \
	--enable-ipv6                     \
	--enable-peruse                   \
	--enable-io-romio                 \
	--with-tm                         \
	--with-pbs                    
```

ここで、`--with-prrte=/usr`としているのは、`--with-prrte=internal`ではなぜか構成に失敗するためで、システムにインストールされたPRRTEを用いるように指示しています。

最後に以下のような出力を得ることができれば成功です。これでコンパイルの準備が整いました。

```shell
Open MPI configuration:
-----------------------
Version: 5.0.0
MPI Standard Version: 3.1
Build MPI C bindings: yes
Build MPI Fortran bindings: mpif.h, use mpi, use mpi_f08
Build MPI Java bindings (experimental): no
Build Open SHMEM support: yes
Debug build: no
Platform file: (none)
 
Miscellaneous
-----------------------
Atomics: GCC built-in style atomics
Fault Tolerance support: mpi
HTML docs and man pages: building and installing
hwloc: external
libevent: external
Open UCC: no
pmix: external
PRRTE: external
Threading Package: pthreads
 
Transports
-----------------------
Cisco usNIC: no
Cray uGNI (Gemini/Aries): no
Intel Omnipath (PSM2): no (not found)
Open UCX: yes
OpenFabrics OFI Libfabric: no (not found)
Portals4: no (not found)
Shared memory/copy in+copy out: yes
Shared memory/Linux CMA: yes
Shared memory/Linux KNEM: no
Shared memory/XPMEM: no
TCP: yes
 
Accelerators
-----------------------
CUDA support: no
ROCm support: no
 
OMPIO File Systems
-----------------------
DDN Infinite Memory Engine: no
Generic Unix FS: yes
IBM Spectrum Scale/GPFS: no (not found)
Lustre: no (not found)
PVFS2/OrangeFS: no
```

`make`を実行します。-jオプションの値には自分のCPU数に合わせて適宜変更してください。ここではCPUのスレッド数に合わせて64とします。

```shell
% make -j64
```

一例として、Xeon E5-2683 v4の2CPUマシンではコンパイルに4分ほど掛かりました。

コンパイルが終了すれば、`make install`を実行できます。

```shell
% sudo make install
```

以上で、OpenMPIのインストールは完了です。

### インストールされたか確認する

前のセクションで構成時に`--prefix=/usr/local`と指定したので、実行ファイル・ライブラリは`/usr/local`以下にインストールされます。

```shell
% type mpif90
mpif90 is /usr/local/bin/mpif90

% type mpiexec
mpiexec is /usr/local/bin/mpiexec
```

上のように`type`コマンドでコンパイラとランナーが表示されれば無事インストールに成功したことを確認できます。

## おわりに

Open MPIの新バージョンをソースコードからビルドして実行する方法について述べました。

バージョン4.1.7と5.0.0の`configure --help`を比較して眺めてみると、多くのコンパイルオプションが変更されているのがわかります。しかし、元々のオプションの数が多すぎて、まずは実行バイナリを得るためにどれが必要なのかを探すことに苦労しました。本稿で紹介した構成オプションはほんの一例に過ぎないので、皆さんも自分のマシンに最適な選択肢を探してみてください。

なお、本記事と似たビルド構成のebuildファイルは[ShinobuAmasaki/amasaki-overlay](https://github.com/ShinobuAmasaki/amasaki-overlay)から利用可能なので、オーバーレイを使用して`emerge "=sys-cluster/openmpi-5.0.0"`を実行すれば、同様の構成で簡単にインストールすることが可能です。

## 補遺

1. PRRTEはOpen MPI v5.0.0から新たに依存関係として追加された。
    - これ無しでもOpen MPIのビルド自体はできるが、`mpiexec`と`mpirun`の実行ファイルが生成されないので、当該ホストで実行したい場合には必須となる。
        - つまりクロスコンパイルするだけなら無くてもよい（はず）。
    - `--with-prrte=internal`はなぜか失敗する。

2. [ドキュメントにはPMIxのv4.2.0でビルド可能と書いてある](https://docs.open-mpi.org/en/v5.0.x/installing-open-mpi/required-support-libraries.html)
    - しかしPortageの公式リポジトリにあるv4.2.2-r1ではコンパイルに失敗した。
    - そのためv4.2.7を使用した。

3. 構成オプションで`--with-tm`と`--with-pbs`を有効にしているのは、ジョブスケジューラの[OpenPBS](https://github.com/openpbs/openpbs)を利用するため。