リダクション

プログラム: reduce.c


#include "mpi.h"

main( argc, argv )
int argc;
char **argv;
{
    int myrank;
    int p;
    int sum, v;

    MPI_Init( &argc, &argv );
    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
    MPI_Comm_size( MPI_COMM_WORLD, &p );

    v = myrank;

    MPI_Reduce(&v, &sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    if (myrank == 0){
      printf("sum of all ranks = %d\n", sum);
    }
    MPI_Finalize();
  }

MPI_Reduce

int MPI_Reduce ( 
    void *sendbuf,         // address of send buffer (choice) 
    void *recvbuf, 
    int count,             // number of elements in send buffer (integer) 
    MPI_Datatype datatype, // data type of elements of send buffer (handle) 
    MPI_Op op,             // reduce operation (handle) 
    int root,              // rank of root process (integer) 
    MPI_Comm comm          // communicator (handle) 
   )
MPI_Opとしては次のものが用意されている.
MPI_MAX(最大), 
MPI_MIN(最小), 
MPI_SUM(合計), 
MPI_PROD(積)
MPI_LAND(論理AND),
MPI_BAND(ビットAND) 
MPI_LOR(論理OR), 
MPI_BOR(ビットOR) 
MPI_LXOR(論理XOR), 
MPI_BXOR(ビットXOR)
MPI_MAXLOC(最大と位置), 
MPI_MINLOC(最小と位置)

解説

parallel_sum.c の時は,SendとRecieveを使って(しかもプロセッサの数分だけ 明示的にこの同期通信を行っていた)和を求めていたのに対し,Reduceを使うことで1命令で同じ ことを行うことができる.