- 1、本文档共129页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MPI并行程序设计-129
并行程序设计的建议 优化并行算法 大并行粒度 顾及负载平衡 尽量减少通信次数 避免大消息(1M) 避免消息缓冲区的溢出,且效率较低 避免大消息打包 内存拷贝开销大 * MPI并行程序设计 */129 * MPI并行程序设计 */129 谢谢! * * MPI_Gatherv int MPI_Gatherv ( void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int *recvcnts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm ) 参数: sendbuf 发送缓冲区的起始位置 sendcount 发送元素个数 sendtype 发送数据类型recvcounts 整型数组(大小等于组的大小),用于指明从各进程要接收的元素的个数(仅对根进程有效) displs 整型数组(大小等于组的大小). 其元素 i指明要接收元素存放位置相对于接收缓冲区起始位置的偏移量 (仅在根进程中有效) recvtype 接收数据类型 root 通过rank值指明接收进程comm 通信空间 * MPI并行程序设计 */129 Gather与GatherV * MPI并行程序设计 */129 应用Vector派生数据类型 Scatter与ScatterV * MPI并行程序设计 */129 讲座内容 基本的MPI 基本概念 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例 * MPI并行程序设计 */129 MPI环境管理 MPI起动与结束: MPI_Init(); MPI_Initialized();测试是否已执行MPI_Init(); MPI_Finalize(); MPI计时函数 double MPI_Wtime();返回自过去某一时刻调用时的时间间隔,以秒为单位. double MPI_Wtick();返回用作硬件计时的两次脉冲间的间隔时间,以秒为单位. 组,上下文和通信空间管理(略). * MPI并行程序设计 */129 讲座内容 基本的MPI 基本概念 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例 * MPI并行程序设计 */129 实例分析 求PI 向量点积算法及程序 矩阵向量相乘算法及程序 矩阵乘积算法及程序 * MPI并行程序设计 */129 实例分析:求PI * MPI并行程序设计 */129 PI串行代码 h=1.0/(double)n; sum=0.0; for (i=1; i=n; i++) { x=h*((double)i – 0.5); sum += f(x); } pi=h*sum; * MPI并行程序设计 */129 double f(double a) { return (4.0/(1.0+a*a)); } PI并行代码 h=1.0/(double)n; sum=0.0; for (i=myid+1; i=n; i+=numprocs) { x=h*((double)i – 0.5); sum += f(x); } mypi=h*sum; MPI_Reduce(mypi, pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); * MPI并行程序设计 */129 double f(double a) { return (4.0/(1.0+a*a)); } cpi.c #include mpi.h #include stdio.h #include math.h double f(
文档评论(0)