コンテンツにスキップ

MPI

システムHでは、以下のMPIが利用可能です。アプリケーションの特性や利用目的に応じて使い分けてください。

  • NVIDIA HPC-X (HPC SDK)

    NVIDIA GPU に最適化されたMPIです。GPU間通信性能が高く、GPUを活用するHPCアプリケーションに適しています(深層学習、分子動力学など)。

  • Intel MPI

    Intel製CPUクラスタ向けに最適化されたMPIです。高性能なメッセージパッシングと広範なインタコネクト対応による効率的な通信を提供し、CPUベースの数値計算アプリケーションに適しています(気象モデル、有限要素解析など)。

  • OpenMPI

    オープンソースのMPI実装で、広範な互換性と柔軟性を持ち、汎用的なMPIアプリケーションの開発に適しています。

利用するためには事前にmoduleコマンドを用いて利用環境を設定する必要があります。 インタラクティブノードでmoduleコマンドを用いると、コンパイル用環境変数(ヘッダファイルおよびライブラリのサーチパス)が自動で設定されます。 計算ノードでmoduleコマンドを用いると、コンパイル用環境変数に加え、実行用環境変数も自動で設定されます。

[username@qes01 ~]$ module load hpc_sdk/24.9 nvhpc-hpcx-cuda12/24.9
または
[username@qes01 ~]$ module load hpc_sdk/25.5 nvhpc-hpcx-cuda12/25.5
[username@qes01 ~]$ module load intel-mpi/2021.13
[username@qes01 ~]$ module load openmpi/4.1.7

以下では、システムHに導入されているMPIのバージョン一覧を示します。

NVIDIA HPC-X (HPC SDK)

Module Version Open MPI Version Interactive Node Compute Node
24.9 (hpcx 2.20) 4.1.7a1 Yes Yes
25.5 (hpcx 2.22.1) 4.1.7rc1 Yes Yes

使用方法

ここでは、NVIDIA HPC-X (HPC SDK)モジュールの使用方法を説明します。

前述のとおりmoduleコマンドでHPC-X利用環境を設定後、module availコマンドを実行することでHPC-Xモジュールを確認できます。

[username@qes01 ~]$ module avail hpcx
-------------------- /apps/hpc_sdk/24.9/Linux_x86_64/24.9/comm_libs/12.6/hpcx/latest/modulefiles --------------------
hpcx  hpcx-debug  hpcx-debug-ompi  hpcx-mt  hpcx-mt-ompi  hpcx-ompi  hpcx-prof  hpcx-prof-ompi  hpcx-stack

Key:
modulepath  auto-loaded
[username@qes01 ~]$

システムHで提供しているHPC-Xモジュールには以下の種類があります。用途に応じてモジュールを読み込んでください。

モジュール名 説明
hpcx 標準
hpcx-mt, hpcx-mt-ompi マルチスレッド対応
hpcx-debug, hpcx-debug-ompi デバッグ用
hpcx-prof, hpcx-prof-ompi プロファイリング用
hpcx-stack 上記モジュールすべてをロード

hpcx-mtを利用する場合の例

[username@qes01 ~]$ module load hpcx-mt
[username@qes01 ~]$ module list
Currently Loaded Modulefiles:
 1) hpc_sdk/24.9   2) hpcx   3) nvhpc-hpcx-cuda12/24.9   4) hpcx-mt

Key:
auto-loaded
[username@qes01 ~]$

また、ジョブ内でmpirunmpiexecコマンドを実行する際には-hostfileオプションにホストファイルを指定します。 ホストファイルはPBS_NODEFILE環境変数に設定されています。

[username@qes01 ~]$ qsub -I -W group_list=grpname -l rt_QF=2,walltime=01:00:0
[username@qh001 ~]$ module load hpc_sdk/24.9 nvhpc-hpcx-cuda12/24.9
[username@qh001 ~]$ 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 qa@sky4 Distribution, ident: 4.1.7a1, repo rev: v4.1.5-115-g41ba5192d2, Unreleased developer copy, 135)
Hello, world, I am 1 of 2, (Open MPI v4.1.7a1, package: Open MPI qa@sky4 Distribution, ident: 4.1.7a1, repo rev: v4.1.5-115-g41ba5192d2, Unreleased developer copy, 135)

NVIDIA HPC-XではNCCL-SHARPプラグインを提供しています。 プラグインはHPC-Xのバージョンごとに対応するNCCLのバージョンが異なります。HPC-XとNCCLの対応は以下の表を参照してください。

