「Message Passing Interface」の版間の差分

m (OpenMPの実装の紹介文を追加)
 
== 実装 ==
初期のMPI 1.xの実装としてはMPICHがあった。MPICHはArgonne National Laboratory (ANL)と
Mississippi State Universityを中心とするプロジェクトであった。IBMも初期から
実装を提供しており、1990年代初期のスーパーコンピューターのメーカーも
商用にMPICHの実装や、自社の実装したものを提供していた。オハイオ スーパーコンピューターセンターの
LAM/MPIも初期に公開されていた実装の一つである。ANLは10年以上にわたってMPICHの開発を
継続しており、その後MPICH 2に発展し、実装としてはMPI-2.1が提供されるに至っている。
LAM/MPIといくつかのプロジェクトはOpenMPIに統合された。
 
*[http://www.open-mpi.org/ Open MPI]
**いくつかのMPI実装の技術を統合したもので、主には以下のようなよく知られた3プロジェクトの技術が中心となっている。
*[http://mvapich.cse.ohio-state.edu/index.shtml MVAPICH]
*[http://www.microsoft.com/japan/technet/WindowsServer/library/4cb68e33-024b-4677-af36-28a1ebe9368f.mspx MS MPI]
 
==プログラムの例==
以下は "Hello World" プログラムを C言語でMPI対応版として書いたものである。
この例では"hello" メッセージを書くプロセッサに送信し、受信したデータを少し改変して結果をメインプロセスに
返し、それを画面に表示する。
 
<source lang="c">
/*
"Hello World" MPI Test Program
*/
#include <mpi.h>
#include <stdio.h>
#include <string.h>
 
#define BUFSIZE 128
#define TAG 0
 
int main(int argc, char *argv[])
{
char idstr[32];
char buff[BUFSIZE];
int numprocs;
int myid;
int i;
MPI_Status stat;
/* MPI programs start with MPI_Init; all 'N' processes exist thereafter */
MPI_Init(&argc,&argv);
/* find out how big the SPMD world is */
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
/* and this processes' rank is */
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
 
/* At this point, all programs are running equivalently, the rank
distinguishes the roles of the programs in the SPMD model, with
rank 0 often used specially... */
if(myid == 0)
{
printf("%d: We have %d processors\n", myid, numprocs);
for(i=1;i<numprocs;i++)
{
sprintf(buff, "Hello %d! ", i);
MPI_Send(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
}
for(i=1;i<numprocs;i++)
{
MPI_Recv(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD, &stat);
printf("%d: %s\n", myid, buff);
}
}
else
{
/* receive from rank 0: */
MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
sprintf(idstr, "Processor %d ", myid);
strncat(buff, idstr, BUFSIZE-1);
strncat(buff, "reporting for duty", BUFSIZE-1);
/* send to rank 0: */
MPI_Send(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD);
}
 
/* MPI programs end with MPI Finalize; this is a weak synchronization point */
MPI_Finalize();
return 0;
}
</source>
 
2プロセッサを使用してプログラムを実行すると以下のような結果が得られる。<ref>OpenMPIで実行する場合は <code>gcc -g -v -I/usr/lib/openmpi/include/ -L/usr/lib/openmpi/include/ wiki_mpi_example.c -lmpi</code> のようにコンパイルして <code>mpirun -np 2 ./a.out</code>として実行する。</ref>
<pre>
0: We have 2 processors
0: Hello 1! Processor 1 reporting for duty
 
</pre>
 
== 外部リンク ==
403

回編集