并行程序设计心得.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并行程序设计心得

1、MPI实质上是多进程,并且不支持多线程; 2、初始化时在每个处理机(结点)上创建一个进程,执行期间进程数不能动态改变; 3、MPI其实就是一种在各进程之间进行通讯的标准; 4、并行程序设计最常用的两种方法: 1、共享变量方法——利用共享存储器中共享变量来实现处理机间的通信,它主要用在共享存储结构中(OpenMP) 2、消息传递方法——主要特点是不同处理机间必须通过网络传送消息来相互通信,并达到任务间需要的同步操作,它主要应用于分布式存储结构中(MPI) 5、一个基本的MPI 程序的流程图 对于多核程序设计的一点总结多核下的多线程程序设计与传统的单核下的多线程程序设计有着一定的差别,在单CPU下,是多个线程在同一个CPU上并发地执行,而在多核下,则是由多个线程在多个核上并行地执行。 ????但是,目前的程序设计中对于多核的利用并没有达到预期的效果。因此,为了能够在多核的环境下设计出更适合多核系统的程序,则是一个挑战。 ????要做到这一点,就必须将应用程序看做是众多相互依赖的任务的集合,将应用程序划分成多个独立的任务,并确定这些任务之间的相互依赖关系,这就称为分解(decomposition)。如下如示: 分解方式 ??????????????????????????设计? ???????????????????????????????????说明 任务分解 ????????????不同的程序行为采用不同的线程实现 ???????常用于GUI应用程序 数据分解 ???????????多个线程对不同的数据块执行相同的操作 ???????常用于音频、图像处理和科学计算应用程序 数据流分解 ???????????一个线程的输出作为另一个线程的输入 ???????应注意尽量避免延迟 ????任务分解:对应用程序根据其执行的功能进行分解的过程称为任务分解(task?decomposition)。根据这种方法,就能够对众多的独立任务进行分类。如果其中两个任务能够同时运行,那么开发人员就应该对其进行调度,形成二者之间的并行执行。 ????数据分解:数据分解也称为数据级并行(data-level?parallelism)。是将应用程序根据各任务所处理的数据而非按任务来进行分解的方法,即以数据为中心。一般而言,能够按照数据分解方式进行分解的应用程序都包含多个线程,这些线程分别对不同的数据对象执行相同的操作。 ????数据流分解:在很多情况下,当对一个问题进行分解时,关键问题不在于采用一些什么任务来完成这个工作,而在于数据在这些任务之间是如何流动的。这个时候就要采用数据流分解方式,如典型的生产者/消费者问题。 ????对于任务分解,有两个需要注意的地方: ????1.?划分的对象是计算,将计算划分为不同的任务 ????2.?划分后,研究不同任务所需的数据,如果这些数据不相交,则证明划分是成功的,如果数据有相当程序的相交,意味着要重新进行数据划分和功能划分。 ????如在一个气候模型中,需要考虑到地表模型、水文模型与海洋模型等多种情况,那么就应该将这几种模型划分成不同的任务,再分别进行并行地运算。 ????对于数据分解,划分的对象是数据,可以是算法的输入数据、中间处理数据和输出数据。在划分时应该考虑到数据上的相应操作。 ????最简单的情况下,比如对1000万个数进行相加,可以对其进行数据上的分解,用多个线程来分别计算不同批次的数据。然后再将计算的中间数据加到一起成为最终的结果。1.?线程过多 线程并不是越多越好,对于某个程序,如果线程过多反而会严重地降低程序的性能。这种影响主要在于: 将给定的工作量划分给过多的线程会造成每个线程的工作量过少,因此可能导致线程启动和终止的开销比程序实际工作的时间还要多。 同时,太多并发线程的存在将导致共享有限硬件资源的开销增大。如保存和恢复寄存器状态的开销、保存和恢复线程cache状态的开销、废除虚存的开销、线程聚集在一起等待获取某个锁。 怎样解决这个问题: ? 限制可运行线程的个数 ? 将计算线程与I/O线程分离开 ? 使用已有的技术,如OpenMP,线程池等 2.?数据竞争、死锁 死锁,想必大家都很熟悉。这里谈谈一些简单的避免死锁的规则: ? 加锁的顺序是关键,使用嵌套的锁时必须保证以相同的顺序获取锁 ? 防止发生饥饿:即这个代码的执行是否一定会结束。 ? 不要重复请求同一个锁 ? 越复杂的加锁方案越有可能造成死锁—设计应力求简单 3.?竞争激烈的锁 即使是正确使用锁来避免数据竞争,但如果各线程对锁的竞争很激烈,那么也会引发性能问题。即很多个线程来竞争同一个锁。在这个情况下,可以考虑将资源划分成若干个部分,然后用彼此独立

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档