MPI

ysd@KLab > MPI

テンプレート

#include "mpi.h"

int main(int argc, char* argv[])
{
  int mpirank, mpisize;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &mpisize); // MPI で使われるノード数
  MPI_Comm_rank(MPI_COMM_WORLD, &mpirank); // MPI におけるこのノードの番号
  // ここに内容を書く
  MPI_Finalize();
}

メッセージの受け渡し(基本)

// 必要っぽい変数
int dest, src;     // 送信先と送信元
char message[20];  // 送信内容
MPI_Status status; // 送信状態を得る
[渡す]
MPI_Send((void*)message, 20, MPI_CHAR, dest, 0, MPI_COMM_WORLD);
[受ける]
MPI_Recv((void*)message, 20, MPI_CHAR, src, 0, MPI_COMM_WORLD, &status);
表1.MPI_Typeと型の対応
MPI_Type
MPI_CHARchar
MPI_SHORTshort
MPI_INTint
MPI_LONGlong
MPI_UNSIGNED_CHARunsigned char
MPI_UNSIGNED_SHORTunsigned short
MPI_UNSIGNEDunsigned int
MPI_UNSIGNED_LONGunsigned long
MPI_FLOATfloat
MPI_DOUBLEdouble
MPI_LONG_DOUBLElong double
MPI_BYTE対応する型は無い
MPI_PACKED構造体(詳細は後で)
 
関数に渡す引数は順に
  1. 受け渡しをする変数群の先頭を示すポインタ(void* にキャスト)
  2. 受け渡しをする変数の数。大抵は配列の幅。
  3. 受け渡しをする変数の型。ここに入れる項目と対応する型は表1の通り。
  4. 送信先・送信元のrankを指定する。無差別に受信しようとする場合はMPI_ANY_SOURCEを入れる。指定したrankが無い場合、その関数は素通りする。
  5. タグ。メッセージを分類するときに使う。
  6. コミュニケーションする範囲を表す。MPI_COMM_WORLDでは MPI で使う範囲全部を表す。
  7. 受信専用。状態を表す。この構造体の中身は別記。

メッセージの受け渡し(1対全)

MPI_Bcast((void*)message, 20, MPI_CHAR, root, MPI_COMM_WORLD);
関数に渡す引数は順に
  1. 受け渡しをする変数群の先頭を示すポインタ(void* にキャスト)
  2. 受け渡しをする変数の数。大抵は配列の幅。
  3. 受け渡しをする変数の型。ここに入れる項目と対応する型は表1の通り。
  4. 送信元となるrootのrankを指定する。
  5. コミュニケーションする範囲を表す。

同期を取る

MPI_Barrier(MPI_COMM_WORLD);
MPI_IsendMPI_IrecvMPI_Bcast などの非同期通信を行う時などに用いる。全員足並みをそろえてヨーイドン。