MPI通信类型:

  • 点对点通信
  • 聚合通信

点对点通信:

  • 同一通信器内的两个进程之间的消息传递;
  • 分为阻塞型、非阻塞型通信。

本文主要学习点对点通信

MPI点对点消息发送模式

  • 标准模式(学习重点)

    自由发送接收,不考虑其它进程状态;

  • 缓存模式

    由用户显式提供缓存区,辅助通信;创建、释放缓存区:

    MPI_Buffer_attach(buffer, size);
    MPI_Buffer_detach(buffer, size);

  • 同步模式

    通信双方先建立联系,再通信;

  • 就绪模式

    接受进程必须先于发送进程提出通信要求;


MPI标准阻塞通信函数

MPI消息由消息信封消息数据组成

int MPI_Send(
void *send_buffer,/*指向包含消息内容的内存块的指针 */
int send_count,/*数据量*/
MPI_Datatype datatype,/*数据类型*/
int dest,/*要接收消息的进程的进程号*/
int tag,/*tag=0,表示消息是要打印的;tag=1,表示消息是要用于计算的*/
MPI_Comm comm);/*通信器,指定通信范围*/

前三项为待发送的消息数据,后三项为消息信封(接收者的地址)。

int MPI_Recv(void *recv_buffer,int recv_count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status * status);

注:
1.若接收多个进程传来的消息,int source使用常量MPI_ANY_SOURCE则可以按照进程完成工作的顺序来接收结果,避免等待;

2.Recv的tag要与Send的tag相匹配;

3.若一个进程接收多条来自另一个进程的有着不同tag的消息,可将常量MPI_ANY_TAG传递给tag

4.status简介

类型为MPI_Status的结构体,至少有以下三个成员

  • status.MPI_SOURCE

  • status.MPI_TAG

  • status.MPI_ERROR

    &status作为最后一个参数传递给Recv函数并调用它后,可以通过检查结构体中的成员来确定发送者source和标签tag。

进一步解释
MPI_Send发送过程:

