リダクション
プログラム: 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命令で同じ
ことを行うことができる.