スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)

opi-clst クラスタ構成にしたOrangePi PCでMPI環境を整える

 2016-11-22
クラスタと言えばやはりこれでしょう、MPI
 

MPIとは

Message Passing Interface(メッセージ パッシング インターフェース、MPI)とは、 並列コンピューティング利用するための標準化された規格である。
(wikipediaより)

並列実行するためのフレームワーク的なものですな。
openmpiとmpichという別々の実装があるらしいが今回はmpichを使ってみることにする。


setup (MASTER,clst-NODE)

すべてのノードで下記のパッケージをinstallしました。簡単で良いですね。
sudo apt-get install mpich2 libmpich2-dev
当初、apt-getでmpi-default-dev(←これがopenmpiらしいです)も入れていましたが、conflictの可能性があるとのことだったので、一度すべてautoremoveした後、mpich2 libmpich2-devのみ、再度installしなおしました。
たぶん入っていてもちゃんと使えば問題ないんでしょうけども、MPI環境の構築は今回初めてだったので念のため。。

環境構築はこれで終わりです。apt-getで入れるだけ。簡単です。


動作確認

MPIのhelloworldコードを下記からお借りする。

http://mpitutorial.com/tutorials/mpi-hello-world/




コンパイル

wgetで取ってきてmpiccでコンパイルすればオッケーです。
cd /mnt/USB1/tmp/mpi
mpicc.mpich2 ./mpi_hellow.c

ls
a.out


これをMASTERとclst-NODEで準備します。
clst-NODE(計算ノード)は、システム(SDカードをクローンしている)もハードウェア(OrangePi PC)も、それぞれまったく同じなので出来上がるバイナリも完全一致します。なので一つ用意してファイル共有かければ楽できます。

・・・のだが、無駄なネットワーク負荷をかけたくないのでノード個別のストレージ内にそれぞれで用意することにした。元々opi-clstは分解・再構成を前提としたクラスタとして作成しているため、各ノードの独立性を優先しました。。

◆注意◆実行する各ノードで実行ファイルを置くpathを一致させる必要があります。上記の通りnfs等で共有をかけて同じpathにマウントするか、あるいは各ノードで共通の作業ディレクトリを決めておきましょう。


設定ファイル

実行するときにノードのリストをコマンドラインで指定しても良いのですが、10数台ものIPアドレスをハンドリングするのは面倒なので、テキストファイルに記載してそれを読み込ませる方法をとります。
for NUM in 01 02 03 04 05 06 07 08 09 10 11 12 13 14
do
echo 192.168.111.1${NUM} >> ./hostlist
done
◆注意◆ここでIPアドレスでは無くホスト名を入れていると、後々エラーに見舞われました。無用な混乱を避けるためにIPアドレスを記載しておくのが得策です。


並列実行

ここまでで、実行の準備は完了しています。
あとはmpirunコマンドで実行すると各ノードで実行されたhelloworldメッセージを見ることができます。

実行時に与える -n オプションで実行ノード数を指定します。全ノードである14を入れるとちゃんと重複なく全ノードで実行されているということがわかる↓
[MASTER]% mpirun -f ./hostlist -n 14 /mnt/USB01/tmp/mpi/a.out
Hello world from processor opipc-clst01, rank 0 out of 14 processors
Hello world from processor opipc-clst02, rank 1 out of 14 processors
Hello world from processor opipc-clst03, rank 2 out of 14 processors
Hello world from processor opipc-clst06, rank 5 out of 14 processors
Hello world from processor opipc-clst09, rank 8 out of 14 processors
Hello world from processor opipc-clst08, rank 7 out of 14 processors
Hello world from processor opipc-clst04, rank 3 out of 14 processors
Hello world from processor opipc-clst13, rank 12 out of 14 processors
Hello world from processor opipc-clst07, rank 6 out of 14 processors
Hello world from processor opipc-clst05, rank 4 out of 14 processors
Hello world from processor opipc-clst10, rank 9 out of 14 processors
Hello world from processor opipc-clst12, rank 11 out of 14 processors
Hello world from processor opipc-clst11, rank 10 out of 14 processors
Hello world from processor opipc-clst14, rank 13 out of 14 processors
並列実行なのでホスト名や実行ランクは順不同になっています。


ここで -n オプションに、実際に存在するノード数よりも小さい数を入れてみると・・・指定の数だけのノードで実行されている↓
[MASTER]% mpirun -f ./hostlist -n 7 /mnt/USB01/tmp/mpi/a.out
Hello world from processor opipc-clst02, rank 1 out of 7 processors
Hello world from processor opipc-clst07, rank 6 out of 7 processors
Hello world from processor opipc-clst01, rank 0 out of 7 processors
Hello world from processor opipc-clst06, rank 5 out of 7 processors
Hello world from processor opipc-clst05, rank 4 out of 7 processors
Hello world from processor opipc-clst04, rank 3 out of 7 processors
Hello world from processor opipc-clst03, rank 2 out of 7 processors



