MPICH-SCore version 2.0 (ch_score2) MPIアプリケーションの実行

環境

mpicc, mpif77等 MPICH-SCore の MPIコンパイラで 生成されたバイナリは SCore オペレーティングシステムのもとで 起動します。従って、プログラムの実行にさきだち、 SCore オペレーティングシステムの シングルユーザ環境、 または、 複数ユーザ環境の どちらかが、使用できる状態になっている必要があります。

シングルユーザ環境での実行

シングルユーザ環境では MPIアプリケーションの実行に先立ち、 scout プログラムを起動する必要があります。 scoutはリモートシェル環境を提供します。 そして、scoutの上で mpirun をつかいMPIアプリケーションを実行します。 例えば、プログラムを 4 ノードで実行する場合は以下のようにします:

$ setenv SCBDSERV server.pccluster.org
$ msgb -group pcc&
$ scout -g pcc
[comp0-3]:
SCOUT(3.1.0): Ready.
$
. . .
. . .
$ mpirun -np 4 ./mpi_program args ...
. . .
. . .
$ exit
SCOUT: session done
$

MPICH-SCore は SMP ノードからなるクラスタをサポートしています。SCore ランタイムは SMP ノード上で複数の MPI プロセスを起動します。 各ノードで起動するMPIプロセスの数はmpirun-npオプションで指定できます。たとえば、4つのSMPノードの各ノードで2つのMPIプロセスを 立ち上げ、合計8つのMPIプロセスを走らせる場合は以下のように指定 します:

$ mpirun -np 4x2 ./my_mpi_program args...

各ノードで起動するMPIプロセスの数を指定しない場合、各ノードで 起動するMPIプロセスの数は、SMPのプロセッサ数となります。 たとえば、2 CPUのSMPクラスタにおける、-np 4 の指定は -np 2x2 と等価です。

MPIアプリケーションは mpirun ではなく、scrunでも 起動できます。たとえば、2 CPU の SMP クラスタで、8 ノード、合計 16 CPU を つかってプログラムを実行するには、以下のようにします:

$ scrun -nodes=8x2 ./my_mpi_program args...

scrun-nodesオプションを省略した場合は、 scoutでアロケートされたノードのすべてのCPUについて MPIプロセスが起動されます。

サンプルプログラムの実行(シングルユーザー環境)

MPI_Alltoall関数による全体全通信の性能を測定するMPIプログラム alltoall は次のように実行します。1番目の引数はメッセージ長で、2番目の引数は 計測のためのループ回数です。出力は、MPI プロセス数、メッセージ長、MPI_Alltoall 1回あたりにかかった時間(μ秒)です。

$ setenv SCBDSERV server.pccluster.org
$ msgb -group pcc&
$ scout -g pcc
[comp0-3]:
SCOUT(3.1.0): Ready.
$
. . .
. . .
$ scrun -nodes=4x2 alltoall 3000 10000
SCORE: Connected (jid=1)
<0:0> SCORE: 8 nodes (4x2) ready.
8 3000 1052.230600
$
. . .
. . .
$ exit
SCOUT: session done
$

複数ユーザ環境での実行

複数ユーザ環境では mpirun のみの使用でMPIアプリケーションが起動できますが、 その際に SCore-D を制御している ホストを指定する必要があります:

$ mpirun -np 4x2 -score scored=comp3.pccluster.org ./mpi_program args...

SCore-D を制御しているホストは 環境変数 SCORE_OPTIONS 内で指定することもできます。 例えば以下のようにします:

$ export SCORE_OPTIONS=scored=comp3.pccluster.org
$ mpirun -np 4x2 ./mpi_program args...
複数ユーザ環境においても mpirun のかわりに scrun を使用することができます。
$ export SCORE_OPTIONS=scored=comp3.pccluster.org
$ scrun -nodes=4x2 ./mpi_program args...
SMPクラスタにおけるSMPノード内のMPIプロセス数の指定方法などは シングルユーザ環境における方法と同じです。

実行性能の改善

プロトコル切り替え点の変更

MPICH-SCore version 2.0 (ch_score2) は、以下の3つのメッセージ転送プロトコルを使用して MPIメッセージの転送を行います。この3つのプロトコルはメッセージのサイズによって 切り替えられています。アプリケーションや、クラスタの構成にもよるのですが、プロトコルの切り替え点 を調整すると MPICH-SCore の性能が向上する場合があります。

