Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?

Broadcast

看名字就很好理解了,其实就是把同一份数据分发广播给所有人,示意图如下:

qg6ezsg9va.png

Scatter

不同于Broadcast, scatter可以将不同数据分发给不同的进程。

image.png

Gather

这个也很好理解,就是把多个进程的数据拼凑在一起。

image.png

Reduce

reduce就是将多个进程中的数据按照指定的映射函数进行运算得到最后的结果存在一个进程中,例如下面两个图中的归约操作都是求和,将4个不同进程的数据归约求和后存在了第一个进程中

image.png

image.png

All-reduce

All-reduce与reduce的区别就在于后者最后的结果是只保存在一个进程中,而All-reduce需要每个进程都有同样的结果。所以All-reduce一般包含scatter操作,所以有时候也会看到reduce-scatter这种说法,其实reduce-scatter可以看成是all reduce的一种实现方式

image.png

参考



MARSGGBO原创





2019-9-10



转载于:https://www.cnblogs.com/marsggbo/p/11497780.html

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用MPI实现broadcastscattergather操作的示例代码。 1. Broadcast操作:将一个进程的数据广播给所有其他进程。 ```c #include <stdio.h> #include <mpi.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int my_rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int data = 0; if(my_rank == 0) { data = 123; // 要广播的数据 } MPI_Bcast(&data, 1, MPI_INT, 0, MPI_COMM_WORLD); printf("Process %d, data = %d\n", my_rank, data); MPI_Finalize(); return 0; } ``` 2. Scatter操作:将一个进程的数据拆分发送给所有进程。 ```c #include <stdio.h> #include <mpi.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int my_rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int send_data[4]; // 要发送的数据数组 if(my_rank == 0) { for(int i = 0; i < size*4; ++i) { send_data[i] = i+1; // 填充发送数据数组 } } int recv_data; // 接收的数据 MPI_Scatter(send_data, 1, MPI_INT, &recv_data, 1, MPI_INT, 0, MPI_COMM_WORLD); printf("Process %d, data = %d\n", my_rank, recv_data); MPI_Finalize(); return 0; } ``` 3. Gather操作:将所有进程的数据收集起来,发送给一个进程。 ```c #include <stdio.h> #include <mpi.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int my_rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int send_data = my_rank + 1; // 要发送的数据 int recv_data[size]; // 接收的数据数组 MPI_Gather(&send_data, 1, MPI_INT, recv_data, 1, MPI_INT, 0, MPI_COMM_WORLD); if(my_rank == 0) { printf("Process %d, data = ", my_rank); for(int i = 0; i < size; ++i) { printf("%d ", recv_data[i]); } printf("\n"); } MPI_Finalize(); return 0; } ``` 以上是使用MPI实现broadcastscattergather操作的代码示例。在实际应用中,可以根据需要进行修改和组合这些操作来实现更复杂的通信模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值