異なるプロセッサ群に由来する別個の値を独立に足し合わせるにはMPI_Reduceを使用します。
MPI_Reduce関数を使用すると、異なるプロセッサ・グループからの異なる値の排他的加算を行うことができます。以下に、MPI_Reduceを使用した加算手順を示します。
- MPIライブラリをインポートします:
#include <mpi.h>
- MPIの初期化:
MPI_Init(NULL, NULL);
- カレントプロセスのランクとプロセス総数を取得します。
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
- 各プロセスそれぞれについてローカルな値を定義します。
int local_value = ...; // 每个进程的本地值
- グローバル値の変数を定義し、0に初期化する
int global_value = 0; // 全局值的变量
- MPI_Reduce関数を使用してすべてのプロセスローカルの値を合計します。
MPI_Reduce(&local_value, &global_value, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
以下にパラメータの解説を示します
- &local_value: ローカル値を指すポインタ
- &global_value:グローバル値へのポインタ
- ローカル値の個数。
- MPI_INT: データ型はローカル値
- MPI_SUM: 指定した加算演算
- 結果を受信するプロセスのランク。
- MPI_COMM_WORLD: コミュニケーター
- 結果を受け取るプロセス内でグローバルな値を出力する:
if (rank == 0) {
printf("The sum of all values is %d\n", global_value);
}
- MPIを終了する:
MPI_Finalize();
以下に完全なサンプルコードを示します。
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int local_value = rank + 1; // 每个进程的本地值
int global_value = 0; // 全局值的变量
MPI_Reduce(&local_value, &global_value, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0) {
printf("The sum of all values is %d\n", global_value);
}
MPI_Finalize();
return 0;
}
各プロセス自身のrankをローカルな値として1増やし、MPI_Reduce関数で全プロセス分のローカルな値の和を集計します。最後に、グローバルな値(ローカル値のすべての合計)の結果を出力します。