(Translated by https://www.hiragana.jp/)
Message Passing Interface - Wikipedia コンテンツにスキップ

Message Passing Interface

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

Message Passing Interface(メッセージ パッシング インターフェース、MPI)とは、並列へいれつコンピューティング利用りようするための標準ひょうじゅんされた規格きかくである。実装じっそう自体じたいすこともある。

複数ふくすうのCPUが情報じょうほうをバイトれつからなるメッセージとして送受信そうじゅしんすることで協調きょうちょう動作どうさおこなえるようにする。自由じゆう使用しようできる実装じっそうとしてはMPICH有名ゆうめいである。ほかにも商用しょうようベンダなどによる独自どくじ実装じっそう存在そんざいする。

ライブラリレベルでの並列へいれつであるため、言語げんごわず利用りようでき、プログラマが細密さいみつなチューニングをおこなえるというメリットがある一方いっぽう利用りようにあたっては明示めいじてき手続てつづきを記述きじゅつする必要ひつようがあり、ロックの対処たいしょなどもプログラマがわおおきな責任せきにんをもたなければならない。

業界ぎょうかい団体だんたい研究けんきゅうしゃらのメンバからなる MPI Forum によって規格きかく明確めいかく定義ていぎされているため、ある環境かんきょう作成さくせいしたプログラムが環境かんきょうでも動作どうさすることが期待きたいできる。

歴史れきし

[編集へんしゅう]

MPIへのみは1991ねんなつにオーストリアの山荘さんそうでの、小規模しょうきぼ研究けんきゅうしゃのグループのディスカッションからはじまった。その議論ぎろんは、よく1992ねん4がつ29-30にちのバージニアしゅうウィリアムズバーグで、分散ぶんさんメモリ環境かんきょうのためのメッセージパッシング規格きかく標準ひょうじゅんについてのワークショップにがれた。このワークショップでは標準ひょうじゅんてきなメッセージパッシングインタフェースに必須ひっすとなるであろう基本きほんてき機能きのうについて議論ぎろんされ、標準ひょうじゅんけてワーキンググループが設立せつりつされた。ジャック・ドンガラ、Rolf Hempel、Tony Hey、David W. Walkerは1992ねん11月にドラフトを提案ていあんし、これがMPI1となった。1992ねん11月にはMPIワーキンググループの会議かいぎがミネアポリスでおこなわれ、そこで標準ひょうじゅんプロセスをより公式こうしき仕組しくみにせることがめられた。MPIワーキンググループは1993ねん最初さいしょの9ヶ月かげつあいだは6しゅうごとにミーティングをおこなった。MPIのドラフトの標準ひょうじゅん規格きかくは1993ねん11月のスーパーコンピューティング・カンファレンス発表はっぴょうされた。パブリックコメントの期間きかんて、その内容ないようがMPIに反映はんえいされ、1994ねん6がつにMPI version 1.0がリリースされた。これらのミーティングとE-mailでの議論ぎろんがMPIフォーラムそのものであり、このフォーラムへの参加さんか権利けんりはハイパフォーマンスコンピューティング関係かんけいしゃひとたち全員ぜんいんひらかれている。

このころMPIにたいしては欧米おうべい組織そしき中心ちゅうしんに40の組織そしきからやく80にん人々ひとびと関与かんよしていた。大手おおて並列へいれつ計算けいさんのメーカーのおおくが参加さんかしていたほか、大学だいがく政府せいふ研究けんきゅう機関きかんや、その企業きぎょうからも研究けんきゅうしゃ参加さんかしていた。

MPIの標準ひょうじゅんではコアライブラリの構文こうぶん意味いみろん定義ていぎすることによって、FortranやCで移植いしょく可能かのうなメッセージパッシングをおこなうプログラムを幅広はばひろ分野ぶんやつくれるようになっている。

MPIは基本きほんてきなルーチンぐん仕様しよう明確めいかく定義ていぎして並列へいれつ計算けいさんのメーカーにたいして公開こうかいしているので、かれらはそれにもとづいて効率こうりつてき実装じっそうすすめることができる。その結果けっかかくメーカーは自社じしゃ製品せいひんのマシンにていレベルのMPI標準ひょうじゅん準拠じゅんきょしたルーチンぐん実装じっそう搭載とうさいし、さらにそのうえ高次こうじ分散ぶんさんメモリ通信つうしん環境かんきょうのルーチンをせることができる。MPIは単純たんじゅんかつ基本きほんてき移植いしょく可能かのうなプログラムをくことも可能かのうである一方いっぽうで、ハイパフォーマンスなメッセージパッシングを先進せんしんてき計算けいさんうえおこなうようなプログラミングも可能かのうである。

メッセージパッシングの本当ほんとう意味いみでの標準ひょうじゅん目指めざそうというかんがかたしたがって、MPIではどれかの製品せいひん機能きのう標準ひょうじゅん採用さいようするというやりかたではなく、いくつかのシステムからもっと有用ゆうよう機能きのうをMPIむというやりかたられている。かく機能きのうはIBM由来ゆらい、インテル由来ゆらい、nCUBE由来ゆらい、PVM由来ゆらい、Express由来ゆらい、P4由来ゆらい、PARMACS由来ゆらいのものがある。メッセージパッシングという手法しゅほう人気にんきがあるのはひろ移植いしょくせいと、分散ぶんさんメモリや共有きょうゆうメモリでのマルチプロセッサによる処理しょり、ワークステーションをネットワークで接続せつぞくしたものやそれらすべてのようなふくあいてき環境かんきょうたいして適用てきよう可能かのうなためである。この手法しゅほうは、様々さまざま構成こうせいや、ネットワークの速度そくど、メモリアーキテクチャーに依存いぞんせず適用てきようできる。

MPIは、ARPAアメリカ国立こくりつ科学かがく財団ざいだんのグラントASC-9310330、NSF Science and Technology Center Cooperative agreement number CCR-8809615、ヨーロッパではEsprit Project P6643から活動かつどう資金しきん供給きょうきゅうされているほか、テネシー大学だいがくはMPIフォーラムを資金しきんてきささえている。

概要がいよう

[編集へんしゅう]

MPIはプログラミング言語げんごとは独立どくりつ通信つうしんプロトコルで、並列へいれつ計算けいさん機上きじょううごくプログラムに使用しようされる。通信つうしんはPoint-to-Pointとグループ通信つうしん(Collective communication)の両方りょうほうがサポートされている。MPIは「メッセージパッシングアプリケーションのためのプログラミングインタフェースで、プロトコルとセマンティクスを定義ていぎすることで、すべての実装じっそうにおいてその機能きのうがどううべきかを仕様しようとしてさだめている」MPIのゴールはハイパフォーマンス、スケーラビリティ、移植いしょくせいである。MPIは現在げんざいでもハイパフォーマンスコンピューティングにおいてはよくもちいられる手法しゅほうである。

MPIは有名ゆうめい標準ひょうじゅん承認しょうにん規格きかくではない。しかしMPIは分散ぶんさんメモリじょう動作どうさする並列へいれつ計算けいさんプログラムのプロセスあいだ通信つうしんのモデルとしてはデファクトスタンダードとなっている。実際じっさいに、コンピュータークラスターのような構成こうせい分散ぶんさんメモリがたスーパーコンピューターようのプログラムではMPIはよく採用さいようされる。MPI-1のモデルは共有きょうゆうメモリを一切いっさい必要ひつようとせず、MPI-2は限定げんていてき分散ぶんさん共有きょうゆうメモリの概念がいねん導入どうにゅうしている。にもかかわらず、MPIのプログラムは共有きょうゆうメモリがた計算けいさん使用しようされることもよくある。これは共有きょうゆうメモリがたのプログラミングのモデルにたいして、MPIがたのモデルの設計せっけいほうNUMAアーキテクチャーのシステムではメモリアクセスの局所きょくしょせい参照さんしょう局所きょくしょせい)などのてんてきしているためである。

