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プロジェクトの技術 ぎじゅつ が中心 ちゅうしん となっている。
FT-MPI from the テネシー大学 だいがく
LA-MPI from ロスアラモス国立 こくりつ 研究所 けんきゅうじょ
LAM/MPI from インディアナ大学 だいがく ブルーミントン校 こう
通常 つうじょう 、MPI 実装 じっそう は以下 いか のようなラッパーコンパイラを提供 ていきょう する:
C : mpicc
C++ : mpic++
, mpicxx
Fortran : mpif77
, mpif90
, mpifort
mpicc -show
(MPICH や Intel MPI) または mpicc -showme
(Open MPI ) を実行 じっこう すると、実際 じっさい に実行 じっこう するコマンドを確認 かくにん することができる。
プログラムの実行 じっこう には mpiexec
または mpirun
を用 もち いる。ノード間 あいだ 通信 つうしん は rsh や ssh 、あるいはジョブ管理 かんり システム との連携 れんけい により行 おこな う。
以下 いか は "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日 にち )。