Short protocol と Eager protocol の切り替え点は、MPICH-SCore のコンパイル時に 決められています。デフォルトでは1kbytesに設定されています。 この値を変更したい場合は、/opt/score/src/mpi/mpich-1.2.0/src/mpid/ch_score/mpid.hを編集してください。 このヘッダの先頭で、変更後の値を持つ、マクロMPID_PKT_MAX_DATA_SIZEを定義します。 MPICH-SCore を再コンパイル、インストールしなおす必要があります。

Eager protocolと Get protocolの切り替え点は、MPIアプリケーション実行時に 指定することができます。この切り替え点はPMのデバイス毎に指定します。 PM/Myrinetについての指定はmpi_max_eager_myrinetオプション、 PM/Shmemについてはmpi_max_eager_shmemオプションを用います。 PM/Myrinetの場合の切り替え点のデフォルトは300kbytes、 PM/Shmemの場合の切り替え点のデフォルトは1.2kbytesです。 たとえば、PM/Myrinetの切り替え点を64kbytesにするには以下のように指定します:

$ mpirun -np 4x2 -score mpi_max_eager_myrinet=64000 ./mpi_program args...
次のように指定することもできます:

$ scrun -nodes=4x2,mpi_eager_myrinet=64000 ./mpi_program args...

リモートメモリアクセス機能を用いたメッセージ通信は、ハードウェアによっては、 CPUによるメモリ間コピーを行わずに、実装することができます。 このメッセージ通信のことをゼロコピー通信とよびます。 PM/Myrinet のリモートメモリアクセス機能を用いたMPIメッセージ通信はゼロコピー通信です。 ゼロコピー通信はメインメモリへの負荷を軽減するため、point-to-point通信における最大バンド幅を 向上させます。ゼロコピー通信は、それがアプリケーションの性能向上に有効であるかどうかは、 そのアプリケーションに依存します。ゼロコピー通信には、その開始のための 同期オーバヘッドがあるからです。

SMPクラスタにおける、SMPノード内でのリモートメモリアクセスには、PM/Shmemの リモートメモリアクセス機能が用いられます。この機能は PM/Shmemデバイスドライバによるプロセス間メモリコピーによって実現されています。 SMPノード内でのプロセス間通信を1回のメモリコピーによって実現するので、 ワンコピー通信と呼べます。

PMリモートメモリアクセス機能(ゼロコピー通信/ワンコピー通信)の抑制

MPIアプリケーションによってはPMリモートメモリアクセス機能を全く使わない ほうが性能がよい場合もあるかもしれません。また、 現在のところチェックポインティング機能は、PMリモートメモリアクセス機能 との組み合わせでは使用できないので、MPICH-SCore version 2.0 はPMリモートメモリアクセス機能を 無効にするオプションをサポートしています。 PMリモートメモリアクセス機能を無効にするには、mpi_rmaオプションを用います:

$ mpirun -np 4x2 -score mpi_rma=off mpi_program args...
次のように指定することもできます:
$ scrun -nodes=4x2,mpi_rma=off ./mpi_program args...

PMリモートメモリアクセス機能が無効になっている場合、Get protocolは使用されません。

ch_score2がもつ全対全通信のためのコードを使用する

MPICH-SCore version 2.0 は MPI_Alltoall および MPI_Alltoallv 関数のために デフォルトとは違うコードも用意しています。このコードは全対全通信の 各ステップにおいて、すべてのMPIプロセスの同期をとるものなのですが、 いくつかの条件においては、よい性能を得ることがあります。 このコードを有効にするには-score mpi_synccollオプションを 使用します。このコードがよい性能を得るかどうかは、ネットワーク構成と 全体全通信のメッセージサイズによります。

さらに性能を向上させるには

score_info@pcclustrer.org へ御連絡下さい。 我々のアドバイスが性能向上のお役にたてることを願っております。

制限

関連項目

MPICH-SCore version 2.0 (ch_score2): MPIアプリケーションのコンパイル

mpic++(1), mpicc(1), mpif77(1), mpirun(1) scrun(1)

任意のコンパイラの提供


CREDIT
This document is a part of the SCore cluster system software developed at PC Cluster Consortium, Japan. Copyright (C) 2003 PC Cluster Consortium.