自作クラスタ計算機:mpiによる並列計算
This is an old revision of the document!
概要
- 実際にMPIを用いたノード内およびノード間の並列計算を行います
- 事前にOpenMPIやMPICH2などのMPIライブラリを管理ノードにインストールしてください
- 例えばOpenMPIであれば次のようにインストールできます
$ sudo apt install openmpi-bin libopenmpi-dev
準備
ハードウェアの確認
事前に各ノードのCPUのコア数(物理コア数)とスレッド数(論理コア数)を確認してください
- CPU数
$ cat /proc/cpuinfo | grep "physical id"
- 出てきた数字の種類の数だけCPUがあります。0と1の2種類であれば、そのノードにはCPUが2つあります。
- CPUあたりのコア数
$ cat /proc/cpuinfo | grep "cpu cores"
- 出てきた数字がCPUあたりのコア数になります
- スレッド数
$ cat /proc/cpuinfo | grep "processor"
- 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。通常は論理コア数と物理コア数は等しいですが、Hyper-Threadingが有効の場合は論理コア数が物理コア数の2倍になります。
- Hyper-Threadingは見かけ上のコア数が2倍になる技術であり、並列計算プログラムで並列化効率が良い場合は逆に計算速度が著しく低下します。これは1つの物理コアに2つのジョブが投入されてしまうために発生します。
- スレッドごとの計算の重さのバランスが著しく悪く、1つのスレッドの計算が終わっているのに別のスレッドの計算は続いている、というような場合にのみ有効です。
- よくわからない場合は、BIOSを使ってHyper-Threadingをオフにするか、MPIでのジョブ投入時に並列数を物理コア数以下にすることが望ましいです。
SSHの導入
管理ノードと計算ノードの間の通信はSSHで行います。
- 現状のままだと管理ノードから計算ノードへ入る際にパスワードの入力が必要ですが、ジョブ投入のたびにパスワードを入力するのは現実的ではありません。
- そこでパスフレーズなしのSSH鍵を作成することで、パスワードの入力を回避します
- 管理ノードのジョブを投げるユーザーのアカウント(以下ではsugimotoとします)にログインし、SSH鍵を作成します。パスフレーズを聞かれるところでは、なにも入力せずにエンターを押します
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/sugimoto/.ssh/id_rsa): Created directory '/home/sugimoto/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/sugimoto/.ssh/id_rsa. Your public key has been saved in /home/sugimoto/.ssh/id_rsa.pub. The key fingerprint is: SHA256:ZLnV/uJ8+lml7EdU+j8sjGJdxqF6F+tyg8FrD2hP3hI sugimoto@kanri The key's randomart image is: +---[RSA 2048]----+ | | | . . .| | + . . ..| | o o . .. .| | S . + .o.| | .E B .+| | ooo@ B.o| | .++%oX.=o| | . +o@B*..| +----[SHA256]-----+
- 公開鍵を設置します
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- NFSサーバを設置しているので、管理ノードにおいてある鍵は計算ノードでも見えます
- 初回接続時に表示されるメッセージを抑制させます
$ echo "StrictHostKeyChecking no" >> ~/.ssh/config
- 権限を変更します
$ chmod 600 ~/.ssh/id_rsa $ chmod 600 ~/.ssh/authorized_keys $ chmod 700 ~/.ssh/
- 実際に計算ノードにログインできるか確かめます
$ ssh keisan11
並列計算
作業は全て管理ノードで行います
- 生成したプログラムは管理ノードのNFSサーバの機能により全ノードに配布されます
サンプルプログラム
次のコードを使って説明します
- hello.c
#include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { int rank, size, len; char name[MPI_MAX_PROCESSOR_NAME]; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Get_processor_name( name, &len ); name[len] = '\0'; printf( "Hello World! I am %d of %d from %s.\n", rank, size, name ); MPI_Finalize(); return 0; }
- プログラムのコンパイルは次のようにします
$ mpicc -o hello hello.c $ mpiicc -o hello hello.c # Intel MPIを使用する場合
- 管理ノード(4スレッド)で走らせてみます
$ mpirun -n 4 hello Hello World! I am 0 of 4 from kanri. Hello World! I am 1 of 4 from kanri. Hello World! I am 2 of 4 from kanri. Hello World! I am 3 of 4 from kanri.
参考
自作クラスタ計算機/mpiによる並列計算.1583137642.txt.gz · Last modified: 2021/06/27 21:58 (external edit)