0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C言語+MPIのtips(MPI_Scatter)

Last updated at Posted at 2020-10-24

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

【方法】

Scatter.c
#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 並列プログラミング」と検索すると、より正確でより情報量の多い資料が見つかります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?