#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
なお,複数プロセッサを有するコンピュータ上ではプロセスは物理的なプロセッサに1対1に対応する.
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 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 対応する型はありません