This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
自作クラスタ計算機:mpiによる並列計算 [2020/03/02 14:56] koudai [準備] |
自作クラスタ計算機:mpiによる並列計算 [2020/03/02 16:30] koudai [サンプルプログラム] |
||
---|---|---|---|
Line 10: | Line 10: | ||
====== 準備 ====== | ====== 準備 ====== | ||
- | 事前に各ノードのCPUのコア数とスレッド数を確認してください | + | 事前に各ノードのCPUのコア数(物理コア数)とスレッド数(論理コア数)を確認してください |
* CPU数< | * CPU数< | ||
* 出てきた数字の種類の数だけCPUがあります。0と1の2種類であれば、そのノードにはCPUが2つあります。 | * 出てきた数字の種類の数だけCPUがあります。0と1の2種類であれば、そのノードにはCPUが2つあります。 | ||
* CPUあたりのコア数< | * CPUあたりのコア数< | ||
- | * 出てきた数字がCPUあたりの物理コア数になります | + | * 出てきた数字がCPUあたりのコア数になります |
- | * スレッド数(論理コア数)< | + | * スレッド数< |
- | * 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。Hyper-Threadingが有効の場合、コア数は物理コア数の2倍になります。 | + | * 表示される行数が スレッド数 = CPU数 × CPUあたりのコア数 に対応します。通常は論理コア数と物理コア数は等しいですが、Hyper-Threadingが有効の場合は論理コア数が物理コア数の2倍になります。 |
* Hyper-Threadingは見かけ上のコア数が2倍になる技術であり、並列計算プログラムで並列化効率が良い場合は逆に計算速度が著しく低下します。これは1つの物理コアに2つのジョブが投入されてしまうために発生します。 | * Hyper-Threadingは見かけ上のコア数が2倍になる技術であり、並列計算プログラムで並列化効率が良い場合は逆に計算速度が著しく低下します。これは1つの物理コアに2つのジョブが投入されてしまうために発生します。 | ||
- | * 並列化されたスレッドごとの並列化効率が著しく悪く、1つのスレッドの計算が終わっているのに別のスレッドの計算は続いている、というような場合にのみ有効です。 | + | * スレッドごとの計算の重さのバランスが著しく悪く、1つのスレッドの計算が終わっているのに別のスレッドの計算は続いている、というような場合にのみ有効です。 |
* よくわからない場合は、BIOSを使ってHyper-Threadingをオフにするか、MPIでのジョブ投入時に並列数を物理コア数以下にすることが望ましいです。 | * よくわからない場合は、BIOSを使ってHyper-Threadingをオフにするか、MPIでのジョブ投入時に並列数を物理コア数以下にすることが望ましいです。 | ||
Line 36: | Line 36: | ||
<file - test.c> | <file - test.c> | ||
#include < | #include < | ||
- | # | + | # |
- | int main(int argc, char **argv) { | + | int main( int argc, char *argv[] ) |
+ | { | ||
int rank, size, len; | int rank, size, len; | ||
char name[MPI_MAX_PROCESSOR_NAME]; | char name[MPI_MAX_PROCESSOR_NAME]; | ||
Line 47: | Line 48: | ||
MPI_Get_processor_name( name, &len ); | MPI_Get_processor_name( name, &len ); | ||
name[len] = ' | name[len] = ' | ||
- | printf( "I am %d of %d from %s\n", rank, size, name ); | + | printf( "Hello World! |
- | MPI_Barrier( MPI_COMM_WORLD | + | |
MPI_Finalize(); | MPI_Finalize(); | ||
Line 58: | Line 58: | ||
$ mpicc test.c | $ mpicc test.c | ||
</ | </ | ||
+ | |||
+ | |||
+ | ====== 参考 ====== | ||
+ | |||
+ | * https:// | ||