MPI之Reduce和Allreduce

来源:互联网 发布:如何投诉淘宝客服态度 编辑:程序博客网 时间:2024/06/05 16:02

一、前言
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)
“`
起作用如下:
这里写图片描述

0 0
原创粉丝点击