6.5. MPI

MPIの概要#

本サービスにおいて標準で利用可能なMPIの情報を記述します。

MPIに関する注意事項

Development Studio MPIはArmシステムのみで利用可能です。Intel MPIはx86システムとGPUシステムで利用できます。

利用方法#

MPIを利用する際は、moduleコマンドで利用環境を設定します。moduleコマンドを用いると、環境変数(コマンドやヘッダファイル、ライブラリのサーチパス)が自動で設定されます。

Development Studio MPIを使用する場合は、以下のコマンドで利用環境を設定してください。

$ module load development-studio/1.2.37

Intel MPIを使用する場合は、以下のコマンドで利用環境を設定してください。

$ module load mpi/2021.8.0

OpenMPIを使用する場合は、以下のコマンドで利用環境を設定してください。 OpenMPIを利用する際は、ビルドに使用しているIntel compiler version 2023.0.0も併せて環境設定してください。

$ module load compiler/2023.0.0
$ module load openmpi/4.1.4/icc-2023.0.0

MPI処理系ごとの注意事項と実行例#

Intel MPI、Open MPI、MPICH、Platform MPIなど、Development Studio以外のMPI処理系のMPIプログラムを本サービス上で実行する際の注意事項と実行例について説明します。詳細につきましては、Technical Computing Suite オンラインマニュアルで公開されている「エンドユーザ向けガイド」の付録Cもご参照ください。


注意事項#

  • ノードまたは仮想ノード上でMPIプロセスを実行するために、rshsshコマンドの代わりにジョブ運用ソフトウェアが提供するpjrshコマンドを使用してください。ただし、Intel MPI (Hydra)などでmpiexecプロセスの標準入力を利用した場合、pjrshコマンドがMPIプロセスへ標準入力を与えますが、標準入力のデータ量がおよそ8MBを超える場合、rshsshコマンドと比べて、転送性能が劣化する可能性があります。このようなときは、mpiexecプロセスの標準入力を利用するのではなく、各MPIプロセスからファイルで読み込んでください。

  • ジョブに割り当てるノード資源を、以下のように指定してください。

    pjsub -L "node=N" ...
    
  • ホスト名を指定してMPIプログラムを実行する場合は、以下のように実施してください。

    a. Armシステムで実行する場合

    pjshowipコマンドを使用してください。 pjshowipコマンドは、ジョブスクリプト内から実行することによって、ジョブに割り当てたノードリスト(ランク番号ごとのIPアドレス)をランク番号ごとに標準出力へ出力します。

    b. x86システム/GPUシステムで実行する場合

    環境変数PJM_O_NODEINFを使用してください。 環境変数PJM_O_NODEINFはジョブ運用ソフトウェアによって設定され、ジョブに割り当てたノードリスト(IPアドレスのリスト)を格納したファイルのパスを示します。

  • MPIジョブを削除する場合は、そのMPI処理系がクリーンアップ処理(各種資源の解放など)をするシグナルを送信してから、ジョブを削除してください。クリーンアップ処理をするシグナルを送信せずにジョブを削除した場合、後続のジョブが実行できないなどの影響をおよぼす可能性があります。 クリーンアップ処理をするシグナルは各MPI処理系の仕様を確認してください。一般的には、シグナルSIGINTまたはSIGTERMによりクリーンアップ処理が行われます。


実行例#

MPIプログラムの一般的な実行方法やバージョンによる違いについては、各MPI処理系の仕様を確認してください。

  • Intel MPI: Scalable Process Management System(Hydra)を利用する場合

1. 環境変数の設定

Hydraの環境変数を以下のように設定します。

a. I_MPI_HYDRA_BOOTSTRAP=rsh
b. I_MPI_HYDRA_BOOTSTRAP_EXEC=/bin/pjrsh
c. I_MPI_HYDRA_HOST_FILE="${PJM_O_NODEINF}"
これにより、rshsshコマンドの代わりにpjrshコマンドを使用するようになります。

2. MPIプログラム実行

Intel MPIで作成されたMPIプログラムを実行します。プログラム実行にはmpiexec.hydraコマンドを利用します。

  • [例] プロセス並列のMPIプログラム(a.out)を実行するジョブスクリプト(Hydra を利用する場合)
...
export I_MPI_PERHOST=1
export I_MPI_HYDRA_BOOTSTRAP=rsh                  #1.a.
export I_MPI_HYDRA_BOOTSTRAP_EXEC=/bin/pjrsh      #1.b.
export I_MPI_HYDRA_HOST_FILE="${PJM_O_NODEINF}"   #1.c.
mpiexec.hydra -n 4 a.out                          #2.
...
  • OpenMPIを利用する場合

1. 環境変数の設定

OpenMPIのMCAパラメータを環境変数として以下のように設定します。

a. OMPI_MCA_plm_rsh_agent="/bin/pjrsh"
b. OMPI_MCA_orte_default_hostfile=${PJM_O_NODEINF}
これにより、rshsshコマンドの代わりにpjrshコマンドを使用するようになります。

2. MPIプログラム実行

OpenMPIで作成されたMPIプログラムを実行します。プログラム実行にはmpiexecコマンドを利用します。

  • [例] プロセス並列のMPIプログラム(a.out)を実行するジョブスクリプト
...
export OMPI_MCA_plm_rsh_agent="/bin/pjrsh"             #1.a.
export OMPI_MCA_orte_default_hostfile=${PJM_O_NODEINF} #1.b.
mpiexec -n 2 -npernode 1 a.out                         #2.
...