C言語でMPIを使ってみよう。
MPIを勉強していきます。理研や大学の講習会に出たことがあるのですが、自分で凝ったMPIのプログラムを書くことがないので忘れてしまいました。余談ですが、MPIは主にノード間並列をするときに用いる技術です。もちろんノード内の並列も可能ですが、そのコードの複雑さから、ノード内はOpenMPでノード間はMPIのハイブリット並列が今は主流だと思います。しかし、OpenMPのモデルはfork-join型で、子スレッドの生成に親スレッドのメモリを全部コピーし(fork)、OpenMPの部分が終わると(join)します。#pragma omp文が増えるとオーバーヘッドが大きくなり、OpenMPのノード並列がMPIのノード並列より実行時間が遅くなることが多々あることらしいです。ですので、実行時間の短縮だけを見るなら、ノード内でもMPIを使ったほうがいいのかも知れません。
実行されているランク(プロセスの番号)を知る。mpirank.c
#include <stdio.h> #include <mpi.h> int main(int argc, char **argv){ int rank,size,i; MPI_Init(&argc,&argv); // MPIを使う準備 MPI_Comm_rank(MPI_COMM_WORLD,&rank); // 現在のランクの取得 MPI_Comm_size(MPI_COMM_WORLD,&size); // 使用できるrankの最大数を取得 printf("Hello World, I am %d of %d\n",rank,size); MPI_Finalize(); // MPIの終了。 return(0); }
- MPI_COMM_WORLDで通信空間を定義する。
実行結果
Hello World, I am 6 of 12 Hello World, I am 0 of 12 Hello World, I am 1 of 12 Hello World, I am 3 of 12 Hello World, I am 2 of 12 Hello World, I am 4 of 12 Hello World, I am 5 of 12 Hello World, I am 10 of 12 Hello World, I am 11 of 12 Hello World, I am 8 of 12 Hello World, I am 7 of 12 Hello World, I am 9 of 12
参考文献:
- 作者: Georg Hager,Gerhard Wellein
- 出版社/メーカー: CRC Press
- 発売日: 2010/07/07
- メディア: ペーパーバック
- この商品を含むブログを見る