1. MPI_Bcast:广播消息

MPI_Bcast用于将一个进程的buffer中的数据广播到其他进程的相同buffer变量中

代码示例如下:

 int rank, data[10];MPI_Init(0, 0);MPI_Comm_rank(MPI_COMM_WORLD, &rank);if (rank == 0) {   for (int i = 0; i < 10; ++i){     data[i] = i + 1;}}        //进程0广播数据给所有进程MPI_Bcast(&data, 10, MPI_INT, 0, MPI_COMM_WORLD);//printf("process %d send data\n", rank);//每个进程该变量都被置为一样的值printf("process %d receive data:", rank);  for (int i = 0; i < 10; ++i){printf("%d ", data[i]);}MPI_Finalize();

运行 mpiexec -n 4 TestMPI.exe 后,可以看到各进程的data变量都被设置了与进程0该变量相同的值了

2. MPI_Gather:收集消息

MPI_Gather用于将所有进程的某个变量值发送给某一个进程,并按照进程rank值排序。
代码示例如下:

 int rank, data = 0;int size;MPI_Init(0, 0);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Comm_rank(MPI_COMM_WORLD, &rank);//每个进程分别对data赋不同的值for (int i = 0; i < size; ++i){if (i == rank){data = i + 1;}}int receiveRank = 0; //收集消息的进程rankint* rbuf = new int[size];//进程0收集其他所有进程的数据MPI_Gather(&data, 1, MPI_INT, rbuf, 1, MPI_INT, receiveRank, MPI_COMM_WORLD);//只有进程0的数据是收集所有进程的值 其他进程全是随机值printf("process %d receive data:", rank);  for (int i = 0; i < size; ++i){printf("%d ", rbuf[i]);}MPI_Finalize();

运行 mpiexec -n 4 TestMPI.exe 后,可以看到各进程的data都发送到进程0,并在收集数据buf中按照进程rank排序,其他进程收集数据buf是随机值。
除了收集数据的进程需要分配buf外,其他进程不需要buf,因此可以不用分配,如下代码所示

 int receiveRank = 0;int* rbuf = 0;//只有收集消息的进程为接收buf分配内存if (rank == receiveRank){rbuf = new int[size];}//进程0收集其他所有进程的数据MPI_Gather(&data, 1, MPI_INT, rbuf, 1, MPI_INT, receiveRank, MPI_COMM_WORLD);//只有进程0的数据是收集所有进程的值printf("process %d receive data:", rank);  if (rbuf != 0){for (int i = 0; i < size; ++i){printf("%d ", rbuf[i]);}}
3. MPI_Scatter:散播消息

MPI_Scatter用于将某个进程的数据分配/散播给所有进程,发送的部分数据按照进程rank值依次发送给各进程,如前图所示。
代码示例如下:

 int rank,data;int* sendBuf;int size;MPI_Init(0, 0);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Comm_rank(MPI_COMM_WORLD, &rank);sendBuf = new int[size];for (int i = 0; i < size; ++i){sendBuf[i] = i + 1;}//发送消息的进程rankint sendRank = 0;//进程0散播(分配)数据到各进程MPI_Scatter(sendBuf, 1, MPI_INT, &data, 1, MPI_INT, sendRank, MPI_COMM_WORLD);//每个进程的data按照rank顺序依次被散播为不同数据printf("process %d receive data %d", rank, data);   MPI_Finalize();

运行 mpiexec -n 4 TestMPI.exe 后,可以看到进程0中sendBuf的各个int值,分别发送到各进程的data中,而且是按照进程rank值依次有序的。

3. MPI_Reduce:Gather+Reduce

MPI_Reduce不仅收集所有进程发送的消息,并且在收集的所有数据上执行reduce操作,并返回计算后的值。可执行的reduce操作包括最大值(MPI_MAX)、最小值(MPI_MIN)、和(MPI_SUM)、乘积(MPI_PROD)、逻辑与(MPI_LAND)、逻辑或(MPI_LOR)、逻辑异或(MPI_LXOR)、按位与(MPI_BAND)、按位或(MPI_BOR)、按位异或(MPI_BXOR)等
代码示例如下:

 int rank, data = 0;int size;MPI_Init(0, 0);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Comm_rank(MPI_COMM_WORLD, &rank);//每个进程分别对data赋不同的值data = rank + 1;int receiveRank = 0;int sum = 0;//进程0收集其他所有进程的数据MPI_Reduce(&data, &sum, 1, MPI_INT, MPI_SUM, receiveRank, MPI_COMM_WORLD);//printf("process %d send data\n", rank);//只有进程0的数据是收集所有进程的值 其他进程全是随机值printf("process %d send data %d:\n", rank, data);   if (rank == receiveRank){printf("process %d reduce sum is %d\n", rank, sum);}MPI_Finalize();
}

运行 mpiexec -n 4 TestMPI.exe 后,可以看到进程0中收集的数据经过reduce操作,计算出所有进程数据的和。

