目次 >> MPI
このページでは、MPI(http://www-unix.mcs.anl.gov/mpi/)について解説する。
MPIとは、複数の計算機で並列に計算させて、演算の高速化を図る手法である。1台のコンピュータでも可能ではあるが、通常は複数台のコンピュータをネットワークでつないだ構成を取る。1台の場合は、OpenMPなど別の方法も検討してみるとよい。
MPIはほかの並列か方法と比べて、大規模な並列化に向いているが、その一方で、実行するには特別な方法でプログラムを起動させてやる必要があるなど、少々敷居が高い。
OpenMPIとMPICHがあるが、どちらもメジャーなので好きな方を使えばよい。
$ 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で改行するようにする。
たいていの場合、すでに大学の計算機センターなどで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"
ここからダウンロード。(http://www-unix.mcs.anl.gov/mpi/mpich2/)
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_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を使った並列計算について解説する。
最終更新日