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/02 18:04]
koudai [ノード間並列計算]
自作クラスタ計算機:mpiによる並列計算 [2020/03/03 16:26]
koudai [ノード内並列計算]
Line 2: Line 2:
  
   * 実際にMPIを用いたノード内およびノード間の並列計算を行います   * 実際にMPIを用いたノード内およびノード間の並列計算を行います
-  * 事前にOpenMPIMPICH2などのMPIライブラリを管理ノードにインストールしてください +  * 事前にOpenMPIMPICH2, Intel MPIなどのMPIライブラリを管理ノードにインストールしてください 
-  * 例えばOpenMPIであれば次のようにインストールできす<code>+  * OpenMPIの場合、次のようにaptで簡単にインストールできるので、特にこだわりがなければお勧めです<code>
 $ sudo apt install openmpi-bin libopenmpi-dev $ sudo apt install openmpi-bin libopenmpi-dev
 </code> </code>
 +  * **複数のMPIを一つのコンピュータに入れると、競合を起こしてMPIが動かなくなります**
  
 ====== 準備 ====== ====== 準備 ======
Line 96: Line 96:
     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 108: Line 108:
 </code> </code>
   * 試しに管理ノードで走らせてみます<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 121:
 指定した計算ノードにジョブを投げてみます。 指定した計算ノードにジョブを投げてみます。
  
-  * MPIで指定のホストに投げる場合は、オプション<nowiki>--host</nowiki>でホスト名を指定します+  * MPIで指定のホストに投げる場合は、オプション<nowiki>-hosts</nowiki>でホスト名を指定します
   * 計算ノードのkeisan11にジョブを投げる場合は次のようにします<code>   * 計算ノードのkeisan11にジョブを投げる場合は次のようにします<code>
-$ mpirun -n 24 --host keisan11 hello +$ mpirun -n -hosts keisan11 ./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アドレスでも可能です
  
  
 ===== ノード間並列計算 ===== ===== ノード間並列計算 =====
 +
 +==== 通常の使い方 ====
  
 複数の計算ノードにわたるジョブを投げてみます。 複数の計算ノードにわたるジョブを投げてみます。
  
-  * オプション<nowiki>--host</nowiki>で複数のホスト名を指定します +  * オプション<nowiki>-hosts</nowiki>で複数のホスト名を指定します 
-  * 計算ノードkeisan11keisan12にジョブを投げる場合は次のようにします<code> +  * 計算ノードkeisan11keisan12, keisan13にジョブを投げる場合は次のようにします<code> 
-$ mpirun -n 4 --host keisan11,keisan12 hello +$ mpirun -hosts keisan11,keisan12,keisan13 -n 8 -ppn 2 ./hello 
-Hello World! I am 0 of 4 from keisan11. +Hello world: rank 0 of 8 running on keisan11 
-Hello World! I am 1 of 4 from keisan11. +Hello world: rank 1 of 8 running on keisan11 
-Hello World! I am 2 of 4 from keisan12. +Hello world: rank 2 of 8 running on keisan12 
-Hello World! I am 3 of 4 from keisan12.+Hello world: rank 3 of 8 running on keisan12 
 +Hello world: rank 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でノードあたりのプロセス数を指定します 
 +  * プロセスは keisan11 -keisan11 -> keisan12 -> keisan12 -> keisan13 -> keisan13 -> keisan11 -> keisan11 -> keisan12 -> ... の順に割り振られていきます 
 + 
 +==== ホストファイルによるジョブの投入 ==== 
 + 
 +ホスト名を毎回入力したくない、計算ノードによってプロセス数を変えたいなどの場合は、ホストファイルを作成します。 
 + 
 +  * MPICHIntel MPIの場合 
 +<file - my_hosts> 
 +keisan11:
 +keisan12:4 
 +</file> 
 +  * OpenMPIの場合 
 +<file - my_hosts> 
 +keisan11 slots=2 
 +keisan12 slots=4 
 +</file> 
 + 
 +次のように実行します 
 +<code> 
 +$ mpirun -n 6 -f my_hosts ./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 of 6 running on keisan12 
 +Hello world: rank 5 of 6 running on keisan12
 </code> </code>
-    * MPIが各ノードに自動的にプロセス割り振ます +    * プロセスは keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> keisan11 -> keisan12 -> keisan12 -> keisan12 -> keisan12 -> keisan11 -> ... の順に割り振られて行きます 
-    * 並列計算におけるスレッド間の通信を考えたとき、ノード間通信ノード内通信比べて非常に遅です。できるだけ通信をしようなプログラムが要求されます。+    * Intel MPI場合<nowiki>-f</nowiki>代わり<nowiki>-machinefile</nowiki>あるは<nowiki>-machine</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