集団通信

1対1通信と対となる通信は集団通信があります。
その通信で行えることは多種多様です。
今回はその手法の一つで「ブロードキャスト」を説明します。
この方法はあるPCの値を全PCで共有させるための処理です。
たとえば以下のようにします。

#include<stdio.h>
#include"mpi.h"
#include<stdlib.h>
#include<unistd.h>
#include<time.h>

int main(int argc,char *argv[])
{
        int rank,size;
        int mynum=0;
        int myerr=0;
        MPI_Init(&argc,&argv);
        MPI_Comm_rank(MPI_COMM_WORLD,&rank);
        MPI_Comm_size(MPI_COMM_WORLD,&size);
        srand(time(NULL)+rank);
        if(rank == 0)★★★
                mynum = rand();★★★
        printf("hello world I'm %d of %d my number is %d\n",rank,size,mynum);★★★
        sleep(3);
        myerr = MPI_Bcast(&mynum,1,MPI_INT,0,MPI_COMM_WORLD);★★★
        printf("hello world I'm %d of %d my number is %d (err No. is %d)\n",rank,size,mynum,myerr);★★★
        MPI_Finalize();
        return 0;
}

で、コンパイルして実行してみます。

$ mpicc -o 005-1 ./005-1.c 
$ mpirun --machinefile ../machinefile ./005-1
hello world I'm 0 of 3 my number is 1943796139
hello world I'm 1 of 3 my number is 0
hello world I'm 2 of 3 my number is 0
hello world I'm 0 of 3 my number is 1943796139 (err No. is 0)
hello world I'm 2 of 3 my number is 1943796139 (err No. is 0)
hello world I'm 1 of 3 my number is 1943796139 (err No. is 0)

…というように各ノードに値が伝播していることがわかりますね。

このような関数がMPIにはいっぱいあります。

戻る