User Tools

Site Tools


自作クラスタ計算機:mpiによる並列計算

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
自作クラスタ計算機:mpiによる並列計算 [2020/03/03 16:03]
koudai [通常の使い方]
自作クラスタ計算機:mpiによる並列計算 [2023/12/26 23:06]
koudai [ハードウェアの確認]
Line 2: Line 2:
  
   * 実際にMPIを用いたノード内およびノード間の並列計算を行います   * 実際にMPIを用いたノード内およびノード間の並列計算を行います
-  * 事前にOpenMPI, MPICH2, Intel MPIなどのMPIライブラリを管理ノードにインストしてください +  * 事前にOpenMPI, MPICH2, Intel MPIなどのMPIライブラリを管理ノードでビルドし、NFSよって計算ノドと共有してください -> [[数値計算ライブラリ:OpenMPI]] 
-  * OpenMPIの場合、次のようにaptで簡単にインストールできるので特にこだわりがなければお勧めす<code> +  * /homeディレクリはNFSサバによって管理ノードと計算ノード共有さているとします
-$ sudo apt install openmpi-bin libopenmpi-dev +
-</code> +
-  * **複数のMPIを一つのコンピュータに入れると、競合を起こてMPIが動かなくなります**+
  
 ====== 準備 ====== ====== 準備 ======
Line 19: Line 16:
     * 出てきた数字がCPUあたりのコア数になります      * 出てきた数字がCPUあたりのコア数になります 
   * スレッド数<code>$ cat /proc/cpuinfo | grep "processor"</code>   * スレッド数<code>$ cat /proc/cpuinfo | grep "processor"</code>
-    * 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。通常は論理コア数と物理コア数は等しいですが、Hyper-Threadingが有効の場合は論理コア数が物理コア数の2倍になります。  +    * 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。通常は論理コア数と物理コア数は等しいですが、Intel Hyper-Threadingが有効の場合は論理コア数が物理コア数の2倍になります。  
-      * Hyper-Threadingは見かけ上のコア数が2倍になる技術であり、並列計算プログラムで並列化効率が良い場合は逆に計算速度が著しく低下しま。これは1つの物理コアに2つのジョブが投入されてしまうために発生します。 +      * Hyper-Threadingは見かけ上のコア数が2倍になる技術です 
-      * スレッドごとの計算の重さのバランスが著しく悪く、1つのスレッドの計算が終わっているのに別のスレッドの計算は続いている、というような場合にのみ有効です。 +      * BIOSからHyper-Threadingをオフにすることもできます
-      * よくわからない場合は、BIOSを使ってHyper-Threadingをオフにするか、MPIでのジョブ投入時に並列数を物理コア数以下にすることが望しいで+
  
  
Line 31: Line 27:
   * そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します   * そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します
  
-  - 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは**なにも入力せずに**エンターを押します<code>+  - 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは**なにも入力せずに**エンターを押します<code>
 $ ssh-keygen -t rsa $ ssh-keygen -t rsa
 Generating public/private rsa key pair. Generating public/private rsa key pair.
Line 74: Line 70:
  
 作業は全て管理ノードで行います 作業は全て管理ノードで行います
-  * 生成したプログラムは管理ノードのNFSサーバの機能により全ノードに配布されます+  * mpirunを実行するノード(管理ノード)とプログラムを動かすノード(計算ノード)が異なる場合、mpirunを実行したノードと同じ名前ディレクトリに移動してプログラムを動かす仕組みになっています 
 +  * 今回生成したクラスタマシンでは、NFSサーバの機能により、管理ノードにあるプログラムが全ノードに配布されます 
  
  
Line 81: Line 79:
 次のコードを使って説明します 次のコードを使って説明します
  
-<file hello.c>+<file hello.c>
 #include <stdio.h> #include <stdio.h>
 #include "mpi.h" #include "mpi.h"
Line 123: Line 121:
   * MPIで指定のホストに投げる場合は、オプション<nowiki>-hosts</nowiki>でホスト名を指定します   * MPIで指定のホストに投げる場合は、オプション<nowiki>-hosts</nowiki>でホスト名を指定します
   * 計算ノードのkeisan11にジョブを投げる場合は次のようにします<code>   * 計算ノードのkeisan11にジョブを投げる場合は次のようにします<code>
-$ mpirun -n 8 -hosts keisan11 ./hello+$ mpirun -hosts keisan11 -n 8 ./hello
 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 131:
 Hello world: rank 7 of 8 running on keisan11 Hello world: rank 7 of 8 running on keisan11
 </code> </code>
 +    * ホスト名の代わりにIPアドレスでも可能です
  
  
Line 141: Line 140:
 複数の計算ノードにわたるジョブを投げてみます。 複数の計算ノードにわたるジョブを投げてみます。
  
-  * オプション<nowiki>-hosts</nowiki>で複数のホスト名を指定します 
   * 計算ノードkeisan11, keisan12, keisan13にジョブを投げる場合は次のようにします<code>   * 計算ノードkeisan11, keisan12, keisan13にジョブを投げる場合は次のようにします<code>
 $ mpirun -hosts keisan11,keisan12,keisan13 -n 8 -ppn 2 ./hello $ mpirun -hosts keisan11,keisan12,keisan13 -n 8 -ppn 2 ./hello
Line 158: Line 156:
 ==== ホストファイルによるジョブの投入 ==== ==== ホストファイルによるジョブの投入 ====
  
-例えば計算ノードによってコア数が異なる場合など、ノードごとのプロセス数を自分で管理したい場合はホストファイルを作成します。+ホスト名を毎回入力したくない、計算ノードによってプロセス数を変えたいなどの場合はホストファイルを作成します。
  
-  * MPICH, Intel MPIの場合 
-<file - my_hosts> 
-keisan11:2 
-keisan12:4 
-</file> 
   * OpenMPIの場合   * OpenMPIの場合
-<file - my_hosts>+<file - hosts.txt>
 keisan11 slots=2 keisan11 slots=2
 keisan12 slots=4 keisan12 slots=4
 +</file>
 +  * MPICH, Intel MPIの場合
 +<file - hosts.txt>
 +keisan11:2
 +keisan12:4
 </file> </file>
  
 次のように実行します 次のように実行します
 <code> <code>
-$ mpirun -n 6 -f my_hosts ./hello+$ mpirun -n 6 -f hosts.txt ./hello
 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 182: Line 180:
 </code> </code>
     * プロセスは 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の場合は<nowiki>-f</nowiki>の代わりに<nowiki>-machinefile</nowiki>あるいは<nowiki>-machine</nowiki>を使用してください+    * Intel MPIの場合は<nowiki>-f</nowiki>の代わりに<nowiki>-machinefile</nowiki>を使用してください
       * https://software.intel.com/en-us/articles/controlling-process-placement-with-the-intel-mpi-library        * https://software.intel.com/en-us/articles/controlling-process-placement-with-the-intel-mpi-library 
  
自作クラスタ計算機/mpiによる並列計算.txt · Last modified: 2023/12/26 23:43 by koudai