HPC-Xバージョン NCCL バージョン
2.20 2.18.5
2.22.1 2.26.5

各コンポーネントのバージョンについてはリリースノートを参照してください。

NVIDIA HPC-X (HPC SDK)について、より詳しい情報は公式ドキュメントを参照してください。

Intel MPI

intel-mpi/ Interactive Node Compute Node
2021.13 Yes Yes

OpenMPI

システムHで提供しているOpenMPIのモジュールは以下示します。

openmpi/ Interactive Node Compute Node
4.1.7 Yes Yes

独自のOpenMPIの利用

システムHが提供するバージョン以外のOpenMPIが必要な場合、自身でOpenMPIをビルドしユーザ領域にインストールしてください。

以下はOpenMPI 4.1.7 (for GCC 11.4.1) x CUDA 12.6.2 をインストールする場合の例です。

ビルド方法

ビルドのためのサンプルスクリプト

#!/bin/bash

module load cuda/12.6/12.6.2 gcc/11.4.1
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.7.tar.gz
tar zxf openmpi-4.1.7.tar.gz
cd openmpi-4.1.7

PREFIX="${HOME}/openmpi/4.1.7/gcc11.4.1"
mkdir -p $PREFIX

time ./configure \
--prefix=${PREFIX} \
--enable-orterun-prefix-by-default \
--with-cuda=${CUDA_HOME} \
--with-ucx="/usr" \
--with-verbs \
--enable-mca-no-build=btl-uct \
--with-tm="/opt/pbs" \
2>&1 | tee configure.log

make -j8 2>&1 | tee make.log
make install 2>&1 | tee make.install.log

echo "btl_openib_warn_default_gid_prefix = 0" >> ${PREFIX}/etc/openmpi-mca-params.conf
echo "pml = ucx" >> ${PREFIX}/etc/openmpi-mca-params.conf
echo "btl = ^openib" >> ${PREFIX}/etc/openmpi-mca-params.conf

Warning

  • ビルドおよびインストールは計算ノードで実施してください。
  • ビルド後、${PREFIX}/etc/openmpi-mca-params.conf に以下を設定してください
    • btl = ^openib
    • btl_openib_warn_default_gid_prefix = 0
    • pml = ucx
  • PBS連携のためには、以下を実施してください
    • ビルドの際、--with-tm="/opt/pbs"オプションを指定してください
    • プログラムのコンパイル及びジョブ実行の際、環境変数LD_LIBRARY_PATH/opt/pbs/libを追加してください

コンパイル方法

インストールしたOpenMPIを使ってプログラムをコンパイルするサンプルスクリプト

#!/bin/bash
export PATH=~/openmpi/4.1.7/gcc11.4.1/bin:$PATH
export LD_LIBRARY_PATH=~/openmpi/4.1.7/gcc11.4.1/lib:/opt/pbs/lib:$LD_LIBRARY_PATH
which mpicc
mpicc test.c -o test.o

ジョブ実行方法

4ノードに1プロセスずつ(4x1p)実行する場合のサンプルジョブスクリプト

#!/bin/bash
#PBS -l rt_QF=4:mpiprocs=1
#PBS -l walltime=00:05:00
#PBS -l place=scatter
#PBS -W group_list=qgxg50001
#PBS -j oe

cd $PBS_O_WORKDIR

export PATH=~/openmpi/4.1.7/gcc11.4.1/bin:$PATH
export LD_LIBRARY_PATH=~/openmpi/4.1.7/gcc11.4.1/lib:/opt/pbs/lib:$LD_LIBRARY_PATH

echo "nodes:"
cat $PBS_NODEFILE

echo -e "\nrun:"
mpirun ./test.o

2ノードに2プロセスずつ(2x2p)実行する場合のサンプルジョブスクリプト

#!/bin/bash
#PBS -l rt_QF=2:mpiprocs=2
#PBS -l walltime=00:05:00
#PBS -l place=scatter
#PBS -W group_list=qgxg50001
#PBS -j oe

cd $PBS_O_WORKDIR

export PATH=~/openmpi/4.1.7/gcc11.4.1/bin:$PATH
export LD_LIBRARY_PATH=~/openmpi/4.1.7/gcc11.4.1/lib:/opt/pbs/lib:$LD_LIBRARY_PATH

echo "nodes:"
cat $PBS_NODEFILE

echo -e "\nrun:"
mpirun ./test.o