MPI
ABCIシステムでは、以下のMPIを利用できます。
利用するためには事前にmoduleコマンドを用いて利用環境を設定する必要があります。
インタラクティブノードでmoduleコマンドを用いると、コンパイル用環境変数(ヘッダファイルおよびライブラリのサーチパス)が自動で設定されます。
計算ノードでmoduleコマンドを用いると、コンパイル用環境変数に加え、実行用環境変数も自動で設定されます。
[username@login1 ~]$ module load hpcx/2.20
[username@login1 ~]$ module load intel-mpi/2021.13
以下では、ABCIシステムに導入されているMPIのバージョン一覧を示します。
NVIDIA HPC-X
| Module Version | Open MPI Version | Compute Node (H) |
|---|---|---|
| 2.20 | 4.1.7a1 | Yes |
使用方法
ここでは、NVIDIA HPC-Xモジュールの使用方法を説明します。
ABCIで提供しているHPC-Xモジュールには以下の種類があります。用途に応じてモジュールを読み込んでください。
| モジュール名 | 説明 |
|---|---|
| hpcx | 標準 |
| hpcx-mt | マルチスレッド対応 |
| hpcx-debug | デバッグ用 |
| hpcx-prof | プロファイリング用 |
また、ジョブ内でmpirun、mpiexecコマンドを実行する際には-hostfileオプションにホストファイルを指定します。
ホストファイルはPBS_NODEFILE環境変数に設定されています。
[username@login1 ~]$ qsub -I -P groupname -q rt_HF -l select=2:mpiprocs=192 -l walltime=01:00:00
[username@hnode001 ~]$ module load hpcx/2.20
[username@hnode001 ~]$ mpirun -np 2 -map-by ppr:1:node -hostfile $PBS_NODEFILE ./hello_c
Hello, world, I am 0 of 2, (Open MPI v4.1.7a1, package: Open MPI root@hnode001 Distribution, ident: 4.1.7a1, repo rev: v4.1.5-115-g41ba5192d2, Unreleased developer copy, 141)
Hello, world, I am 1 of 2, (Open MPI v4.1.7a1, package: Open MPI root@hnode001 Distribution, ident: 4.1.7a1, repo rev: v4.1.5-115-g41ba5192d2, Unreleased developer copy, 141)
NVIDIA HPC-XではNCCL-SHARPプラグインを提供しています。 プラグインはHPC-Xのバージョンごとに対応するNCCLのバージョンが異なります。HPC-XとNCCLの対応は以下の表を参照してください。
| HPC-Xバージョン | NCCL バージョン |
|---|---|
| 2.20 | 2.23 |
NVIDIA HPC-Xについて、より詳しい情報は公式ドキュメントを参照してください。
Intel MPI
| intel-mpi/ | Compute Node (H) |
|---|---|
| 2021.13 | Yes |
InfiniBand NDRの使用個数の変更方法
計算ノード(H)にはInfiniBand NDR HCAが8つ搭載されています。
ABCIが提供するhpcxモジュールおよびintel-mpiモジュールでは、デフォルトでマルチレールのレーン数に次の値が設定されています。
- Rendezvousプロトコル(大容量メッセージ)の使用レーンは4
- Eagerプロトコル(小容量メッセージ)の使用レーンは1
使用レーン数はそれぞれUCX_MAX_RNDV_RAILS/UCX_MAX_EAGER_RAILS環境変数で変更することができます。
Info
UCX_MAX_RNDV_RAILS、UCX_MAX_EAGER_RAILS環境変数に設定できる値は1-8です。
以下はインタラクティブジョブによる変更方法例です。 この例では、使用レーン数をデフォルト値の倍に設定しています。
[username@login1 ~]$ qsub -I -P group -q rt_HF -l select=2:mpiprocs=8 -l walltime=1:0:0
[username@hnode001 ~]$ module load hpcx/2.20
[username@hnode001 ~]$ export UCX_MAX_RNDV_RAILS=8
[username@hnode001 ~]$ export UCX_MAX_EAGER_RAILS=2
[username@hnode001 ~]$ mpirun ./a.out
また、以下のようなラッパースクリプトを用いることで各プロセスにユニークなNDR HCAを割り当てることができます。
- wrap.sh(hpcx)
#!/bin/sh
NNDRS=8
for i in $(seq 1 $NNDRS)
do
if [ $((OMPI_COMM_WORLD_RANK%NNDRS)) -eq $((i-1)) ];then
export UCX_NET_DEVICES=mlx5_ibn$i:1
fi
done
exec "$@"
mpirun ./wrap.sh ./a.out
- wrap.sh(intel-mpi)
#!/bin/sh
NNDRS=8
for i in $(seq 1 $NNDRS)
do
if [ $((PMI_RANK%NNDRS)) -eq $((i-1)) ];then
export UCX_NET_DEVICES=mlx5_ibn$i:1
fi
done
exec "$@"
mpiexec.hydra ./wrap.sh ./a.out
Warn
ジョブ投入時にqsubコマンドにmpiprocs(ppn)を指定してMPIプロセス数を指定して下さい。
Info
上記のmlx5_ibn$iがNDR HCAのデバイス名です。