当前位置: 首页 > news >正文

如何掌握多处理器编程技巧

每逢我们在多处理器平台上进行编程时,往往会有这么一种感觉:即使已熟练掌握了系统提供的各种同步原语,但所编制的并行程序的实际性能似乎总有些差强人意,并不十分理想。

究其原因,问题的根结在于多处理器编程应是一门科学和艺术完美结合的学科。若要在多处理器系统结构上编制出性能良好的并行程序,要求设计者不仅要精通多处理器系统结构、并行算法以及一些系统构建工具,还应能基于一种设计理念,充分发挥个人的想象空间,合理搭配这些知识和资源,从而和谐地构建完整的系统,使设计者能比底层硬件和操作系统“做得更好”。也就是说,在编写多处理器程序时,要能同时从宏观和微观两种角度分析问题,并能在这两种角度之间灵活地转换。


自20世纪中叶第一台通用电子计算机研制成功以来,程序的编制大多是基于顺序计算模型的,程序的执行过程是操作的有序序列。由于顺序计算机能够用图灵机精确地描述,因此顺序计算的编程能在一组易于理解且完备定义的抽象之上进行,而不需要了解底层的细节。近年来,尽管单处理器仍在发展,但由于指令级并行的开发空间正在减少,再加上散热等问题限制了时钟频率的继续提高,所以单处理器发展的速度正在减缓,这最终导致了起源于在单独一个晶片上设计多个内核的多处理器系统结构的出现。多处理器系统结构允许多个处理器执行同一个程序,共享同一程序的代码和地址空间,并利用并行技术来提高计算效率。在这种计算模型中,并发程序的执行可以看做是多个并发线程对一组共享对象的操作序列,为了在这种异步并发环境中获得更好的性能,底层系统结构的细节需要呈现给设计者。


作为一名优秀的程序设计员,在编写多处理器程序之前首先应弄清楚:多处理器计算机的能力和限制是什么;在异步并发计算模型中什么问题是可解决的,什么问题是不可解决的;是什么使得某些问题很难计算,而又使另一些问题容易计算。这要求设计者具备一定的多核并行计算理论基础知识,掌握多处理器系统结构上并发计算模型的可计算性理论及复杂性理论。其次,应掌握基本的多核平台上的并行程序设计技术,包括并行算法、同步原语以及各种多核系统结构。


Maurice Herlihy 教授和 Nir Shavit教授在并发程序设计领域具有很深的造诣,并拥有40年以上一起从事并发程序设计教学的合作经验。他们对多处理器并行程序设计技术做出了巨大的贡献,并因此而成为2004年ACM/EATCS哥德尔奖和2012年分布式计算领域Dijkstra奖的共同获得者。《多处理器编程的艺术》由他们合著的专著致力于解决如何采用更好的并行算法来克服多核并发程序并行度低的问题。


 


Amdahl定律早已明确地告诉我们,从程序本身可获得的并行度是有限的,加速比的提高主要取决于程序中必须增加的串行执行部分,而这部分又往往包含着具有相对较高开销的通信和协作。因此,在多处理器系统结构上,如何提高程序中必须串行部分的并行度,以及降低并行处理器中远程访问的时延是我们目前面临的两大技术挑战。这些问题的有效解决,必须依靠软件技术和硬件技术的改进和发展。本书则侧重于对前一个挑战的研究。


作者先从宏观的抽象角度出发,在一个理想化的共享存储器系统结构中研究各种并行算法的可计算性及正确性。通过对这些经典算法的推理分析,向读者揭示了现代协作范例和并发数据结构中所隐藏的核心思想,使读者学会如何分析饥饿和死锁等微妙的活性问题,深层次地研究现代硬件同步原语所应具有的能力及其特性。随后,从微观的实际角度出发,针对当今主流的多处理器系统结构,设计了一系列完美高效的并行算法及并发数据结构,并对各种算法的效率及其机理进行了分析。所有的设计全部采用Java程序设计语言详细地描述,可以非常容易地将它们扩展到实际应用中。


本书的前6章讲述了多处理器程序设计的原理部分,着重于异步并发环境中的可计算性问题,借助于一个理想化的计算模型来阐述如何描述和证明并行程序的实际执行行为。由于其自身的特点,多处理器程序的正确性要比顺序执行程序的正确性复杂得多,书中为我们展现了一系列不同的辅助论证工具,令人有耳目一新之感。随后的11章阐述了多处理器程序设计的实践部分。由于在多处理器环境中编写程序时,底层系统结构的细节并不像编写顺序程序那样被完全隐藏在一种编程抽象中,因此,本书附录B介绍了多处理器硬件的基础知识。最后的第18章介绍了当今并发问题研究中最先进的事务方法,可以预言这种方法在今后的研究中将会越来越重要。

相关文章:

  • 8步帮你解决面试遇到的编程问题
  • 如何一年完成MIT33门计算机课程?
  • 3月4日 与柳传志面对面(谁是这个时代的思想家)
  • 算法心得:高效算法的奥秘
  • 设计模式之禅(第2版)
  • 大规模分布式系统架构与设计实战
  • 2018年值得关注的10种机器学习工具
  • 堕落Java vs 新贵 Python,2018 年最应该学习哪一门编程语言?
  • 为什么2018年将是混合云的元年?
  • 开源软件贡献者Top 10!第一名当之无愧!
  • TIOBE 年度榜单揭晓:C 语言夺冠,Python 紧随其后
  • 微服务高可用架构-基于支付场景的实战
  • 福利丨好书申请免费送【1.12】
  • 张小龙现场约战跳一跳,曾最高6000分!
  • 借鉴德国工业4.0推动中国制造业转型升级
  • 【React系列】如何构建React应用程序
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Docker入门(二) - Dockerfile
  • dva中组件的懒加载
  • PHP CLI应用的调试原理
  • Quartz初级教程
  • quasar-framework cnodejs社区
  • rabbitmq延迟消息示例
  • React+TypeScript入门
  • SQLServer之创建数据库快照
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 规范化安全开发 KOA 手脚架
  • 技术发展面试
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 强力优化Rancher k8s中国区的使用体验
  • 悄悄地说一个bug
  • 树莓派 - 使用须知
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 阿里云ACE认证学习知识点梳理
  • ​渐进式Web应用PWA的未来
  • ![CDATA[ ]] 是什么东东
  • #HarmonyOS:Web组件的使用
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (6)STL算法之转换
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (十六)Flask之蓝图
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)memcache、redis缓存
  • .bat文件调用java类的main方法
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 无限分类
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试