おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

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で通信空間を定義する。
コンパイル、実行方法
mpicc mpirank.c
mpirun -np 12 ./a.out
  • -npで使用するプロセス数を決定する。
実行結果
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

参考文献:

Introduction to High Performance Computing for Scientists and Engineers (Chapman & Hall/CRC Computational Science)

Introduction to High Performance Computing for Scientists and Engineers (Chapman & Hall/CRC Computational Science)