自作クラスタ計算機: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でのジョブ投入時に並列数を物理コア数以下にすることが望ましいです。
並列計算
作業は全て管理ノードで行います
- 生成したプログラムは管理ノードのNFSサーバの機能により全ノードに配布されます
サンプルプログラム
次のコードを使って説明します
- test.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( "I am %d of %d from %s\n", rank, size, name ); MPI_Barrier( MPI_COMM_WORLD ); MPI_Finalize(); return 0; }
- プログラムのコンパイルは次のようにします
$ mpicc test.c
自作クラスタ計算機/mpiによる並列計算.1583129086.txt.gz · Last modified: 2021/06/27 21:58 (external edit)