Skip to content
oraccha edited this page Jan 14, 2013 · 1 revision

Message Passing Interface

  • [http://www.mpi-forum.org/ MPI Forum]

  • [http://accc.riken.jp/HPC/training/text.html 並列プログラミング入門 MPI版] (青山幸也) . 「虎の巻」.理研で定期的に講習会が開かれているが,そのテキスト.

  • [http://www.cs.usfca.edu/mpi/ Parallel Programming with MPI] (Peter Pacheco) . MPIの解説書だが,並列プログラミングの教科書としてもよい.翻訳されている.

並列プログラミング用のメッセージ通信ライブラリの標準規格.

  • MPI-1 (1994)
  • MPI-1.1 (1995)
  • MPI-2.0/MPI-1.2 (1997)
  • MPI-1.3 (2008)
  • [http://www.mpi-forum.org/mpi2_1/index.htm MPI-2.1] (2008)

1990 年初頭,各ベンダは独自の並列通信ライブラリを提供していたため,ユーザプログラムのポータビリティ問題が深刻化していた.そこで,アメリカの国立研究所,並列計算機ベンダが中心となり,仕様が策定された(この時点では国内メーカも割と積極的にかかわっていたのでは?).MPI-1で重要だったポイントは、仕様と同時にMPICHというリファレンス実装が提供されたこと。これにより普及が進んだ。現在,基本仕様である MPI-1 とその拡張仕様である MPI-2 が定められている.MPI-2はリファレンス実装が提供されなかったことから、なかなか普及が進まなかった(し、仕様が複雑になり、あいまいな点も多い)。2000年代後半になってきて、実装がMPICH2とOpenMPI系にほぼ集約された。そして、特にフォールトトレランス系のMPI研究者が中心となって、MPI-3策定の動きが出てきた。そして、2008年になり、MPI-1.3、MPI-2.1がリリースされた。MPI-2.1はいままで分かれていたMPI-1.xとMPI-2.0のドキュメントをマージし、エラッタを反映したものである。

MPI-2.1に続くMPI-2.2では、仕様/実装に大きな変更を伴わない変更が議論されている。

MPI-3.0に向けて議論されているのは、ABIの共通化(商用アプリのベンダからの要求が高いが、ライブラリ実装者は乗り気ではなく、実現の目処は疑問視)、ノンブロッキングコレクティブ(などP2Pにはあるけどcollectiveにない機能を実現する)、フォールトトレランス機能など。多くのワーキンググループが走っている。仕様の肥大化が懸念され、サブセット定義の動きも。

  • [http://www.nccs.gov/2007/12/04/forum-to-upgrade-mpi-standard/ Forum to Upgrade MPI Standard] (NCCS)
  • [http://meetings.mpi-forum.org/MPI_3.0_main_page.php MPI 3.0 Standardization Effort]

MPI は,実行モデルとして SPMD (Single Program Multiple Data) を想定した通信ライブラリである.

  • つまり,同一のプログラムを複数の計算ホスト(プロセス)で実行する.それぞれの計算ホストはそれぞれ独自のデータを持つ.通信ライブラリでデータ交換,同期を行う.

    • より具体的にいうとリモートシェル(SSH,rsh)によって各計算ホスト上でプロセスを実行し,ソケット(共有メモリ,etc)により通信する.
  • MPI-1 は,コミュニケータと呼ばれるコンテキストによる通信,アプリケーション記述を容易にする集合通信機能(collective communication: バリア同期,スキャッタ/ギャザ,全交換,リダクション)を提供する.MPI-2 は,MPI-1 の機能に加えて,リモートメモリアクセス(One-sided Communication),動的プロセス生成,並列I/O (>> MPI-IO)を提供する.

    • mpirunは仕様に定められていなかったので、独自拡張がいろいろなされたりしたが、MPI-2でmpiexecが提案された。
  • コミュニケータは,通信に必要なコンテキスト,プロセスグループ,仮想トポロジ,属性(名前と値の組)を保持する.全プロセスは MPI_COMM_WORLD に所属する.

    • プロセスはコミュニケータ内での識別子として rank を持つ.
    • メッセージの Send/Receive には相手の rank を指定する.Receive はMPI_ANY_SOURCE (ワイルドカード)を指定することによって送信元を特定せずに受信することも可能.
  • Point-to-Point通信.

    • non-blocking 通信にはデータ通信の並列度を上げる,デッドロックを防ぐという利点がある.
    • blocking は bsend/brecv, ssend/srecv, rsend/rrecv で,non-blocking は isend/irecv.non-blocking 関数では,MPI_Request ハンドラを引数に渡す必要がある.MPI_Wait*/Test* で完了を待つ.
    • 呼出し側で処理が完結する関数を local(send だと bsend とか),完結しないものを non-local と呼ぶ.
  • データは<アドレス,カウント,データ型>によって記述される.C/FORTRAN の基本型(MPI_INT,MPI_FLOAT,etc)の他に構造体のようなユーザ定義の派生型も利用できる.

    • MPIはあくまでライブラリでコンパイラと連動しているわけじゃないので,派生型を使って通信する場合には,その型情報をライブラリに教える仕組みが必要である.
    • Send/Receive 時に型を示すタグを指定して,メッセージを送受信する.MPI_ANY_TAG を指定すれば,受信時の型チェックはしない.
    • MPI_ANY_SOURCE/MPI_ANY_TAG でメッセージを受信しても status を見れば,送信元やタグを知ることができる.エラーも status の中.

オープンソース実装 . MPICHLAM/MPI が有名.MPICH はポータビリティを重視しており,いろいろな派生実装が存在する.一般的に性能は LAM/MPI の方がよい. Linux 版は MPICH より LAM/MPI の方が安定してたらしい.RedHatLinux にも LAM/MPI が標準で含まれている.

最近の状勢?

  • MPICH: [http://www.intel.com/software/products/cluster/mpi/ Intel MPI] は MPICH-2 をベースにしている.
  • OpenMPI: LAM/MPI や MPICH-1 ベースにやっていた多くのオープンソース実装は OpenMPI に集結しそう?
    • SC2004 に合わせて preliminary なバージョンがリリースされるらしいが(間に合わなかったっぽい).

その他の実装

  • YAMPII

  • GridMPI

  • [http://mvapich.cse.ohio-state.edu/ MVAPICH]

  • [http://www.logos.ic.i.u-tokyo.ac.jp/~h_saito/mcmpi/ MC-MPI]

  • [http://charm.cs.uiuc.edu/research/ampi/ Adaptive MPI]

  • [http://www.hlrs.de/organization/amt/projects/pacx-mpi/ PACX-MPI] . PArallel Computer eXtension MPI.

  • [http://www.lfbs.rwth-aachen.de/~martin/MetaMPICH/ MetaMPICH] . router processesによってクラスタ間を暗黙的に接続する。

  • [http://www.lri.fr/~coti/QosCosGrid/qcgompi.html QCG-OMPI]

  • [http://grape.astron.s.u-tokyo.ac.jp/~makino/softwares/tcplib/tcplib.html tcplib.c 利用の手引]

  • [http://www.disi.unige.it/project/gamma/mpigamma/ MPI/GAMMA]

    • [http://grape.astron.s.u-tokyo.ac.jp/pub/people/makino/articles/MPI-GAMMA.html SCoreでなくGAMMA-MPIを使ってみた] (2001-06-04)
  • [http://www.scl.ameslab.gov/Projects/MP_Lite/ MP_Lite]

  • [http://www.osl.iu.edu/research/oompi/ OOMPI]

  • [http://www.cs.ubc.ca/labs/dsg/mpi-sctp/ MPI-SCTP] . トランスポートに SCTP を使う実装.LAM/MPI ベース? MPICH2にマージされているらしい。

  • [http://charm.cs.uiuc.edu/ Charm++]

  • [http://public.lanl.gov/lampi/ LA-MPI]

  • [http://mpi.deino.net/ DeinoMPI] . Windows用。

ベンダMPI

  • [http://www.intel.com/software/products/cluster/mpi/ Intel MPI] (Intel)
    • インタフェースはソケット(TCP)の他に,DAPL(InfiniBand, MX)で,DAPL を推して行くみたい.PMI という Linda っぽいタプル空間とバリア同期を提供する.
  • MPI/SX,MPI/EX,MPI/ES (NEC) . それぞれ SX,IA32/64,地球シミュレータ用の MPI 実装.MPI-2 をフルサポートしている.
  • [http://www.hp.com/go/mpi HP MPI] (HP) . MPICH ベース? MPICH互換モードがあるけど、別実装か。
  • ParallelNavi (富士通) . SPARC
    • PRE (Parallel Runtime Environment)。aprun/aprund。
  • [http://www.sgi.com/products/software/mpt/ MPT] (SGI) . MPI、SHMEM

ベンチマーク

  • NPB
  • [http://www.intel.com/cd/software/products/asmo-na/eng/cluster/mpi/219848.htm Intel MPI Benchmarks]
    • 元々は [http://www.pallas.com/e/products/pmb/index.htm Pallas MPI Benchmarks]
  • [http://icl.cs.utk.edu/projects/llcbench/mpbench.html MPIbench] ([http://icl.cs.utk.edu/projects/llcbench/index.html LLCbench])
  • [http://liinwww.ira.uka.de/~skampi/ SKaMPI]
  • [http://www.spec.org/mpi/ SPEC MPI]

テスト

  • [http://www-unix.mcs.anl.gov/mpi/mpi-test/tsuite.html MPI Test Suites]
  • Inten の Test suites

プロファイラ/デバッガ

  • [http://www-unix.mcs.anl.gov/perfvis/ MPE] . MPI の profile インタフェースを使った実装.jumpshot という Java で実装されたビジュアライザもある.
    • MPI profile インタフェースの実装方法としては,weak symbol を使うとか.
  • [http://www.etnus.com/ TotalView] (TotalView Technologies)
    • EtnusからTotalView Technologiesに社名が変わった.

その他

  • MPIRuby . ruby binding.
  • [http://www-i2.informatik.rwth-aachen.de/~michaelw/hmpi.html hMPI] . Haskell binding.
  • [http://pympi.sourceforge.net/ pyMPI]

ヘテロ環境プログラミングTIPS

  • 配列や構造体を MPI_BYTE で転送しない.
  • 機種/コンパイラ依存
    • C の long 型は使わない.
    • long double 型は使わない.
    • MPI の STRUCT データ型は使わない. . オフセット値はアライメント制約を受けるが,これは機種/コンパイラ依存.
    • floating の計算精度を合わせる.
  • MPI 実装依存
    • MPI_PACKED を通信には使わない. . パック後のサイズ,フォーマットは MPI 実装依存.

IMPI って仕様もあるらしいが,ヘテロな環境でどこまでちゃんと動くんだろう?


集合通信の性能を上げるにはどうすればいいか?

  • ネットワーク環境(バンド幅,遅延)に応じたトポロジを作ることが必要.

MPI_Bcast: root rank のデータを残りの rank にばらまく(自分への通信は行なわない).

  • root rank からすべての rank に対してコネクションを張るのではなく,最初にツリー上のトポロジを作り,送信する.
  • LAM/MPI 7.0 の場合,4 rank より大きいとツリーベースアルゴリズムを使う.
    • linear set と lograthmic set の関数表を持っている.ただしほとんどは同じで lograthmic set 専用の関数があるのは,Barrier,Bcast,Reduce.
    • 4 は lam_ssi_coll_base_crossover で変更可能.

集合通信とツリーアルゴリズム

  • sequential
  • chain
  • binary tree
  • binominal tree

分散共有メモリ型並列計算機におけるメッセージ通信インタフェース

  • 矛盾しているのでは
  • 分散共有メモリの実装に使うことはできますけど

プロセス / スレッド間の通信手段を二種類に分類します.

  • 何らかの方法で各ノードがみな同じようにアクセスできるメモリ空間を作り, それを利用するのが共有メモリ.
  • 共有メモリがない環境で / 共有メモリを使わず, 通信を明示するのがメッセージ交換.

MPI はその名の通り後者の標準インタフェースを定めたもので, 分散共有メモリの存在を前提にはしていません.

確かに「分散共有メモリ型...における」は変ですね.分散メモリ型と言えばOK??

Clone this wiki locally