并行计算—结构算法编程 中文删减修正版.ppt

并行计算—结构算法编程 中文删减修正版.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Process P: M=10; L1: send M to Q; L2: M=20; goto L1; Process Q: L1: S= -100; L2: receive S from P; X=S+1; 例2.1 消息传递中的发送和接收缓冲 M 称为发送消息缓冲 (send message buffer, or send buffer) S 称为接收消息缓冲 (receive message buffer, or receive buffer) 2 消息传递方式 三种通信模式的比较 2 消息传递方式 Process P: M=10; send M to Q; do some computation which does not change M; wait for M to be sent; M=20; Process Q: S=-100; receive S from P; do some computation which does not use S; wait for S to be received; X=S+1; 例2.2 非阻塞模式下, 强制进程等待直到安全时再继续执行 非阻塞模式本身也会带来一些额外开销: 作为临时缓冲区用的内存空间 分配缓冲区的操作 将消息拷入和拷出临时缓冲区 执行一个额外的检测和等待函数 2 消息传递方式 消息传递的特点: 在消息传递模型中, 一个并行应用由一组进程组成, 每个进程的代码是本地的, 只能访问私有数据, 进程之间通过传递消息实现数据共享和进程同步. 优点: 用户可以对并行性的开发、数据分布和通信实现完全控制. 缺点: 要求程序员显式地处理通信问题, 如, 消息传递调用的位置, 数据移动, 数据复制, 数据操作, 数据的一致性等等. 对大多数科学计算程序来说, 消息传递模型的真正困难还在于显式的域分解, 也就是说, 将对相应数据的操作限定在指定的处理器上进行, 在每个处理器上只能看见整个分布数据的一部分. 无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来. 大量的散布在程序各处的域分解要求整个程序由串行到并行的转换一次性实现, 而共享存储方法允许在现有的串行代码中插入并行说明从而实现逐步转换.与之相比, 这是消息传递的一个明显的缺点. 2 消息传递方式 分布存储系统并行编程 14.1 基于消息传递的编程 14.2 MPI并行编程 14.3 PVM并行编程 14.4 基于数据并行的并行编程 14.5 HPF并行编程 MPI并行编程 1 MPI中的消息 2 MPI中的消息信封 3 MPI中的四种通信模式 4 点对点的通信 5 群集通信 6 MPI扩展 7 例子:计算Pi的MPI程序 1 MPI中的消息 第五讲 #include mpi.h int foo(i) int i; {...} main(argc, argv) int argc; char* argv[] { int i, tmp, sum=0, group_size, my_rank, N; MPI_Init(argc, argv); MPI_Comm_size(MPI_COMM_WORLD, group_size); MPI_Comm_rank(MPI_COMM_WORLD, my_rank); if (my_rank==0) { printf(Enter N:); scanf(%d,N); for (i=1;igroup_size;i++) MPI_Send(N, 1, MPI_INT, i, i, MPI_COMM_WORLD); for (i=my_rank;iN;i=i+group_size) sum=sum+tmp; for (i=1;igroup_size;i++) { MPI_Recv(tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,status); sum=sum+tmp; } printf(\n The result = %d, sum); } else { MPI_Recv(N,1,MPI_INT,i,i,MPI_COMM_WORLD,status); for (i-my_rank;iN;i=i+group_size) sum=sum+foo(i); MPI_Send(sum,1,MPI_INT,0,i,MPI_COMM_WORLD); } MPI_Finalize(); } 例1.1 一个计算∑foo(i)的MPI SPMD消息传递程序, 存放在文件 “myprog.c”中 初始化MPI环境 得到缺省的进程组大小 得到每个进程在组中的编号

文档评论(0)

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

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

1亿VIP精品文档

相关文档