Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> MPI

MPI(Message Passing Interface)

このページでは、MPI(http://www-unix.mcs.anl.gov/mpi/)について解説する。

MPIとは

MPIとは、複数の計算機で並列に計算させて、演算の高速化を図る手法である。1台のコンピュータでも可能ではあるが、通常は複数台のコンピュータをネットワークでつないだ構成を取る。1台の場合は、OpenMPなど別の方法も検討してみるとよい。
MPIはほかの並列か方法と比べて、大規模な並列化に向いているが、その一方で、実行するには特別な方法でプログラムを起動させてやる必要があるなど、少々敷居が高い。

OpenMPIとMPICHがあるが、どちらもメジャーなので好きな方を使えばよい。

OpenMPIのインストール

$ sudo apt-get install openmpi-bin openmpi-dev

でインストール。

そしてここを参考に、パスフレーズなしで各ノードにsshでログインできるようにしておく。

コンパイルはソースがc++の場合、mpic++を使う。

$ mpic++ mpitest.cpp -o mpitest

実行はmpirunを使う。

$ mpirun -n 40 ./mpitest

ホストを指定して実行する場合は、

$ mpirun -n 40 -host node01,node02 ./mpitest

の様に指定する。ホストファイルを作成して実行するには、

$ mpirun -n 40 -hostfile mf.txt ./mpitest

の様にする。ホストファイルの書式は

node01 slots=4
node02 slots=4
node03 slots=4
node04 slots=4
node05 slots=4

のような書式になる。slotsでは基本的に各ノードのCPU数を指定する。

ホストファイルはLFで改行するようにする。

MPICHのインストールと実行

たいていの場合、すでに大学の計算機センターなどでMPIがインストールされている環境下でMPIを実行する人が多いと思う。
とはいえ、同じコンパイラを使っていてもコンパイルおよび実行方法はそれぞれの計算機センターによって多少違っていたりするので、まずはそれぞれの計算機センターのマニュアルをまずは参照してもらいたい。

ここでは、Windowsでのインストール方法について解説する。
まずはダウンロード。ここから取ってくる(http://www-unix.mcs.anl.gov/mpi/mpich/download.html

環境変数の追加。

コンパイル方法

設定その他によってコンパイルコマンドは違うので、ここでは一例として参考にしてほしい

Cの場合は

C++の場合は

mpiicpc test.cpp -o test.out -O3

実行方法

設定その他によって実行方法は違うので、ここでは一例として参考にしてほしい

mpdを起動する。

mpdboot -n 65 -f /etc/mpd.hosts -r ssh -v

その後、

mpirun -np 10 ./test.out

キューマネージャを使う場合は、

bsub -o out.txt "mpirun -np 10 ./test.out"

MPICH2

ここからダウンロード。(http://www-unix.mcs.anl.gov/mpi/mpich2/

使い方

MPIの使い方について解説する。

何もしないMPIプログラム

初期化および、終了処理を書いただけのプログラムは下記の通り。

必要なヘッダは、mpi.h

初期化はMPI_Initで、終了処理はMPI_Finalizeで行う。すべてのMPI関数は、MPI_Init~MPI_Finalizeの間に書かれていなければならない。

#include <mpi.h>
#include <iostream>
using namespace std;

int main(int argc,char *argv[])
{
    MPI_Init(&argc,&argv);//MPIを初期化
    MPI_Finalize();//MPIの終了処理
    return 0;
}

MPIのデータ型

MPIで扱えるデータ型は、次の通り。

データの送受信(1対1)

データの送受信(1対全体)

ブロードキャスト

ブロードキャストはルートに指定したノードのデータをすべてのノードにコピーします。

MPI_Bcast(x,10000,MPI_DOUBLE,0,MPI_COMM_WORLD);

スキャタ

スキャタは、ルートに指定されたノードのデータを、各ノードに分配します。その反対がギャザー。

MPI_Scatter(x,1000,MPI_DOUBLE,y,1000,MPI_DOUBLE,0,MPI_COMM_WORLD);

ギャザー

ギャザーは各ノードのデータをルートに指定したノードに集めます。

MPI_Gather(y,1000,MPI_DOUBLE,x,1000,MPI_DOUBLE,0,MPI_COMM_WORLD);

レデュース

reduceは各種演算を行います。

デッドロックを避ける方法

並列計算

ここではMPIを使った並列計算について解説する。

関連項目


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.