




已阅读5页,还剩110页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五讲MPI并行程序设计语言 2020年3月 基本的MPI基本概念点到点通信 Pointtopoint MPI中API的主要内容 为MPI最基本 最重要的内容MPI程序的编译和运行深入MPI用户自定义 派生 数据类型 User defined Derived datatype 事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区 结构 数组散元 集合通信 Collective 数据移动 数据聚集 同步基于pointtopoint构建MPI环境管理函数组 上下文和通信空间 通信子的管理实例 消息传递并行程序设计 MPI并行程序设计 2020年3月 消息传递并行程序设计 消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换 在这种并行编程中 每个并行进程均有自己独立的地址空间 相互之间访问不能直接进行 必须通过显式的消息传递来实现 这种编程方式是大规模并行处理机 MPP 和机群 Cluster 采用的主要编程方式 并行计算粒度大 特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题 组织不同进程间的数据交换 并行计算粒度大 特别适合于大规模可扩展并行算法 消息传递是当前并行计算领域的一个非常重要的并行程序设计方式 MPI并行程序设计 什么是MPI MPI MessagePassingInterface 是一个消息传递接口标准 具有多种不同的免费 高效 实用的实现版本MPI提供一个可移植 高效 灵活的消息传递接口库MPI以语言独立的形式存在 可运行在不同的操作系统和硬件平台上几乎所有的并行计算机厂商都提供对它的支持 成为了事实上的并行编程标准MPI提供与C和Fortran语言的绑定 MPI并行程序设计 2020年3月 MPI标准产生于1992年4月MPI是一个库 而不是一门语言 因此对MPI的使用必须和特定的语言结合起来进行MPI的版本MPICH 最重要的一种MPI实现 免费获取网址 http ww unix mcs anl gov mpi mpichLAM LocalAreaMulticomputer 由美国OhioStateUniversity开发 http www lam mpi org downloadCHIMP 由Edinburgh大学开发的另外一个免费MPI实现 是在EdinburghParallelComputingCenter的支持下进行的 ftp ftp epcc ed ac uk pub packages chimp release MPI并行程序设计 2020年3月 2020年3月 MPI并行程序设计 为什么要用MPI 高可移植性MPI已在IBMPC机上 MSWindows上 所有主要的Unix工作站上和所有主流的并行机上得到实现 使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBMPC MSWindows Unix工作站 以及各种并行机上 2020年3月 MPI并行程序设计 从简单入手 下面我们首先以C语言的形式给出一个最简单的MPI并行程序 该程序在终端打印出HelloWorld 字样 HelloWorld 一声来自新生儿的问候 2020年3月 MPI并行程序设计 Helloworld include include mpi h main intargc char argv MPI Init 2020年3月 MPI并行程序设计 MPI函数约定 C必须包含mpi h MPI 前缀 且只有MPI以及MPI 标志后的第一个字母大写 其余小写 MPI函数的参数被标志为以下三种类型 IN 参数在例程的调用中不会被修正 OUT 参数在例程的调用中可能会被修正 INOUT 参数在一些例程中为IN 而在另一些例程中为OUT 2020年3月 MPI并行程序设计 MPI初始化 MPI INIT intMPI Init int argc char argv MPI Init是MPI程序的第一个调用 它完成MPI程序的所有初始化工作 所有的MPI程序的第一条可执行语句都是这条语句 启动MPI环境 标志并行代码的开始 并行代码之前 第一个mpi函数 要求main必须带参数运行 否则出错 2020年3月 MPI并行程序设计 MPI结束 MPI FINALIZE intMPI Finalize void MPI Finalize是MPI程序的最后一个调用 它结束MPI程序的运行 它是MPI程序的最后一条可执行语句 否则程序的运行结果是不可预知的 标志并行代码的结束 结束除主进程外其它进程 之后串行代码仍可在主进程 rank 0 上运行 如果必须 2020年3月 MPI并行程序设计 MPI程序的的编译与运行 mpicchello c默认生成a out的可执行代码 mpicc ohellohello c生成hello的可执行代码 mpirun np4a outmpirun np4hello4指定np的实参 表示进程数 由用户指定 a out hello要运行的MPI并行程序 小写o np Thenumberofprocess 2020年3月 MPI并行程序设计 运行我们的MPI程序 dair node01 mpicc ohellohello c dair node01 hello 0 Abortingprogram Couldnotcreatep4procgroup Possiblemissingfileorprogramstartedwithoutmpirun dair node01 mpirun np4hello HelloWorld HelloWorld HelloWorld HelloWorld dair node01 计算机打印字符 我们输入的命令 2020年3月 MPI并行程序设计 Hello是如何被执行的 SPMD SingleProgramMultipleData SPMD include mpi h includemain intargc char argv MPI Init include mpi h includemain intargc char argv MPI Init include mpi h includemain intargc char argv MPI Init include mpi h includemain intargc char argv MPI Init HelloWorld HelloWorld HelloWorld HelloWorld include mpi h includemain intargc char argv MPI Init 2020年3月 MPI并行程序设计 开始写MPI并行程序 在写MPI程序时 我们常需要知道以下两个问题的答案 任务由多少个进程来进行并行计算 我是哪一个进程 2020年3月 MPI并行程序设计 开始写MPI并行程序 MPI提供了下列函数来回答这些问题 用MPI Comm size获得进程个数pintMPI Comm size MPI Commcomm int size 用MPI Comm rank获得进程的一个叫rank的值 该rank值为0到p 1间的整数 相当于进程的IDintMPI Comm rank MPI Commcomm int rank 2020年3月 MPI并行程序设计 更新的HelloWorld include include mpi h main intargc char argv intmyid numprocs MPI Init 2020年3月 MPI并行程序设计 运行结果 dair node01 mpicc ohellohello c dair node01 mpirun np4helloIam0of4Iam1of4Iam2of4Iam3of4 dair node01 计算机打印字符 我们输入的命令 2020年3月 MPI并行程序设计 有消息传递Greeting 2020年3月 MPI并行程序设计 greetings include include mpi h main intargc char argv intnumprocs myid source MPI Statusstatus charmessage 100 MPI Init 2020年3月 MPI并行程序设计 有消息传递greetings if myid 0 strcpy message HelloWorld MPI Send message strlen message 1 MPI CHAR 0 99 MPI COMM WORLD else myid 0 for source 1 source numprocs source MPI Recv message 100 MPI CHAR source 99 MPI COMM WORLD endmain 2020年3月 MPI并行程序设计 解析greetings程序 头文件 mpi h intMPI Init int argc char argv 启动MPI环境 标志并行代码的开始 并行代码之前 第一个mpi函数 要求main必须带参数运行 否则出错 通信子 通信空间 MPI COMM WORLD 一个通信空间是一个进程组和一个上下文的组合 上下文可看作为组的超级标签 用于区分不同的通信子 在执行函数MPI Init之后 一个MPI程序的所有进程形成一个缺省的组 这个组的通信子即被写作MPI COMM WORLD 该参数是MPI通信操作函数中必不可少的参数 用于限定参加通信的进程的范围 2020年3月 MPI并行程序设计 解析greetings程序 intMPI Comm size MPI Commcomm int size 获得通信空间comm中规定的组包含的进程的数量 指定一个communicator 也指定了一组共享该空间的进程 这些进程组成该communicator的group intMPI Comm rank MPI Commcomm int rank 得到本进程在通信空间中的rank值 即在组中的逻辑编号 从0开始 intMPI Finalize 标志并行代码的结束 结束除主进程外其它进程 之后串行代码仍可在主进程 rank 0 上运行 如果必须 2020年3月 MPI并行程序设计 消息传送 先可不关心参数含义 MPI Send A 10 MPI DOUBLE 1 99 MPI COMM WORLD MPI Recv B 20 MPI DOBULE 0 99 MPI COMM WORLD 数据传送 同步操作 需要发送方与接收方合作完成 2020年3月 MPI并行程序设计 最基本的MPI MPI调用接口的总数虽然庞大 但根据实际编写MPI的经验 常用的MPI调用的个数却十分有限 下面是6个最基本的MPI函数 MPI Init MPI Comm size MPI Comm rank MPI Send MPI Recv MPI Finalize MPI Init 并行代码 MPI Fainalize 2020年3月 MPI并行程序设计 消息传递并行程序设计 基本的MPI基本概念点到点通信 Pointtopoint MPI中API的主要内容 为MPI最基本 最重要的内容MPI程序的编译和运行深入MPI用户自定义 派生 数据类型 User defined Derived datatype 事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区 结构 数组散元 集合通信 Collective 数据移动 数据聚集 同步基于pointtopoint构建MPI环境管理函数组 上下文和通信空间 通信子的管理实例 2020年3月 MPI并行程序设计 PointtoPoint 单个进程对单个进程的通信 重要且复杂 2020年3月 MPI并行程序设计 BlockingSend intMPI Send void buf intcount MPI Datatypedatatype intdest inttag MPI Commcomm INbuf发送缓冲区的起始地址INcount要发送信息的元素个数INdatatype发送信息的数据类型INdest目标进程的rank值INtag消息标签INcomm通信子 2020年3月 MPI并行程序设计 BlockingReceive intMPI Recv void buf intcount MPI Datatypedatatype intsource inttag MPI Commcomm MPI Status status OUTbuf接收缓冲区的起始地址INcount要接收信息的元素个数INdatatype接收信息的数据类型INsource源进程的rank值INtag消息标签INcomm通信子OUTstatusstatus对象 包含实际接收到的消息的有关信息 2020年3月 MPI并行程序设计 MPI消息 MPI消息包括信封和数据两个部分 信封指出了发送或接收消息的对象及相关信息 而数据是本消息将要传递的内容消息的内容即信的内容 在MPI中称为消息缓冲 MessageBuffer 消息的接收者即信的地址 在MPI中称为消息信封 MessageEnvelop 数据 信封 2020年3月 MPI并行程序设计 消息数据 由count个类型为datatype的连续数据空间组成 起始地址为buf不是以字节数 而是以元素的个数指定消息的长度count可以是零 这种情况下消息的数据部分是空的MPI基本数据类型相应于宿主语言的基本数据类型 MPI的数据类型 2020年3月 MPI并行程序设计 MPI标识一条消息的信息包含四个域 Source 发送进程隐式确定 由进程的rank值唯一标识Destination Send函数参数确定Tag Send函数参数确定 用于识别不同的消息 0 UB UB MPI TAG UB 32767 Communicator 缺省MPI COMM WORLDGroup 有限 N 有序 Rank 0 1 2 N 1 消息信封 2020年3月 MPI并行程序设计 2020年3月 MPI并行程序设计 消息匹配 接收buffer必须至少可以容纳count个由datatype参数指明类型的数据 如果接收buf太小 将导致溢出 出错 消息匹配参数匹配dest tag comm source tag commSource MPI ANY SOURCE 接收任意处理器来的数据 任意消息来源 Tag MPI ANY TAG 匹配任意tag值的消息 任意tag消息 消息传送被限制在同一个communicator 在send函数中必须指定唯一的接收者 消息状态 消息状态 MPI Status类型 存放接收消息的状态信息 包括消息的源进程标识 MPI SOURCE 消息标签 MPI TAG 包含的数据项个数 count 以及消息的错误接受数目 MPI ERROR 它是消息接收函数MPI Recv的最后一个参数当一个接收者从不同进程接收不同大小和不同标签的消息时 消息的状态信息非常有用 消息状态 假设多个客户进程发送消息给服务进程请求服务 通过消息标签来标识客户进程 从而服务进程采取不同的服务while true MPI Recv received request 100 MPI BYTE MPI Any source MPI Any tag comm 2020年3月 MPI并行程序设计 status参数 当使用MPI ANY SOURCE或 和MPI ANY TAG接收消息时如何确定消息的来源source和tag值呢 在C中 status MPI SOURCE status MPI TAG Status还可用于返回实际接收到消息的长度intMPI Get count MPI Statusstatus MPI Datatypedatatype int count INstatus接收操作的返回值 INdatatype接收缓冲区中元素的数据类型 OUTcount接收消息中的元素个数 2020年3月 MPI并行程序设计 分析greetings include include mpi h main intargc char argv intnumprocs 进程数 该变量为各处理器中的同名变量 存储是分布的 intmyid 我的进程ID 存储也是分布的 MPI Statusstatus 消息接收状态变量 存储也是分布的 charmessage 100 消息buffer 存储也是分布的 初始化MPI MPI Init 2020年3月 MPI并行程序设计 分析greetings if myid 0 建立消息 sprintf message Greetingsfromprocess d myid 发送长度取strlen message 1 使 0也一同发送出去 MPI Send message strlen message 1 MPI CHAR 0 99 MPI COMM WORLD else my rank 0 for source 1 source numprocs source MPI Recv message 100 MPI CHAR source 99 MPI COMM WORLD 关闭MPI 标志并行代码段的结束 Endmain 2020年3月 MPI并行程序设计 Greetings执行过程 假设进程数为3 进程0 进程1 进程2 rank 0 rank 1 rank 2 Recv Recv Send Send 2020年3月 MPI并行程序设计 运行greetings dair node01 mpicc ogreetinggreeting c dair node01 mpirun np4greetingGreetingsfromprocess1 Greetingsfromprocess2 Greetingsfromprocess3 dair node01 计算机打印字符 我们输入的命令 2020年3月 MPI并行程序设计 现在您已经能够用MPI进行并行编程了 点对点通信 通信模式 通信模式 CommunicationMode 指的是缓冲管理 以及发送方和接收方之间的同步方式 共有下面四种通信模式同步 synchronous 通信模式缓冲 buffered 通信模式标准 standard 通信模式就绪 ready 通信模式 点对点通信 同步通信模式 同步通信模式 只有相应的接收过程已经启动 发送过程才正确返回 因此 同步发送返回后 表示发送缓冲区中的数据已经全部被系统缓冲区缓存 并且已经开始发送 当同步发送返回后 发送缓冲区可以被释放或者重新使用 点对点通信 缓冲通信模式 缓冲通信模式 缓冲通信模式的发送不管接收操作是否已经启动都可以执行 但是需要用户程序事先申请一块足够大的缓冲区 通过MPI Buffer attch实现 通过MPI Buffer detach来回收申请的缓冲区 采用缓存通信模式 消息发送能否进行及能否正确返回不依赖于接收进程 完全依赖于是否有足够的通信缓冲区可用 当缓存发送返回后并不意味者该缓冲区可以自由使用 只有当缓冲区中的消息发送出去后才可以释放该缓冲区 点对点通信 标准通信模式 标准通信模式 是否对发送的数据进行缓冲由MPI的实现来决定 而不是由用户程序来控制 发送可以是同步的或缓冲的 取决于实现如果MPI决定缓存将要发出的数据 发送操作不管接收操作是否执行都可以进行 而且发送操作可以正确返回而不要求接收操作收到发送的数据 由于缓存数据是需要付出代价的 它会延长数据通信的时间而且缓冲区也并不是总可以得到的 这样MPI也可以不缓存将要发出的数据 这样只有当相应的接收调用被执行后 并且发送数据完全到达接收缓冲区后 发送操作才算完成 点对点通信 就绪通信模式 就绪通信模式 发送操作只有在接收进程相应的接收操作已经开始才进行发送 当发送操作启动而相应的接收还没有启动 发送操作将出错 就绪通信模式的特殊之处就是接收操作必须先于发送操作启动 点对点通信 通信模式 MPI的发送操作支持四种通信模式 它们与阻塞属性一起产生了MPI中的8种发送操作 而MPI的接收操作只有两种 阻塞接收和非阻塞接收 非阻塞通信返回后并不意味着通信操作的完成 MPI还提供了对非阻塞通信完成的检测 主要有两种 MPI Wait函数和MPI Test函数 点对点通信 通信模式 MPI的点对点通信操作 2020年3月 MPI并行程序设计 避免死锁deadlock 发送和接收是成对出现的 忽略这个原则很可能会产生死锁 总会死锁的通信调用次序 2020年3月 MPI并行程序设计 不安全的通信调用次序 2020年3月 MPI并行程序设计 安全的通信调用次序 2020年3月 MPI并行程序设计 消息传递并行程序设计 基本的MPI基本概念点到点通信 Pointtopoint MPI中API的主要内容 为MPI最基本 最重要的内容MPI程序的编译和运行深入MPI用户自定义 派生 数据类型 User defined Derived datatype 事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区 结构 数组散元 集合通信 Collective 数据移动 数据聚集 同步基于pointtopoint构建MPI环境管理函数组 上下文和通信空间 通信子的管理实例 2020年3月 MPI并行程序设计 MPI程序的编译 mpicc编译并连接用C语言编写的MPI程序mpiCC编译并连接用C 编写的MPI程序这些命令可以自动提供MPI需要的库 并提供特定的开关选项 用 help查看 2020年3月 MPI并行程序设计 MPI程序的编译 用mpicc编译时 就像用一般的C编译器一样 还可以使用一般的C的编译选项 含义和原来的编译器相同例如 mpicc cfoo c 2020年3月 MPI并行程序设计 MPI程序的运行 MPI程序的执行步骤一般为 编译以得到MPI可执行程序 若在同构的系统上 只需编译一次 若系统异构 则要在每一个异构系统上都对MPI源程序进行编译 将可执行程序拷贝到各个节点机上通过mpirun命令并行执行MPI程序 2020年3月 MPI并行程序设计 最简单的MPI运行命令 mpirun npN其中 N 同时运行的进程数 可执行MPI程序名例如 mpirun np6cpimpirun np4hello 2020年3月 MPI并行程序设计 一种灵活的执行方式 mpirun p4pg为配置文件 其格式为 例如 注 第一行的0并不表示在node0上没有进程 这里的0特指在node0上启动MPI程序 node00 public0 dair mpi cpinode11 public0 dair mpi cpinode21 public0 dair mpi cpi这种方式允许可执行程序有不同的名字和不同的路径 2020年3月 MPI并行程序设计 完整的MPI运行方式 MPI程序的一般启动方式 mpirun np完整的MPI运行方式 mpirun mpirun options options 详细参数信息执行mpirun help 2020年3月 MPI并行程序设计 消息传递并行程序设计 基本的MPI基本概念点到点通信 Pointtopoint MPI中API的主要内容 为MPI最基本 最重要的内容MPI程序的编译和运行深入MPI用户自定义 派生 数据类型 User defined Derived datatype 事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区 结构 数组散元 集合通信 Collective 数据移动 数据聚集 同步基于pointtopoint构建MPI环境管理函数组 上下文和通信空间 通信子的管理实例 2020年3月 MPI并行程序设计 MPI数据类型 if my rank 0 建立消息 sprintf message Greetingsfromprocess d my rank 发送长度取strlen message 1 使 0也一同发送出去 MPI Send message strlen message 1 MPI CHAR 0 99 MPI COMM WORLD else my rank 0 for source 1 source p source MPI Recv message 100 MPI CHAR source 99 MPI COMM WORLD main 2020年3月 MPI并行程序设计 用户自定义数据类型 派生数据类型 目的异构计算 不同系统有不同的数据表示格式 MPI预先定义一些基本数据类型 在实现过程中在这些基本数据类型为桥梁进行转换 派生数据类型 允许消息来自不连续的和类型不一致的存储区域 如数组散元与结构类型等的传送 MPI中所有数据类型均为MPI自定义类型基本数据类型 如MPI INT MPI DOUBLE 用户定义数据类型或派生数据类型 MPI的数据类型 派生数据类型 派生数据类型可以用类型图来描述 这是一种通用的类型描述方法 它是一系列二元组的集合 可以表示成如下格式 在派生数据类型中 基类型可以是任何MPI预定义数据类型 也可以是其它的派生数据类型 即支持数据类型的嵌套定义 MPI附加数据类型 MPI提供了两个附加类型 MPI BYTE和MPI PACKED MPI BYTE表示一个字节 所有的计算系统中一个字节都代表8个二进制位 MPI PACKED预定义数据类型被用来实现传输地址空间不连续的数据项 2020年3月 MPI并行程序设计 MPI Pack intMPI Pack void inbuf 输入缓冲区起始地址 intincount 输入数据项个数 MPI Datatypedatatype 输入数据项的数据类型 void outbuf 输出缓冲区起始地址 intoutcount 输出缓冲区大小 int position 输出缓冲区当前位置 MPI Commcomm 通信域 例 packsize 0 MPI Pack 2020年3月 MPI并行程序设计 MPI Unpack intMPI Unpack void inbuf 输入缓冲区起始地址 intincount 输入数据项大小 int position 缓冲区当前位置 void outbuf 输出缓冲区起始地址 intoutcount 输出缓冲区大小 MPI Datatypedatatype 输出数据项的数据类型 MPI Commcomm 通信域 例 pos 0 MPI Unpack packbuf packsize 数据类型 MPI提供了全面而强大的构造函数 ConstructorFunction 来定义派生数据类型 数据类型 例 使用派生数据类型发送地址空间不连续数据项 doubleA 100 MPI Data typeEvenElements MPI Type vector 50 1 2 MPI DOUBLE 首先声明一个类型为MPI Data type的变量EvenElements调用构造函数MPI Type vector count blocklength stride oldtype newtype 来定义派生数据类型新的派生数据类型必须先调用函数MPI Type commit获得MPI系统的确认后才能调用MPI Send进行消息发送 数据类型 调用构造函数MPI Type vector count blocklength stride oldtype newtype 来定义派生数据类型 该newtype由count个数据块组成 而每个数据块由blocklength个oldtype类型的连续数据项组成 参数stride定义了两个连续数据块之间的oldtype类型元素的个数 因此 两个块之间的间隔可以由 stride blocklength 来表示 MPI Type vector 50 1 2 MPI DOUBLE EvenElements 函数调用产生了派生数据类型EvenElements 它由50个块组成 每个块由一个双精度数组成 后跟一个MPI DOUBLE 8字节 的间隔 接在后面的是下一块 2020年3月 MPI并行程序设计 用MPI Type vector进行矩阵的行列置换 以C语言的数组表示为例 将矩阵的一列送到另一数组的一行中 2020年3月 MPI并行程序设计 MPI Type vector函数原型 MPI Type vector 函数首先通过连续复制若干个旧数据类型形成一个 块 然后通过等间隔地复制该块形成新的数据类型 块与块之间的空间是旧数据类型的倍数 include mpi h intMPI Type vector intcount 数据块个数 非负整数 intblocklen 块中元素个数 非负整数 intstride 块间起始地址间隔 非负整数 MPI Datatypeold type 原始数据类型 MPI Datatype newtype 派生数据类型指针 2020年3月 MPI并行程序设计 MPI Type vector应用示意 用MPI Vector进行矩阵的行列置换 floatA 10 10 MPI Datatypecolumn mpi t MPI Type vector 10 1 10 MPI FLOAT 2020年3月 MPI并行程序设计 MPI Type indexed函数原型 include mpi h intMPI Type indexed intcount 数据块的个数 数据块间不连续 intblocklens 每一数据块中元素的个数 为一个非负整型数组 intindices 每一块数据在原始数据类型中的起始位置 整型数组 MPI Datatypeold type 原始数据类型 MPI Datatype newtype 派生数据类型指针 2020年3月 MPI并行程序设计 MPI Type struct 允许每个块包含不同数据类型的拷贝 2020年3月 MPI并行程序设计 派生数据类型的应用 提交 intMPI Type commit MPIDatatype datatype 将数据类型映射进行转换或 编译 一种数据类型变量可反复定义 连续提交释放 intMPI Type free MPI Datatype datatype 将数据类型设为MPI DATATYPE NULL 2020年3月 MPI并行程序设计 消息传递并行程序设计 基本的MPI基本概念点到点通信 Pointtopoint MPI中API的主要内容 为MPI最基本 最重要的内容MPI程序的编译和运行深入MPI用户自定义 派生 数据类型 User defined Derived datatype 事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区 结构 数组散元 集合通信 Collective 数据移动 数据聚集 同步基于pointtopoint构建MPI环境管理函数组 上下文和通信空间 通信子的管理实例 2020年3月 MPI并行程序设计 集合通信CollectiveCommunication 特点通信空间中的所有进程都参与通信操作每一个进程都需要调用该操作函数一到多多到一同步 2020年3月 MPI并行程序设计 MPI集合通信函数 All 表示结果到所有进程 V Variety 被操作的数据对象和操作更为灵活 2020年3月 MPI并行程序设计 数据移动BroadcastScatterGatherAllgatherAlltoall 2020年3月 MPI并行程序设计 数据聚集ReduceAllreduceReduce scatterScan MPI预定义全局数据运算符 MPI MAX MPI MIN MPI SUM求和MPI PROD求积MPI LAND逻辑与MPI LOR逻辑或MPI MAXLOC MPI MINLOC最大 小值求下相应位置 2020年3月 MPI并行程序设计 intp myrank floatbuf MPI Commcomm MPI Init Broadcast 数据广播 intMPI Bcast void buffer 发送 接收buf intcount 元素个数 MPI Datatypedatatype introot 指定根进程 MPI Commcomm 根进程既是发送缓冲区也是接收缓冲区 Broadcast程序示例 2020年3月 MPI并行程序设计 Gather 数据收集 intp myrank floatdata 10 分布变量 float buf MPI Commcomm MPI Init data MPI Gather data MPI Gather data MPI Gather Process0myrank 0 Process1myrank 1 Processp 1myrank p 1 根进程接收其他进程来的消息 包括根进程 按每个进程在通信组中的编号依次联接在一起 存放在根进程的接收缓冲区中 intMPI Gather void sendbuf intsendcnt MPI Datatypesendtype void recvbuf intrecvcount MPI Datatyperecvtype introot MPI Commcomm buf 2020年3月 MPI并行程序设计 Scatter 数据分散 intp myrank floatdata 10 float buf MPI Commcomm MPI Init data MPI Scatter data MPI Scatter data MPI Scatter Process0myrank 0 Process1myrank 1 Processp 1myrank p 1 根进程中存储了p个消息 第i个消息将传给第i个进程 intMPI Scatter void sendbuf intsendcnt MPI Datatypesendtype void recvbuf intrecvcnt MPI Datatyperecvtype introot MPI Commcomm buf 2020年3月 MPI并行程序设计 Reduce 全局数据运算 intp myrank floatdata 0 0 floatbuf MPI Commcomm MPI Init data MPI Scatter data MPI Scatter data MPI Scatter Process0myrank 0 Process1myrank 1 Processp 1myrank p 1 对组中所有进程的发送缓冲区中的数据用OP参数指定的操作进行运算 并将结果送回到根进程的接收缓冲区中 intMPI Reduce void sendbuf void recvbuf intcount MPI Datatypedatatype MPI Opop introot MPI Commcomm buf 2020年3月 MPI并行程序设计 注意事项 组内所有进程都参与才能完成各进程的调用形式都相同常见问题有的调用 有的不调用 主进程广播 从进程没有广播 调用参数不对 若使用一对多或者多对一通信 则各个进程所使用的ROOT值必须都是相同的 2020年3月 MPI并行程序设计 消息传递并行程序设计 基本的MPI基本概念点到点通信 Pointtopoint MPI中API的主要内容 为MPI最基本 最重要的内容MPI程序的编译和运行深入MPI用户自定义 派生 数据类型 User defined Derived datatype 事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区 结构 数组散元 集合通信 Collective 数据移动 数据聚集 同步基于pointtopoint构建MPI环境管理函数组 上下文和通信空间 通信子的管理实例 2020年3月 MPI并行程序设计 MPI环境管理 MPI起动与结束 MPI Init MPI Initialized 测试是否已执行MPI Init MPI Finalize MPI计时函数doubleMPI Wtime 返回自过去某一时刻调用时的时间间隔 以秒为单位 doubleMPI Wtick 返回用作硬件计时的两次脉冲间的间隔时间 以秒为单位 组 上下文和通信空间管理 2020年3月 MPI并行程序设计 通信域 通信域 描述进程间的通信关系 包括通信上下文 区别不同的通信域 一个上下文所发送的消息不能被另一个上下文所接收进程组 多个进程的有序集合虚拟拓扑 多个进程在逻辑上的排列关系 反映了进程间的通信模型属性 用户可通过自定义的属性 将任意信息附加到通信域上 2020年3月 MPI并行程序设计 预定义的进程组和通信域 MPI GROUP NULL无效进程组句柄MPI COMM NULL无效通信域句柄MPI GROUP EMPTY有效进程组句柄 包括元素个数为0MPI COMM SELF有效通信域句柄 包括元素仅为当前进程MPI COMM WORLD有效通信域句柄 包括元素为所有进程 2020年3月 MPI并行程序设计 进程组 不同的进程可以有不同的分工 可为之建立不同的通信域 这要借助进程组完成 得到通信域对应的进程组 MPI COMM GROUP comm group 根据组创建新的通信域 MPI COMM CREATE comm g ncomm 2020年3月 MPI并行程序设计 进程组操作 比较 MPI GROUP COMPARE g1 g2 result 并 MPI GROUP UNION g1 g2 newg 交 MPI GROUP INTERSECTION g1 g2 newg 差 MPI GROUP DIFFERENCE g1 g2 newg 2020年3月 MPI并行程序设计 进程组的例子 2020年3月 MPI并行程序设计 通信域 比较MPI COMM COMPARE comm1 comm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 敬老院服务改进承诺书(6篇)
- 2025北京协和医院妇产科学系中心实验室科研人员招聘模拟试卷及完整答案详解
- 父母的恩情永远铭记于心作文6篇范文
- 2025贵州装备制造职业学院引进高层次人才(博士)、高技能人才模拟试卷及答案详解(夺冠系列)
- 2025湖南郴州市汝城县事业单位公开招聘引进高层次和急需紧缺人才21人模拟试卷含答案详解
- 2025年河北石家庄工程职业学院招聘专任教师56名模拟试卷及一套答案详解
- 吉林省普通高中G8教考联盟2024-2025学年高一下学期期末考试地理试题(A卷)(学生版)
- 2025福建漳州城投建工招聘2人考前自测高频考点模拟试题及参考答案详解
- 湖南省名校联考联合体2024-2025学年高一下学期期末考试地理试卷(解析版)
- 企业合同归档分类方案示例
- 涟源2022年事业编招聘考试《公共基础知识》真题及答案解析【可复制版】
- GB/T 17553.1-1998识别卡无触点集成电路卡第1部分:物理特性
- 2023年西藏山南雅砻天然饮品有限公司招聘笔试模拟试题及答案解析
- 海南矿产资源概况
- (通用版)水利安全员考试试题库及答案
- 编版一年级下册 《荷叶圆圆》2022年小学语文作业设计
- 施工现场安全检查记录表(周)以及详细记录
- 汽车配件购销合同集合
- 雨污水管道表格全全套资料
- 石库门——中西合璧建筑的典范
- 数独比赛六宫练习题96道练习
评论
0/150
提交评论