MPI编程(4)—集合通信MPI_Bcast、MPI_Gather、MPI_Scatter、MPI_Reduce相关推荐

  1. MPI 集合通信函数 MPI_Reduce(),MPI_Allreduce(),MPI_Bcast(),MPI_Scatter(),MPI_Gather(),MPI_Allgather(),MPI_S

    MPI 集合通信函数 MPI_Reduce(),MPI_Allreduce(),MPI_Bcast(),MPI_Scatter(),MPI_Gather(),MPI_Allgather(),MPI_S ...

  2. MPI编程的常用接口速查

    获取当前时间 在插入MPI提供的头文件后,可以获得获取时间的函数. double MPI_Wtime(void) 取得当前时间, 计时的精度由 double MPI_Wtick(void) 取得 作为 ...

  3. 我的并行计算之路(三)MPI集合通信之Scatter和Gather

    集合通信对比点对点通信来说,确实要方便许多,基本上不需要考虑各个进程该怎么发送,该怎么接收的问题,只要是使用一个通信子,函数接口自己就完成了.从进程的角度考虑,集合通信在分配任务量的时候更加平均,使各 ...

  4. 【MPI编程】MPI_Bcast广播讲解和使用

    函数范式 int MPI_Bcast(void * data_p;int count;MPI_Datatype datatype;int source_proc;MPI_Comm comm; ); 实 ...

  5. 【MPI高性能计算】用集合通信改进梯形求和积分

    简述 [MPI高性能计算]梯形面积积分计算 里面有梯形积分公式的具体写法 这里采用MPI_Reduce的集合通信的方式来计算 API int MPI_Reduce(const void *sendbu ...

  6. MPI编程及性能优化

    第1节 MPI简介 1.1 MPI及其历史 与OpenMP相似,消息传递接口(Message Passing Interface,简称MPI)是一种编程接口标准,而不是一种具体的编程语言.该标准是由消 ...

  7. MPI中常用的通信方法

    MPI中常用的通信方法 问题描述 梯形法求解积分的串行程序 使用MPI并行化 使用树形结构优化通信 使用MPI_Reduce优化通信 使用MPI_Bcast优化通信 使用派生数据类型优化通信 使用结构 ...

  8. MPI: 虚拟拓扑和近邻通信

    Process Topologies & Neighborhood Communication MPI通信域(Communicator)由进程组(Group of Processes)组成,进 ...

  9. MPI编程实例(PI、AllGather、排序)

    1.MPI 简介 MPI(Message Passing Interface)是目前最重要的一个基于消息传递的并行编程工具,它具有移植性好.功能强大.效率高等许多优点,而且有多种不同的免费.高效.实用 ...

  10. 【MPI编程】矩阵向量乘法--解法三(子矩阵块分解)【高性能计算】

    简述 子矩阵分解,就是说,将原来的矩阵给分解为更小的矩阵块. 让所有的线程都共享有向量(但不共享矩阵) 为了试验简单,这里做了几个简单的假设 矩阵为方阵(n*n) comm_sz(线程数量)和n满足下 ...

最新文章

  1. 车道线检测--End-to-end Lane Detection through Differentiable Least-Squares Fitting
  2. 4、NIO--通道的原理和获取
  3. 前端一HTML:二十一与文本相关的属性
  4. 无法连接 服务器/虚拟机中的数据库,报错Access denied for user ‘root‘@‘192.168.1.101‘
  5. java bean的反射类_JAVA中反射机制五(JavaBean的内省与BeanUtils库)
  6. ASP.NET跨页面传值技巧总结
  7. iOS中AutoLayer自动布局流程及相关方法
  8. LeetCode 1392. 最长快乐前缀(KMP)
  9. copy 收到_离散内存与zero_copy的一些思考
  10. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
  11. 《重构-改善既有代码的设计》——读后总结
  12. python 的库如何开发_如何开发Python第三方库?
  13. linux取反格式,linux基本命令总结(二)
  14. JDK8下载安装及配置环境教程,一看就会
  15. 《Adobe Flash CS6中文版经典教程》——第1课 Flash CS6快速入门1.1 启动Flash并打开文件...
  16. 如何提升软件测试思维?
  17. 黄山市区到黄山风景区有多远,如何到黄山景区
  18. 使用python调用百度API实现文字转语音功能
  19. iOS 11 正式发布!最全功能介绍 + 视频 ...
  20. ubuntu 14.04调试ORB-SLAM2

热门文章

  1. Your Mac is infected with (3) Viruses!
  2. RocketMq 启动报错错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_301\jre\lib\ext
  3. python整数反转
  4. Uva 11584 - Partitioning by Palindromes(预处理+DP)
  5. 天勤系列的考研复习资料
  6. 关于微信小程序自定义交易组件升级处理的相关问题,及解决思路
  7. 洛谷 P1315 观光公交
  8. 基本面量化与美林时钟模型
  9. 股票策略03 | 基于机器学习的多因子策略
  10. Lessonnbsp;6nbsp;Percynbsp;Bu…