学习笔记:
该操作对组内所有进程的数据进行某种归约后,将结果保存在“根”进程中。假定根进程为1号进程,则下列代码:
int cnt=1;
int dst=1;
//sbuf: 发送缓冲区
//rbuf: 接收缓冲区
//cnt: 接收数据个数
//MPI_SUM: 归约操作类型
//dst: 目标进程
//COMM_WORLD: 通信子对象
MPI_Reduce(sbuf, rbuf, cnt, MPI_INT, MPI_SUM, dst, MPI_COMM_WORLD);
将得到如下结果。
进程0 进程1 进程2 进程3
发送缓冲区 1 2 3 4
接收缓冲区 10
MPI内置定义的归约操作:
MPI_MAX、MPI_MIN、MPI_SUM、MPI_PROD、MPI_LAND(logical AND) 、MPI_BAND(bit-wise AND)、MPI_LOR(logical OR)、MPI_BOR(bit-wise OR)、MPI_LXOR(logical XOR)、MPI_BXOR(bit-wise XOR)、MPI_MAXLOC(max value and location) 、MPI_MINLOC(min value and location)
此外,MPI还支持自定义归约操作。
《并行程序设计》(都志辉) 一书介绍。
MPI_REDUCE将组内每个进程输入缓冲区中的数据按给定的操作op进行运算, 并将其结果返回到序列号为 root 的进程的输出缓冲区中。输入缓冲区由参数sendbuf、count和datatype定义, 输出缓冲区由参数 recvbuf、count和datatype定义,要求两者的元素数目和类型都必须相同。因为所有组成员都用同样的参数count、datatype、op、root和comm来调用此例程, 故而所有进程都提供长度相同、元素类型相同的输入和输出缓冲区。每个进程可能提供一个元素或一系列元素,组合操作依次针对每个元素进行。
![[MPI] MPI组通信 -- 归约 - applesun - 计算机技术学习笔记 [MPI] MPI组通信 -- 归约 - applesun - 计算机技术学习笔记](http://img0.ph.126.net/Sumz7UR2Vf0LSEQ650_KnA==/6597166523681015310.jpg)
学习感想:
参与 Mapreduce的reduce操作,对结果进行归约。
浙公网安备 33010602011771号