This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
自作クラスタ計算機:mpiによる並列計算 [2020/03/03 15:55] koudai [通常の使い方] |
自作クラスタ計算機:mpiによる並列計算 [2020/03/03 17:06] koudai [ホストファイルによるジョブの投入] |
||
---|---|---|---|
Line 3: | Line 3: | ||
* 実際にMPIを用いたノード内およびノード間の並列計算を行います | * 実際にMPIを用いたノード内およびノード間の並列計算を行います | ||
* 事前にOpenMPI, | * 事前にOpenMPI, | ||
- | * OpenMPIの場合、次のようにaptで簡単にインストールできるので、特にこだわりがなければお勧めです< | + | * Ubuntuではaptを使えばOpenMPIを簡単にインストールできるので、特にこだわりがなければお勧めです< |
$ sudo apt install openmpi-bin libopenmpi-dev | $ sudo apt install openmpi-bin libopenmpi-dev | ||
</ | </ | ||
Line 31: | Line 31: | ||
* そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します | * そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します | ||
- | - 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは、**なにも入力せずに**エンターを押します< | + | - 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは**なにも入力せずに**エンターを押します< |
$ ssh-keygen -t rsa | $ ssh-keygen -t rsa | ||
Generating public/ | Generating public/ | ||
Line 74: | Line 74: | ||
作業は全て管理ノードで行います | 作業は全て管理ノードで行います | ||
- | * 生成したプログラムは管理ノードのNFSサーバの機能により全ノードに配布されます | + | * mpirunを実行するノード(管理ノード)とプログラムを動かすノード(計算ノード)が異なる場合は、mpirunを実行したノードと同じ名前のディレクトリに移動してプログラムを動かす仕組みになっています |
+ | * 今回生成したクラスタマシンでは、NFSサーバの機能により、管理ノードにあるプログラムが全ノードに配布されます | ||
Line 123: | Line 125: | ||
* MPIで指定のホストに投げる場合は、オプション< | * MPIで指定のホストに投げる場合は、オプション< | ||
* 計算ノードのkeisan11にジョブを投げる場合は次のようにします< | * 計算ノードのkeisan11にジョブを投げる場合は次のようにします< | ||
- | $ mpirun | + | $ mpirun -hosts keisan11 |
Hello world: rank 0 of 8 running on keisan11 | Hello world: rank 0 of 8 running on keisan11 | ||
Hello world: rank 1 of 8 running on keisan11 | Hello world: rank 1 of 8 running on keisan11 | ||
Line 133: | Line 135: | ||
Hello world: rank 7 of 8 running on keisan11 | Hello world: rank 7 of 8 running on keisan11 | ||
</ | </ | ||
+ | * ホスト名の代わりにIPアドレスでも可能です | ||
Line 141: | Line 144: | ||
複数の計算ノードにわたるジョブを投げてみます。 | 複数の計算ノードにわたるジョブを投げてみます。 | ||
- | * オプション< | ||
* 計算ノードkeisan11, | * 計算ノードkeisan11, | ||
$ mpirun -hosts keisan11, | $ mpirun -hosts keisan11, | ||
Line 153: | Line 155: | ||
Hello world: rank 7 of 8 running on keisan11 | Hello world: rank 7 of 8 running on keisan11 | ||
</ | </ | ||
- | | + | * オプション-ppnでノードあたりのプロセス数を指定します |
- | | + | |
* プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan13 -> keisan13 -> keisan11 -> keisan11 -> keisan12 -> ... の順に割り振られていきます | * プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan13 -> keisan13 -> keisan11 -> keisan11 -> keisan12 -> ... の順に割り振られていきます | ||
==== ホストファイルによるジョブの投入 ==== | ==== ホストファイルによるジョブの投入 ==== | ||
- | 例えば計算ノードによってコア数が異なる場合など、ノードごとのプロセス数を自分で管理したい場合はホストファイルを作成します。 | + | ホスト名を毎回入力したくない、計算ノードによってプロセス数を変えたいなどの場合は、ホストファイルを作成します。 |
- | * MPICH, Intel MPIの場合 | ||
- | <file - my_hosts> | ||
- | keisan11:2 | ||
- | keisan12:4 | ||
- | </ | ||
* OpenMPIの場合 | * OpenMPIの場合 | ||
- | <file - my_hosts> | + | <file - hosts.txt> |
keisan11 slots=2 | keisan11 slots=2 | ||
keisan12 slots=4 | keisan12 slots=4 | ||
+ | </ | ||
+ | * MPICH, Intel MPIの場合 | ||
+ | <file - hosts.txt> | ||
+ | keisan11:2 | ||
+ | keisan12:4 | ||
</ | </ | ||
次のように実行します | 次のように実行します | ||
< | < | ||
- | $ mpirun -n 6 -f my_hosts | + | $ mpirun -n 6 -f hosts.txt |
Hello world: rank 0 of 6 running on keisan11 | Hello world: rank 0 of 6 running on keisan11 | ||
Hello world: rank 1 of 6 running on keisan11 | Hello world: rank 1 of 6 running on keisan11 | ||
Line 183: | Line 184: | ||
</ | </ | ||
* プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> ... の順に割り振られて行きます | * プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> ... の順に割り振られて行きます | ||
- | * Intel MPIの場合は< | + | * Intel MPIの場合は< |
* https:// | * https:// | ||