Hello World: MPIプログラム入門

プログラム: hello.c

#include "mpi.h"
main( argc, argv )
int argc;
char **argv;
{
    char message[20];
    int myrank;
    MPI_Status status;
    MPI_Init( &argc, &argv );
    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
    if (myrank == 0)
      {
        strcpy(message,"Hello, there");
        MPI_Send(message, strlen(message)+1, MPI_CHAR, 1, 99, MPI_COMM_WORLD);
        printf("rank%d sent: message\n", myrank, message);
      }
    else
      {
        MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
        printf("rank%d received: %s\n", myrank, message);
      }
    MPI_Finalize();
  }

コンパイルと実行

   % cc -64 hello.c -lmpi
   % mpirun -np 2 ./a.out

プロセスとプロセッサ

MPIの場合,「同一のプログラム」(上記の場合,a.out)が複数のプロセス(-npで指定)上で 実行される.したがって,プロセスごとに異なるコード部分を実行させるためには,プロセスIDに相当する ランクrankを使用する.ルートプロセスはランク0,他は1から始まるランク数を持つ.

なお,複数プロセッサを有するコンピュータ上ではプロセスは物理的なプロセッサに1対1に対応する.

プログラム制御に関するMPI関数

int MPI_Init(int *argc, char ***argv)
    MPIの実行環境の初期化を行う。
    argc      コマンド行の引数の数
    argv      コマンド行の引数

int MPI_Comm_size(MPI_Comm comm, int *size)
    通信を行うグループのサイズを決める。
    comm      通信を行うグループの指定
    size      グループ内のタスクの数を受け取る

int MPI_Comm_rank(MPI_Comm comm,int *rank)
    通信を行うグループのプロセスにタスク番号を与える。
    comm      通信を行うグループの指定。
    rank      commの中でのタスク番号を受け取る(0,1,2,..)

int MP_Finalize(void)
    MPIの実行環境を終了する。

通信ライブラリ

int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest,
            int tag, MPI_Comm comm)
    送信関数
    buf       送信データバッファ
    count     送信データの個数
    datatype  データタイプ
    dest      メッセージの送信先を指定
    tag       メッセージタグ
    comm      通信を行うグループの指定

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,
            int tag, MPI_Comm comm, MPI_Status *status)
    受信関数
    buf       受信データバッファ
    count     受信データの個数
    datatype  データタイプ
    source    メッセージの送信元のタスク番号を指定
              MPI_ANY_SOURCEで任意の送信元を指定
    tag       メッセージタグ
              MPI_ANY_TAGで任意のタグを指定
    comm      通信を行うグループの指定
    status    構造体MPI_Statusで受信状況を返す
              送信元、タグ、メッセージの大きさなど

MPIデータタイプ

MPI Datatype     C Datatype
---------------------------
MPI_CHAR           char  
MPI_SHORT          short  
MPI_INT            int  
MPI_LONG           long  
MPI_UNSIGNED_CHAR  unsigned char  
MPI_UNSIGNED_SHORT unsinged short  
MPI_UNSIGNED       unsinged int  
MPI_UNSIGNED_LONG  unsinged long  
MPI_FLOAT          float  
MPI_DOUBLE         double  
MPI_LONG_DOUBLE    long double  
MPI_BYTE           対応する型はありません  
MPI_PACKED         対応する型はありません