User Tools

Site Tools


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

Differences

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

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
自作クラスタ計算機:mpiによる並列計算 [2020/03/02 21:56]
koudai [通常の使い方]
自作クラスタ計算機:mpiによる並列計算 [2020/09/30 21:16]
koudai [概要]
Line 2: Line 2:
  
   * 実際にMPIを用いたノード内およびノード間の並列計算を行います   * 実際にMPIを用いたノード内およびノード間の並列計算を行います
-  * 事前にOpenMPI, MPICH2, Intel MPIなどのMPIライブラリを管理ノードにインストールしてください +  * 事前にOpenMPI, MPICH2, Intel MPIなどのMPIライブラリを管理ノードにインストールしてください -> [[OpenMPI]]
-  * OpenMPIの場合、次のようにaptで簡単にインストールできるので、特にこだわりがなければお勧めです<code> +
-$ sudo apt install openmpi-bin libopenmpi-dev +
-</code> +
-  * **複数のMPIを一つのコンピュータに入れると、競合を起こして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 96: Line 94:
     name[len] = '\0';     name[len] = '\0';
          
-    printf( "Hello World! I am %d of %d from %s.\n", rank, size, name );+    printf( "Hello world: rank %d of %d running on %s\n", rank, size, name );
  
     MPI_Finalize();     MPI_Finalize();
Line 109: Line 107:
   * 試しに管理ノードで走らせてみます<code>   * 試しに管理ノードで走らせてみます<code>
 $ 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
 </code> </code>
  
Line 121: Line 119:
 指定した計算ノードにジョブを投げてみます。 指定した計算ノードにジョブを投げてみます。
  
-  * MPIで指定のホストに投げる場合は、オプション<nowiki>--host</nowiki>でホスト名を指定します+  * MPIで指定のホストに投げる場合は、オプション<nowiki>-hosts</nowiki>でホスト名を指定します
   * 計算ノードのkeisan11にジョブを投げる場合は次のようにします<code>   * 計算ノードのkeisan11にジョブを投げる場合は次のようにします<code>
-$ mpirun -n 24 --host keisan11 ./hello +$ mpirun -hosts keisan11 -n 8 ./hello 
-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
 </code> </code>
 +    * ホスト名の代わりにIPアドレスでも可能です
  
  
Line 138: Line 140:
 複数の計算ノードにわたるジョブを投げてみます。 複数の計算ノードにわたるジョブを投げてみます。
  
-  * オプション<nowiki>--host</nowiki>で複数のホスト名を指定します 
   * 計算ノードkeisan11, keisan12, keisan13にジョブを投げる場合は次のようにします<code>   * 計算ノードkeisan11, keisan12, keisan13にジョブを投げる場合は次のようにします<code>
-$ mpirun -n 72 --host keisan11,keisan12,keisan13 ./hello +$ mpirun -hosts keisan11,keisan12,keisan13 -n 8 -ppn 2 ./hello 
-Hello World! I am 0 of 72 from keisan11. +Hello world: rank 0 of 8 running on keisan11 
-Hello World! I am 1 of 72 from keisan12. +Hello world: rank 1 of 8 running on keisan11 
-Hello World! I am 2 of 72 from keisan13. +Hello world: rank 2 of 8 running on keisan12 
-Hello World! I am 3 of 72 from keisan11. +Hello world: rank 3 of 8 running on keisan12 
-Hello World! I am 4 of 72 from keisan12. +Hello world: rank 4 of 8 running on keisan13 
-Hello World! I am 5 of 72 from 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> </code>
 +  * オプション-ppnでノードあたりのプロセス数を指定します
 +  * プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan13 -> keisan13 -> keisan11 -> keisan11 -> keisan12 -> ... の順に割り振られていきます
  
 ==== ホストファイルによるジョブの投入 ==== ==== ホストファイルによるジョブの投入 ====
  
-例えば計算ノードによって性能に差がある場合など、ノードごとのプロセス数を自分で管理したい場合はホストファイルを作成します。+ホスト名を毎回入力したくない、計算ノードによってプロセス数を変えたいなどの場合はホストファイルを作成します。
  
-  * MPICH, Intel MPIの場合 
-<file - my_hosts> 
-keisan11:2 
-keisan12:3 
-</file> 
   * OpenMPIの場合   * OpenMPIの場合
-<file - my_hosts>+<file - hosts.txt>
 keisan11 slots=2 keisan11 slots=2
-keisan12 slots=3+keisan12 slots=
 +</file> 
 +  * MPICH, Intel MPIの場合 
 +<file - hosts.txt> 
 +keisan11:
 +keisan12:4
 </file> </file>
  
 次のように実行します 次のように実行します
 <code> <code>
-$ mpirun -n 6 --hostfile my_hosts ./hello +$ mpirun -n 6 -f hosts.txt ./hello 
-Hello World! I am 0 of 6 from keisan11. +Hello world: rank 0 of 6 running on keisan11 
-Hello World! I am 1 of 6 from keisan11. +Hello world: rank 1 of 6 running on keisan11 
-Hello World! I am 2 of 6 from keisan12. +Hello world: rank 2 of 6 running on keisan12 
-Hello World! I am 3 of 6 from keisan12. +Hello world: rank 3 of 6 running on keisan12 
-Hello World! I am 4 of 6 from keisan12. +Hello world: rank 4 of 6 running on keisan12 
-Hello World! I am 5 of 6 from keisan11.+Hello world: rank 5 of 6 running on keisan12
 </code> </code>
-    * プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> keisan11 -> 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>を使用してください 
 +      * 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