MPIはOSI参照さんしょうモデル役割やくわりにあてはめると、役割やくわりとしては5そう(セッションそう以上いじょう対応たいおうするとかんがえられるが、実際じっさい実装じっそうではソケットとTCP(トランスポートそう)を使用しようしているため、よりひろ範囲はんい(4 - 7そう)をカバーしている。

おおくのMPIの実装じっそうでは、C、C++、Fortranから直接ちょくせつぶことのできるいくつかのルーチンを中心ちゅうしんとして構成こうせいされている。そしてC#やJava、Pythonなどのほか言語げんごはCなどでつくったライブラリをかいせばMPIを利用りようできる。MPIがMPI制定せいてい以前いぜんのメッセージパッシングライブラリよりもすぐれているのは、移植いしょくせいとスピードである。MPIはほぼすべての分散ぶんさんメモリ環境かんきょう実装じっそうされているので、それらの環境かんきょうあいだではどこへでも移植いしょく可能かのうで、かくハードウェアにたいして実装じっそうされるときに最適さいてきされているので高速こうそく動作どうさする。

MPIは言語げんご独立どくりつ仕様しよう(Language Independent Specifications; LIS)を採用さいようしているため、どのような言語げんごからでもせる。最初さいしょのMPIの標準ひょうじゅんはANSI CとFortran-77とのバインディングの仕様しようとLISであった。ドラフトの仕様しようは1994ねんのスーパーコンピューティングのカンファレンスで公開こうかいされ、そのすぐに承認しょうにんされた。2008ねんのMPI-1.3は128関数かんすうから構成こうせいされ、それがMPI-1のシリーズでは最後さいごとされている。

MPIは現在げんざいではいくつかのバージョンがあり、1.3(通称つうしょうMPI-1)は静的せいてき環境かんきょうにおけるメッセージパッシングのために使用しようされ、MPI-2.2(通称つうしょうMPI-2)は並列へいれつI/Oや動的どうてきプロセス管理かんり遠隔えんかくメモリ操作そうさとうしん機能きのうふくんでおり、MPI-3.0(通称つうしょうMPI-3)はグループ通信つうしんのノンブロッキング拡張かくちょうやリモートメモリアクセスの片方向かたほうこう通信つうしん拡張かくちょうなどをふくむ。

実装じっそう

[編集へんしゅう]

初期しょきのMPI 1.xの実装じっそうとしてはMPICHがあった。MPICHはアルゴンヌ国立こくりつ研究所けんきゅうじょ(ANL)とミシシッピ州立しゅうりつ大学だいがく英語えいごばん中心ちゅうしんとするプロジェクトであった。IBMも初期しょきから実装じっそう提供ていきょうしており、1990年代ねんだい初期しょきのスーパーコンピューターのメーカーも商用しょうようにMPICHの実装じっそうや、自社じしゃ実装じっそうしたものを提供ていきょうしていた。オハイオ スーパーコンピューターセンターのLAM/MPIも初期しょき公開こうかいされていた実装じっそうひとつである。ANLは10ねん以上いじょうにわたってMPICHの開発かいはつ継続けいぞくしており、そのMPICH 2に発展はってんし、実装じっそうとしてはMPI-2.1が提供ていきょうされるにいたっている。LAM/MPIといくつかのプロジェクトはOpen MPI統合とうごうされた。

  • Open MPI
    • いくつかのMPI実装じっそう技術ぎじゅつ統合とうごうしたもので、おもには以下いかのようなよくられた3プロジェクトの技術ぎじゅつ中心ちゅうしんとなっている。
  1. FT-MPI from the テネシー大学だいがく
  2. LA-MPI from ロスアラモス国立こくりつ研究所けんきゅうじょ
  3. LAM/MPI from インディアナ大学だいがくブルーミントンこう

通常つうじょう、MPI 実装じっそう以下いかのようなラッパーコンパイラを提供ていきょうする:

  • C: mpicc
  • C++: mpic++, mpicxx
  • Fortran: mpif77, mpif90, mpifort

mpicc -show (MPICH や Intel MPI) または mpicc -showme (Open MPI) を実行じっこうすると、実際じっさい実行じっこうするコマンドを確認かくにんすることができる。

プログラムの実行じっこうには mpiexec または mpirunもちいる。ノードあいだ通信つうしんrshssh、あるいはジョブ管理かんりシステムとの連携れんけいによりおこなう。

プログラムのれい

[編集へんしゅう]

以下いかは "Hello World" プログラムをC言語げんごでMPI対応たいおうばんとしていたものである。 このれいでは "hello" メッセージをかくプロセッサに送信そうしんし、受信じゅしんしたデータをすこ改変かいへんして結果けっかをメインプロセスにかえし、それを画面がめん表示ひょうじする。

/* "Hello World" MPI テストプログラム */
#include <mpi.h>
#include <stdio.h>
#include <string.h>

#define BUFSIZE 128

int main(int argc, char *argv[]) {
  /* MPI 環境かんきょう初期しょきする。これ以降いこうぜんプロセスが使つかえる */
  MPI_Init(&argc, &argv);
  /* ぜんプロセスすう取得しゅとくする */
  int numprocs;
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  /* プロセスのランク(番号ばんごう)を取得しゅとくする */
  int myid;
  MPI_Comm_rank(MPI_COMM_WORLD, &myid);

  MPI_Status stat;
  const int TAG = 0;
  char idstr[32];
  char buff[BUFSIZE];
  /* この時点じてんぜんプログラムは同等どうとうはしっており、SPMDモデルのなかでこれらを区別くべつする場合ばあいには
     ランクで見分みわける。ただしランク0のプログラムは特別とくべつ処理しょりをしていることもある。...
   */
  if (myid == 0) {
    printf("%d: We have %d processes\n", myid, numprocs);
    for (int i = 1; i < numprocs; i++) {
      sprintf(buff, "Hello %d! ", i);
      MPI_Send(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
    }
    for (int i = 1; i < numprocs; i++) {
      MPI_Recv(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD, &stat);
      printf("%d: %s\n", myid, buff);
    }
  } else {
    /* rank 0から受信じゅしん: */
    MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
    sprintf(idstr, "Process %d ", myid);
    strncat(buff, idstr, BUFSIZE - 1);
    strncat(buff, "reporting for duty", BUFSIZE - 1);
    /* rank 0に送信そうしん: */
    MPI_Send(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD);
  }

  /*  MPI FinalizeでMPIのプログラムは終了しゅうりょうする。ここはよわ同期どうきポイント */
  MPI_Finalize();
  return 0;
}

4 MPI プロセスでプログラムを実行じっこうする(mpiexec -n 4 ./a.out)と以下いかのような結果けっかられる:

0: We have 4 processes
0: Hello 1! Process 1 reporting for duty
0: Hello 2! Process 2 reporting for duty
0: Hello 3! Process 3 reporting for duty

脚注きゃくちゅう

[編集へんしゅう]

関連かんれん

[編集へんしゅう]

Open MPI

学習がくしゅうよう図書としょ

[編集へんしゅう]
  • Marc Snir, Steve W. Otto, Steven Huss-Lederman, David Walker and Jack J. Dongarra: MPI - The Complete Reference: Volume 1, The MPI Core ,2nd Ed., The MIT Press, ISBN 978-0-262692151 (1998ねん9がつ).
  • William Gropp, Steven Huss-Lederman, Andrew Lumsdaine, Ewing Lusk, Bill Nitzberg, William Saphir, and Marc Snir: MPI - The Complete Reference, Volume 2, The MPI-2 Extensions, The MIT Press, ISBN 978-0-262571234 (1998ねん9がつ).
  • William Gropp, Ewing Lusk, and Anthony Skjellum: Using MPI, Portable Parallel Programming with the Message-Passing Interface, 3rd Ed., The MIT Press, ISBN‎ 978-0-262527392 (2014ねん11月7にち).
  • P.Pacheco:「MPI並列へいれつプログラミング」、培風館ばいふうかんISBN 978-4-563015442 (2001).
  • M. J. Quinn: Parallel Programming in C with MPI and OpenMP, McGraw-Hill (2003).
  • 片桐かたぎり孝洋たかひろ:「スパコンプログラミング入門にゅうもん 並列へいれつ処理しょりとMPIの学習がくしゅう」、東京とうきょう大学だいがく出版しゅっぱんかいISBN 978-4-130624534 (2013ねん3がつ12にち)。

外部がいぶリンク

[編集へんしゅう]