网站大量收购独家精品文档,联系QQ:2885784924

第七章MPI编程3.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章MPI编程3

并行程序设计-23 * * 内容提要 一 并行编程硬件基础 (3学时) 二 并行编程软件基础 (3学时) 三 多线程编程基础 (2学时) 四 Linux多线程编程 (2学时) 五 Windows多线程编程 (3学时) 六 OpenMP编程 (7学时) 七 MPI编程 (4学时) 八 其他编程语言和方法 (2学时) 九 并行程序设计的应用实例 (2学时) MPI简介 MPICH的安装和配置 MPI编程基础 4. MPI“点到点(Point-to-Point)”通信 5. MPI群体通信 (本节课内容) 6. MPI的组与通信子 7. MPI程序分析与优化 七 MPI编程 * * * * 5 MPI群体通信(集合通信 or 组通信) “点对点”通信满足个体之间任何的消息交换要求,群体之间采用更简洁的手段,将可以大大简化并行程序开发的工作量。 群体通信(collective communication) :涉及通信子中全部进程的通信模式 一个组中所有成员都要参加,但所扮演的角色可能不一样 注: 在点对点通信中,通信参与双方调用不同的函数 目的 程序代码简洁 便于MPI runtime根据数据交换的模式提高效率 使用MPI_Send/MPI_Recv交换数据 if(myRank==0) { n=BodyNum; t=TimeSteps; for(i=1;iproc; i++){ MPI_Send(n, 1, MPI_INT, i, 10, MPI_COMM_WORLD); MPI_Send(t, 1, MPI_INT, i, 20, MPI_COMM_WORLD); } } else { MPI_Recv(n, 1, MPI_INT, 0, 10, MPI_COMM_WORLD, status); MPI_Recv(t, 1, MPI_INT, 0, 20, MPI_COMM_WORLD, status); } “点对点”通信例子 * * 使用群体通信交换数据 if(myRank==0) { n=BodyNum; t=TimeSteps; } MPI_Bcast(n, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(t, 1, MPI_INT, 0, MPI_COMM_WORLD); 对应的群体通信例子 * * * * 三类群体通信(实现的三种功能) 数据交换 广播 散播 收集 全交换 全局计算 规约 进程强制进度同步 障碍同步 * * Broadcast 广播 (1→N) 把一个进程中的某个数据广播给同一通信子中其余进程 A0 A0 A0 A0 A0 A0 A0 data processes * * MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) root:以该进程为根,向组内所有进程发送消息,属于comm的一个进程 在root进程上:把(buffer, count, datatype)指定的数据(标量或向量),作为一条message,分别向通信子对象comm中的每个进程(包括root自己)发送 在comm中的每个进程(包括root自己)上:把从root所接收message中的数据存储在(buffer, count)指定的缓冲区中 datatype是缓冲区元素的类型,可以是MPI基本类型,也可以是派生数据类型 comm中的每个进程都需要执行MPI_Bcast,而且它们的参数root和comm必须完全一致 * * 群体通信 MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) 等价MPI_Send/MPI_Recv If(myRank==root) for(i=0; iprocs; i++) { if(i==root) continue; MPI_Send(buffer, count, datatype, i, tag, comm) } else MPI_Recv(buffer, count, datatype, root, tag, comm, status); * * Scatter 散播(1→N) 从一个通信子的根进程分别向组内进程发送不同数据 这一组进程用一个通信子表示 A0 A1 A2 A3 A4 A5 data

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档