MPI之Reduce和Allreduce

一、前言
Reduce——规约是来自函数式编程的一个经典概念。数据规约包含通过一个函数将一批数据分成较小的一批数据。比如将一个数组的元素通过加法函数规约为一个数字。

二、MPI_Reduce
与MPI_Gather类似,MPI_Reduce在每个进程上都有一组输入元素,并将一个输出元素数组返回给根进程。 输出元素包含被规约的结果。

MPI_Reduce(
    void* send_data,
    void* recv_data,
    int count,
    MPI_Datatype datatype,
    MPI_Op op,
    int root,
    MPI_Comm communicator)

send_data参数指向的是每个进程想要规约的datatype类型的元素数组。recv_data仅与根进程相关。recv_data数组包含规约的结果,并具有sizeof(datatype)* count的大小的内存。op参数是要应用于数据的操作。 MPI包含一组可以使用的常见规约操作:

MPI_MAX - 返回最大值.
MPI_MIN - 返回最小值.
MPI_SUM -元素和.
MPI_PROD - 元素乘积.
MPI_LAND - 逻辑与.
MPI_LOR - 逻辑或
MPI_BAND -按位与
MPI_BOR - 按位或
MPI_MAXLOC - 返回最大值和拥有该值的进程编号
MPI_MINLOC - 返回最小值和拥有该值的进程编号.```
典型的规约实例如下:
![这里写图片描述](http://mpitutorial.com/tutorials/mpi-reduce-and-allreduce/mpi_reduce_1.png)
如果每个进程中的数组拥有两个元素,那么规约结果是对两个对位的元素进行规约的。
![这里写图片描述](http://mpitutorial.com/tutorials/mpi-reduce-and-allreduce/mpi_reduce_2.png)


三、MPI_Allreduce  
很多并行程序需要获得所有进程的规约结果而不是根进程的结果,在MPI_Allgather与MPI_Gather的类似互补式中,MPI_Allreduce将规约值结果分发到所有进程。
MPI_Allreduce与MPI_Reduce相同,但不需要根进程标识(因为结果分发到所有进程)。

MPI_Allreduce(
void* send_data,
void* recv_data,
int count,
MPI_Datatype datatype,
MPI_Op op,
MPI_Comm communicator)
“`
起作用如下:
这里写图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值