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)
“`
起作用如下:
MPI之Reduce和Allreduce_第1张图片

你可能感兴趣的:(mpi)