MPI_Scatterは「あるプロセスが持つデータを,等分して,各々のプロセスに配分する関数」。
【目的】
あるプロセスに存在する要素数10の配列 arr を3つずつ各々のプロセスに配分することで MPI_Scatter の機能を知る。
【使用するもの】
open-mpi
【環境】
$ mpicc —version
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
【方法】
#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>
#define N 3
int main(int argc, char **argv){
int my_rank, num_proc;
int i, div[N];
int *arr;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_proc);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if(my_rank==0){
arr=(int *)malloc(10*sizeof(int));
if (arr==NULL){
printf("arr\n");
return 1;
}
for(i=0;i<10;i++) arr[i] = i;
}
MPI_Scatter(arr, N, MPI_INT, div, N, MPI_INT, 0, MPI_COMM_WORLD);
printf("my_rank = %d, div[0]= %d, div[1]= %d, div[2]= %d\n", my_rank, div[0],div[1],div[2]);
if(my_rank==0) free(arr);
MPI_Finalize();
return 0;
}
【結果】
mpicc コマンドでコンパイル、mpirun コマンドでプロセス数を2にして実行。
$ mpicc Scatter.c
$ mpirun -np 2 ./a.out
my_rank = 0, div[0]= 0, div[1]= 1, div[2]= 2
my_rank = 1, div[0]= 3, div[1]= 4, div[2]= 5
【考察(何が起きたのか)】
まずプロセス0と1でそれぞれ div[0]、div[1]、div[2]が生成される。次にプロセス0でarr[0]からarr[9]までがメモリ割り当てされる。for文によって arr[0]=0、arr[1]=1、・・・、arr[9]=9 が格納される。
MPI_Scatterによって「arr」が送信される。「N」個ずつのデータに分割される。データの型は整数(int)「MPI_INT」である。各々のプロセスの「div」がその「N」個の整数型(int)「MPI_INT」のデータを受信する。送信元はプロセス「0」である。
つまり
arr[0]=0、arr[1]=1、・・・、arr[9]=9(at プロセス0)から
at プロセス0 div[0]=arr[0]=0、div[1]=arr[1]=1、div[2]=arr[2]=2
at プロセス1 div[0]=arr[3]=3、div[1]=arr[4]=4、div[2]=arr[5]=5
となる。
それぞれのプロセスでdivが表示されて終了。free(arr)でプロセス0のメモリを解放。
【参考】
「mpi 並列プログラミング」と検索すると、より正確でより情報量の多い資料が見つかります。