MPI Note[5]: Reduce

MPI_Reduce

Reduce 是函数式编程中的一个非常经典的概念, 主要是加载一个可交换的二元算子进行规约操作。最直观的就是分布式算如下两个东西:

由于是可交换的二元算子,因此谁先做谁后做都无所谓,那么就有了分布式的处理方法,每个节点自己做一份,然后最终来聚合:

MPI Note[5]: Reduce

当然也可以按照向量的方式同时处理多个值

MPI Note[5]: Reduce

我们注意到这个可交换的约束, 因此通常支持的算符通常如下:

  • MPI_MAX – 返回最大元素。
  • MPI_MIN – 返回最小元素。
  • MPI_SUM – 对元素求和。
  • MPI_PROD – 将所有元素相乘。
  • MPI_LAND – 对元素执行逻辑与运算。
  • MPI_LOR – 对元素执行逻辑或运算。
  • MPI_BAND – 对元素的各个位按位与执行。
  • MPI_BOR – 对元素的位执行按位或运算。
  • MPI_MAXLOC – 返回最大值和所在的进程的秩。
  • MPI_MINLOC – 返回最小值和所在的进程的秩。
 

结果

kevin@netdev:~/Desktop/mpi/05_reduce$ mpirun -np 16 ./reduce 10
global_sum[0]: 120.000000,  avg: 7.500000
global_sum[1]: 136.000000,  avg: 8.500000
global_sum[2]: 152.000000,  avg: 9.500000
global_sum[3]: 168.000000,  avg: 10.500000
global_sum[4]: 184.000000,  avg: 11.500000
global_sum[5]: 200.000000,  avg: 12.500000
global_sum[6]: 216.000000,  avg: 13.500000
global_sum[7]: 232.000000,  avg: 14.500000
global_sum[8]: 248.000000,  avg: 15.500000
global_sum[9]: 264.000000,  avg: 16.500000

MPI_Allreduce

估计这个词因为很多分布式机器学习模型参数同步而更加容易的被人熟知。本质上就是Reduce的基础上加了一个MPI_Bcast

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

例如我们来写一个计算标准差的程序

 

编译和运行

kevin@netdev:~/Desktop/mpi/05_reduce$ mpicc std.c -o std -lm
kevin@netdev:~/Desktop/mpi/05_reduce$ mpirun -np 16 ./std 6
Stddev[0]: 4.609772 
Stddev[1]: 9.219544 
Stddev[2]: 13.829317 
Stddev[3]: 18.439089 
Stddev[4]: 23.048861 
Stddev[5]: 27.658633 

MPI Note[5]: Reduce》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:http://www.bookhoes.com/746.html