1.发送进程组装消息(包括数据信封

2.缓冲消息/阻塞

  • 缓冲消息:MPI把消息放置在自己内部存储器里,并返回MPI_Send调用;
  • 阻塞(block):发送进程一直等待,直到可以发送消息,并不立即返回MPI_Send调用;

MPI_Recv接收过程:

总是阻塞的直到接收到一条匹配的信息。

陷阱

  • 若MPI_Send发生阻塞,并且没有相匹配的进程接收,那么发送进程悬挂
  • 若MPI_Send缓冲,但没有相匹配的接收,那么信息丢失。

用MPI实现梯形积分

        /*梯形积分法,计算y=sin x 在[0,pi]上的积分@ trap 梯形积分串行程序@total_inte 最终积分结果*/#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include<math.h>#include "mpi.h"using namespace std;const double a = 0.0;const double b = 3.1415926;int n = 100;double h = (b - a) / n;double trap(double a, double b, int n, double h){double*x = new double[n + 1];double*f = new double[n + 1];double inte = (sin(a) + sin(b)) / 2;for (int i = 1; i<n + 1; i++) {x[i] = x[i - 1] + h;   /*x_0=a,x_n=b*/f[i] = sin(x[i]);inte += f[i];}inte = inte*h;    /* inte=h*[f(a)/2+f(x_1)+...f(x_{n-1})+f(b)/2]*/return inte;}int main(int argc, char * argv[]){int myid, nprocs;int local_n;double local_a;double local_b;double total_inte;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &myid);   /* get current process id */MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* get number of processes */local_n = n / nprocs;local_a = a + myid*local_n*h;local_b = local_a + local_n*h;double local_inte = trap(local_a, local_b, local_n, h);if (myid != 0){MPI_Send(&local_inte, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);}else{total_inte = local_inte;for (int i = 1; i<nprocs; i++){MPI_Recv(&local_inte, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);total_inte += local_inte;}}if (myid == 0){printf("integral output is %d", total_inte);}MPI_Finalize();return 0;}

MPI学习-点对点通信相关推荐

  1. MPI之点对点通信——阻塞式MPI_Send 和MPI_Recv

    MPI的两种点对点通信方式 通信方式介绍 从对通信过程的角度来看 同步通信--发送和接收数据同时发生(类似打电话) 异步通信--发送和接收数据非同时发生(类似发邮件) 从函数调用的角度 阻塞--在函数 ...

  2. 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计

    学习了MPI四种通信模式 及其函数用法: (1)标准通信模式:MPI_SEND (2)缓存通信模式:MPI_BSEND (3)同步通信模式:MPI_SSEND (4)就绪通信模式:MPI_RSEND ...

  3. MPI学习存在的一些问题

    最近修改MPI程序,遇到了一些细节问题,在此标记一下,不知是MPI自身缺陷还是我不是很精通MPI, 有些问题还是不太理解,敬请各位专家批评指正 1.MPI_Reduce各进程的数据操作问题 比如说,对 ...

  4. mpi学习1:以C语言和fortran语言为例简单的接收发送

    mpi分为阻塞通信和非租塞通信两种.其中阻塞通信产生了等待时间的情况.(这个等待时间也是空闲时间)也可以说这个发送进程和接收进程需要相互等待对方. 以下为c语言和fortran语言的简单例子,并行为两 ...

  5. 【MPI学习笔记】1:并行化向量和矩阵的乘积

    大致看了看MPI的一些函数,勉强写出这两个程序,这两个程序的效率不高(这个问题很严重),而且对输入的鲁棒性非常不好(可能并行程序不太需要关注这个). 只是实现了功能,有非常多优化的空间,如果有时间的话 ...

  6. MPI编程及性能优化

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

  7. 并行计算之MPI(一)

    MPI学习 1. 了解并行计算 为什么要采用并行计算? (1)这是因为它可以加快速度即在更短的时间内解决相同的问题或在相同的时间内解决更多更复杂的问题特别是对一些新出现的巨大挑战问题: (2)节省投入 ...

  8. 【艾琪出品】《计算机应用基础》【试题汇总7】南开在线作业答案

    南开大学-20秋学期(1709.1803.1809.1903.1909.2003.2009 )<办公自动化基础>在线作业 1. 执行Word表格"单元格大小"按钮组中的 ...

  9. 一文了解GPU并行计算CUDA

    了解GPU并行计算CUDA 一.CUDA和GPU简介 二.GPU工作原理与结构 2.1.基础GPU架构 2.2.GPU编程模型 2.3.软件和硬件的对应关系 三.GPU应用领域 四.GPU+CPU异构 ...

  10. 【艾琪出品】《计算机应用基础》【试题汇总5】

    南开大学(本部)-20秋学期(1709.1803.1809.1903.1909.2003.2009 )<大数据导论>在线作业 1. 大数据的最显著特征是() . A 数据规模大 B 数据类 ...

最新文章

  1. html漂浮在左侧不动,[CSS]CSS练习-悬浮不动侧边栏
  2. 常见Java面试题之JVM加载class文件的原理机制
  3. iOS查看静态库命令
  4. 第 三 十 八 天:Linux 的 LVM 逻 辑 卷 管 理
  5. java 线程池 wait,Java 多线程 之 wait等待 线程实例
  6. MATLAB求线性代数的参数范围,MATLAB科学计算04(线性代数问题求解一)
  7. 微博计数:从关系服务到访问计数, Redis 持续优化支撑万亿级访问(含 PPT)
  8. linux系统 远程桌面连接到服务器,Ubuntu 14.04服务器远程桌面连接
  9. luogu P1462 通往奥格瑞玛的道路
  10. python学习笔记 -- map() 操作可迭代序列
  11. JSP 分页显示技术
  12. cad卸载_CAD卸载不干净导致安装失败?别慌!老司机手把手教你卸载!
  13. Unity图片格式转换
  14. oracle svip地址,木子李QQ8.9 显IP地址SVIP完整版
  15. android 方法映射,高通Android平台驱动层 MSM8916 键值映射方法
  16. 【C语言练习——打印杨辉三角及其变形】
  17. EKL日志分析平台-kibana数据可视化
  18. 《余光中诗歌精读》放下代码,静下心来,细细品读
  19. 实现调用本地office打开在线文档功能
  20. 学业水平计算机考试考点宣传标语,中考考点宣传标语(学生方面)

热门文章

  1. C语言习题带答案和解析
  2. pycharm创建django项目时出错
  3. 关于侵权Sinesafe官方网站,仿冒、抄袭等恶劣行为的公告
  4. java8-常用stream操作(1)
  5. 嵩天《Python网络爬虫与信息提取》实例3:淘宝商品比价定向爬虫
  6. JavaBean字段防止非空赋值
  7. 联想计算机系统重装,联想笔记本电脑重装系统教程
  8. 杰克·伦敦: 一块牛排
  9. Normalized Gini Coefficient
  10. apple 证书 账号 内购 详解