逆に実際のノード数よりも多く指定してみると・・・いくつかのノードは重複してジョブを実行しているのがわかる↓
[MASTER]% mpirun -f ./hostlist -n 21 /mnt/USB01/tmp/mpi/a.out
Hello world from processor opipc-clst07, rank 6 out of 21 processors
Hello world from processor opipc-clst06, rank 5 out of 21 processors
Hello world from processor opipc-clst13, rank 12 out of 21 processors
Hello world from processor opipc-clst14, rank 13 out of 21 processors
Hello world from processor opipc-clst07, rank 20 out of 21 processors
Hello world from processor opipc-clst09, rank 8 out of 21 processors
Hello world from processor opipc-clst06, rank 19 out of 21 processors
Hello world from processor opipc-clst04, rank 3 out of 21 processors
Hello world from processor opipc-clst02, rank 1 out of 21 processors
Hello world from processor opipc-clst05, rank 4 out of 21 processors
Hello world from processor opipc-clst12, rank 11 out of 21 processors
Hello world from processor opipc-clst10, rank 9 out of 21 processors
Hello world from processor opipc-clst11, rank 10 out of 21 processors
Hello world from processor opipc-clst01, rank 0 out of 21 processors
Hello world from processor opipc-clst02, rank 15 out of 21 processors
Hello world from processor opipc-clst05, rank 18 out of 21 processors
Hello world from processor opipc-clst04, rank 17 out of 21 processors
Hello world from processor opipc-clst03, rank 2 out of 21 processors
Hello world from processor opipc-clst01, rank 14 out of 21 processors
Hello world from processor opipc-clst08, rank 7 out of 21 processors
Hello world from processor opipc-clst03, rank 16 out of 21 processors



各ノードのコア数を考慮して処理を割り振るには

MPIで実行する際にノードのリストに登録した数以上の並列数を指定すると、リスト内のノードに重複して処理が割り当てられるのはすでに確認しました。
このときは単に順番にジョブを割り付けているだけです。

今回はすべての計算機が4コアなので均等割り付けで特に問題ありません。 しかし、コア数の異なる計算機を混在させる場合は、ホストリストのIPアドレス末尾にコロンで区切ってコア数を書いておくと、イイカンジに考慮してくれます。

例えばclst01が1core、clst02が2core、clst03が3core、clst04が4coreだというリストを作成し、10並列、20並列のジョブを投入すると、各ノードが持っているコア数に応じてイイカンジに割り振ってくれます。
[MASTER]% cat ./hostlist_IP_coretest
192.168.111.101:1
192.168.111.102:2
192.168.111.103:3
192.168.111.104:4

[MASTER]% mpiexec -f ./hostlist_IP_coretest -np 10 /mnt/USB01/tmp/mpi/mpi_hello | sort
Hello world from processor opipc-clst01, rank 0 out of 10 processors
Hello world from processor opipc-clst02, rank 1 out of 10 processors
Hello world from processor opipc-clst02, rank 2 out of 10 processors
Hello world from processor opipc-clst03, rank 3 out of 10 processors
Hello world from processor opipc-clst03, rank 4 out of 10 processors
Hello world from processor opipc-clst03, rank 5 out of 10 processors
Hello world from processor opipc-clst04, rank 6 out of 10 processors
Hello world from processor opipc-clst04, rank 7 out of 10 processors
Hello world from processor opipc-clst04, rank 8 out of 10 processors
Hello world from processor opipc-clst04, rank 9 out of 10 processors

[MASTER]% mpiexec -f ./hostlist_IP_coretest -np 20 /mnt/USB01/tmp/mpi/mpi_hello | sort
Hello world from processor opipc-clst01, rank 0 out of 20 processors
Hello world from processor opipc-clst01, rank 10 out of 20 processors
Hello world from processor opipc-clst02, rank 1 out of 20 processors
Hello world from processor opipc-clst02, rank 11 out of 20 processors
Hello world from processor opipc-clst02, rank 12 out of 20 processors
Hello world from processor opipc-clst02, rank 2 out of 20 processors
Hello world from processor opipc-clst03, rank 13 out of 20 processors
Hello world from processor opipc-clst03, rank 14 out of 20 processors
Hello world from processor opipc-clst03, rank 15 out of 20 processors
Hello world from processor opipc-clst03, rank 3 out of 20 processors
Hello world from processor opipc-clst03, rank 4 out of 20 processors
Hello world from processor opipc-clst03, rank 5 out of 20 processors
Hello world from processor opipc-clst04, rank 16 out of 20 processors
Hello world from processor opipc-clst04, rank 17 out of 20 processors
Hello world from processor opipc-clst04, rank 18 out of 20 processors
Hello world from processor opipc-clst04, rank 19 out of 20 processors
Hello world from processor opipc-clst04, rank 6 out of 20 processors
Hello world from processor opipc-clst04, rank 7 out of 20 processors
Hello world from processor opipc-clst04, rank 8 out of 20 processors
Hello world from processor opipc-clst04, rank 9 out of 20 processors





以上でMPI環境の確認が取れました。
あとはMPIのお作法に従って、お好きなコードを書くだけで並列実行できますよ。

 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/270-870dd7da
≪ トップページへこのページの先頭へ  ≫
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。