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/02 17:57] koudai [ノード間並列計算] |
自作クラスタ計算機:mpiによる並列計算 [2023/12/26 23:26] koudai [ハードウェアの確認] |
||
---|---|---|---|
Line 2: | Line 2: | ||
* 実際にMPIを用いたノード内およびノード間の並列計算を行います | * 実際にMPIを用いたノード内およびノード間の並列計算を行います | ||
- | * 事前にOpenMPIやMPICH2などのMPIライブラリを管理ノードにインストールしてください | + | * 事前にOpenMPI, MPICH2, Intel MPIなどのMPIライブラリを管理ノードでビルドし、NFSによって計算ノードと共有してください |
- | * 例えばOpenMPIであれば次のようにインストールできます< | + | * / |
- | $ sudo apt install openmpi-bin libopenmpi-dev | + | |
- | </ | + | |
====== 準備 ====== | ====== 準備 ====== | ||
Line 19: | Line 16: | ||
* 出てきた数字がCPUあたりのコア数になります | * 出てきた数字がCPUあたりのコア数になります | ||
* スレッド数< | * スレッド数< | ||
- | * 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。通常は論理コア数と物理コア数は等しいですが、Hyper-Threadingが有効の場合は論理コア数が物理コア数の2倍になります。 | + | * 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。通常は論理コア数と物理コア数は等しいですが、Intel Hyper-Threadingが有効の場合は論理コア数が物理コア数の2倍になります。 |
- | * Hyper-Threadingは見かけ上のコア数が2倍になる技術であり、並列計算プログラムで並列化効率が良い場合は逆に計算速度が著しく低下します。これは1つの物理コアに2つのジョブが投入されてしまうために発生します。 | + | * Hyper-Threadingは見かけ上のコア数が2倍になる技術です |
- | * スレッドごとの計算の重さのバランスが著しく悪く、1つのスレッドの計算が終わっているのに別のスレッドの計算は続いている、というような場合にのみ有効です。 | + | * OpenMPやMPIを使った並列計算をするときにはほとんどご利益がない(遅くなることもある)という噂があります |
- | * よくわからない場合は、BIOSを使ってHyper-Threadingをオフにするか、MPIでのジョブ投入時に並列数を物理コア数以下にすることが望ましいです。 | + | * https:// |
+ | * BIOSからHyper-Threadingをオフにすることもできます | ||
Line 31: | Line 29: | ||
* そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します | * そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します | ||
- | - 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは、**なにも入力せずに**エンターを押します< | + | - 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは**なにも入力せずに**エンターを押します< |
$ ssh-keygen -t rsa | $ ssh-keygen -t rsa | ||
Generating public/ | Generating public/ | ||
Line 74: | Line 72: | ||
作業は全て管理ノードで行います | 作業は全て管理ノードで行います | ||
- | * 生成したプログラムは管理ノードのNFSサーバの機能により全ノードに配布されます | + | * mpirunを実行するノード(管理ノード)とプログラムを動かすノード(計算ノード)が異なる場合は、mpirunを実行したノードと同じ名前のディレクトリに移動してプログラムを動かす仕組みになっています |
+ | * 今回生成したクラスタマシンでは、NFSサーバの機能により、管理ノードにあるプログラムが全ノードに配布されます | ||
Line 81: | Line 81: | ||
次のコードを使って説明します | 次のコードを使って説明します | ||
- | < | + | < |
#include < | #include < | ||
#include " | #include " | ||
Line 96: | Line 96: | ||
name[len] = ' | name[len] = ' | ||
| | ||
- | printf( " | + | printf( " |
MPI_Finalize(); | MPI_Finalize(); | ||
Line 107: | Line 107: | ||
$ mpiicc -o hello hello.c | $ mpiicc -o hello hello.c | ||
</ | </ | ||
- | * 管理ノード(4スレッド)で走らせてみます< | + | * 試しに管理ノードで走らせてみます< |
- | $ mpirun -n 4 hello | + | $ mpirun -n 4 ./hello |
- | Hello World! I am 0 of 4 from kanri. | + | Hello world: rank 0 of 4 running on kanri |
- | Hello World! I am 1 of 4 from kanri. | + | Hello world: rank 1 of 4 running on kanri |
- | Hello World! I am 2 of 4 from kanri. | + | Hello world: rank 2 of 4 running on kanri |
- | Hello World! I am 3 of 4 from kanri. | + | Hello world: rank 3 of 4 running on kanri |
</ | </ | ||
Line 121: | Line 121: | ||
指定した計算ノードにジョブを投げてみます。 | 指定した計算ノードにジョブを投げてみます。 | ||
- | * MPIで指定のホストに投げる場合は、オプション--hostでホスト名を指定します | + | * MPIで指定のホストに投げる場合は、オプション< |
- | * 計算ノードkeisan11にジョブを投げる場合は次のようにします< | + | * 計算ノードのkeisan11にジョブを投げる場合は次のようにします< |
- | $ mpirun -n 24 --host | + | $ mpirun -hosts keisan11 |
- | Hello World! I am 0 of 24 from keisan11. | + | Hello world: rank 0 of 8 running on keisan11 |
- | Hello World! I am 1 of 24 from keisan11. | + | Hello world: rank 1 of 8 running on keisan11 |
- | Hello World! I am 2 of 24 from keisan11. | + | Hello world: rank 2 of 8 running on keisan11 |
- | Hello World! I am 3 of 24 from keisan11. | + | Hello world: rank 3 of 8 running on keisan11 |
- | (以下略) | + | Hello world: rank 4 of 8 running on keisan11 |
+ | Hello world: rank 5 of 8 running on keisan11 | ||
+ | Hello world: rank 6 of 8 running on keisan11 | ||
+ | Hello world: rank 7 of 8 running on keisan11 | ||
</ | </ | ||
+ | * ホスト名の代わりにIPアドレスでも可能です | ||
===== ノード間並列計算 ===== | ===== ノード間並列計算 ===== | ||
+ | |||
+ | ==== 通常の使い方 ==== | ||
複数の計算ノードにわたるジョブを投げてみます。 | 複数の計算ノードにわたるジョブを投げてみます。 | ||
- | * オプション<nowiki>--host</nowiki>で複数のホスト名を指定します | + | * 計算ノードkeisan11, |
- | * 計算ノードkeisan11とkeisan12にジョブを投げる場合は次のようにします< | + | $ mpirun |
- | $ mpirun -n 4 --host keisan11, | + | Hello world: rank 0 of 8 running on keisan11 |
- | Hello World! I am 0 of 4 from keisan11. | + | Hello world: rank 1 of 8 running on keisan11 |
- | Hello World! I am 1 of 4 from keisan11. | + | Hello world: rank 2 of 8 running on keisan12 |
- | Hello World! I am 2 of 4 from keisan12. | + | Hello world: rank 3 of 8 running on keisan12 |
- | Hello World! I am 3 of 4 from keisan12. | + | Hello world: rank 4 of 8 running on keisan13 |
+ | Hello world: rank 5 of 8 running on keisan13 | ||
+ | Hello world: rank 6 of 8 running on keisan11 | ||
+ | Hello world: rank 7 of 8 running on keisan11 | ||
+ | </code> | ||
+ | * オプション-ppnでノードあたりのプロセス数を指定します | ||
+ | * プロセスは | ||
+ | |||
+ | ==== ホストファイルによるジョブの投入 ==== | ||
+ | |||
+ | ホスト名を毎回入力したくない、計算ノードによってプロセス数を変えたいなどの場合は、ホストファイルを作成します。 | ||
+ | |||
+ | * OpenMPIの場合 | ||
+ | <file - hosts.txt> | ||
+ | keisan11 slots=2 | ||
+ | keisan12 slots=4 | ||
+ | </ | ||
+ | * MPICH, Intel MPIの場合 | ||
+ | <file - hosts.txt> | ||
+ | keisan11: | ||
+ | keisan12: | ||
+ | </ | ||
+ | |||
+ | 次のように実行します | ||
+ | < | ||
+ | $ mpirun -n 6 -f hosts.txt ./hello | ||
+ | Hello world: rank 0 of 6 running on keisan11 | ||
+ | Hello world: rank 1 of 6 running on keisan11 | ||
+ | Hello world: rank 2 of 6 running on keisan12 | ||
+ | Hello world: rank 3 of 6 running on keisan12 | ||
+ | Hello world: rank 4 of 6 running on keisan12 | ||
+ | Hello world: rank 5 of 6 running on keisan12 | ||
</ | </ | ||
- | * MPIがプロセス数に応じて各ノードにスレッドを割り振ります | + | * プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> ... の順に割り振られて行きます |
+ | * Intel MPIの場合は< | ||
+ | * https:// | ||
====== 参考 ====== | ====== 参考 ====== |