首页>参考读物>计算机科学与技术>软件与程序设计

Visual C++并行编程实战
作者 : (美)Colin Campbell; Ade Miller  著
译者 : 凌杰 译
出版日期 : 2012-08-06
ISBN : 978-7-111-38806-7
定价 : 59.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 180
开本 : 16
原书名 : Visual C++ 2010并行编程实战
原出版社: O'Reilly Microsoft
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书通过基于Microsoft Visual C++系统开发的并行模式库(PPL)和异步代理库的代码示例,系统阐述了在并行编程领域流行的6大模式,为并行领域的项目开发提供一套优秀的解决方案架构。本书倾向于设计思维,强调实践,引导读者更多地从设计的角度进入并行编程领域,而把并行中的细节问题交给可靠的设计模式和程序库。书中提供了大量极具启发性的、可供扩展的C++代码。本书是进入并行编程领域的最佳选择之一。
本书共7章。第1章阐释了开发者在开发并行程序时所面临的问题,并由此引出本书的主要内容。第2~3章从仅依靠控制流来完成相关操作方面介绍了并行循环和并行任务。第4~5章从在控制流和数据流的共同协作下完成并行化操作方面介绍了并行聚合和待定计算。第6~7章从更高阶的应用方面介绍了动态任务并行化和管道问题。同时本书还提供了更多关于并行应用的知识,包括任务调度器与资源管理器、并行应用程序的调试与分析以及本书涉及的术语。通过本书中介绍的设计模式,读者可以极大地改善应用程序在多核计算机上的性能。本书介绍的这些模式不仅适用于现阶段的硬件环境,同时也方便日后扩展使用。

图书特色

这本书通过将并行模式库和异步代理库引入设计模式来告诉程序员如何使用它们,方便开发者快速上手编写并行程序,并且可以提高程序的执行效率。我相信,这本书以其对并行编程模式的强调和先进的编程模型,迈出了将并行化编程推入主流的重要一步。
—— Tony Hey 微软研究院副总裁

当前IT产业处在重要的转折点——并行硬件+移动设备=未来20年主流平台的便携式超级计算机,本书应势而生。这本书中阐释的Visual C++ 2010并行模式库(PPL)有助于将应用程序领进并行化的大门。
—— Herb Sutter 微软首席架构师


在当前多核体系结构中,习惯于编写所有程序员熟悉的那种串行化代码显然已无法满足用户的性能需求,并行编程将是提升系统性能的最简单、最直接的途径。
并行编程一直被认为只有专家才能涉足的领域,同时也经常被视为一个雷区,其中隐藏着各种难以重现的、诡异的软件缺陷。幸运的是,并行模式库(PPL)和异步代理库的出现将我们引入了一种全新的并行编程模型,这大大地简化了编写并行程序的工作。当然,这一切要归功于一系列精致而复杂的算法,它们能够很好地适应多核体系结构中的动态分布式计算。
通过学习本书介绍的设计模式,读者可以极大地改善应用程序在多核计算机上的性能。本书介绍的这些模式不仅适用于现阶段的硬件环境,同时也方便日后扩展使用。随着计算机并行架构的不断提升,应用程序的表现也会越来越好。


作者简介

Colin Campbell 资深并发编程专家,Model Computation公司的创始人,与人合著有《Model-Based Software Testing and Analysis in C#》、《Parallel Programming with Microsoft .NET》等经典著作,还发表了若干篇针对软件分析(严格数学方法)的学术论文。

Ade Miller 资深并发编程专家,微软研究院首席软件开发工程师,担任基于Windows HPC Server团队的项目经理和微软公司模式与实践团队的开发主管。目前主要关注并行和分布式计算,以及使用工程领导方式改善团队开发的方式。他与人合著有《C++ AMP》、《Parallel Programming with Microsoft .NET》等经典著作。

译者简介

凌杰 自由软件开发者,毕业于浙江大学。专注于C/C++领域多年,拥有丰富的国内外大型研究型项目开发及管理经验,并长年担任上海交通大学饮水思源BBS的C/C++版版主。

图书前言

这是一本介绍并行编程模式的书。在这本书中,我们使用了大量基于Microsoft Visual C++系统开发的代码示例,用以说明并行模式库(Parallel Patterns Library,PPL)和异步代理库(Asynchronous Agents Library)的使用方法。通过学习这本书中介绍的设计模式,你可以大大改善应用程序在多核计算机上的性能。而且这些模式不仅适用于现阶段的硬件环境,同时也为日后环境发展预留了扩展空间。相信随着计算机并行架构不断提升,它们的表现也会越来越好。
谁需要这本书
  这本书面向那些在Windows操作系统下编写本地化代码注1的程序员。当然,PPL库本身是可移植性的,因此,理论上说它并不局限于Windows平台。即便你没有并行编程方面的经验和相关知识也没有关系。不过你最好具备一些C++方面的基础知识,例如模板、标准模板库(STL)以及lambda表达式(这是Microsoft Visual Studio 2010开发系统中新增的C++特性)。另外,对于线程和进程的运行方式,你最好也应该了解一些最基本的内容。
  注意:书中的所有例子都是用C++语言写的,其中用到了并行模式库(PPL)。完整的代码可以在CodePlex网站上找到(网址为http://parallelpatternscpp.codeplex.com/)。
  此外,这本书还有一本姐妹篇:《Parallel Programming with Microsoft .NET》,其中介绍的模式内容几乎完全相同,只不过那些代码是托管的罢了。
为什么需要这本书
  Visual Studio 2010所提供的高级并行编程功能非常简单实用,学习它们绝对要比你重新开始学习并行编程要容易得多。
  例如,并行模式库(PPL)和异步代理库就是为那些编写并行程序的C++程序员准备的。它们大大简化了应用程序实现并行化和并发的过程。PPL会动态检测运行时环境的并行度,以便充分利用所有的处理器资源来提升效率。此外,PPL及代理库在工作量分配以及线程中的任务调度方面也大有作为。这些库还提供了取消功能、状态管理以及其他各种服务。它们都充分利用了Visual C++平台上的并发运行时。
  Visual Studio 2010开发系统中内置了一系列用于调试并行程序的工具。例如,并行栈窗口能查看应用程序所有线程中的调用栈信息,还能让你在线程框架和栈框架之间来回切换。并行任务窗口则与线程窗口非常相似,只不过它显示的是任务信息而非线程信息。此外,在Visual Studio分析器中,你还可以通过并发可视化工具中的视图来了解应用程序是如何与硬件设备、操作系统以及计算机上的其他进程交互的。而且,我们还可以用它找出程序性能上的瓶颈,例如内核使用率、线程竞争、跨核线程迁移、同步延迟、I/O重叠区域等各类信息。
  如果想进一步了解Microsoft公司的并行技术,建议参考附录C中的相关内容。
需要准备些什么
  本书中所有的代码示例都可以在http://parallelpatternscpp.codeplex.com/上找到,运行它们所需的系统配置如下:
     Microsoft Windows Vista SP1、Windows 7、Windows Server 2008或者Windows XP SP3 (32位或64位均可)操作系统。
     Microsoft Visual Studio 2010 SP1(用于程序性能分析的并发可视化工具只有在旗舰版(Ultimate)或者高级版(Premium)中才提供)。这里内置了支持这些示例运行的PPL和异步代理库。
如何使用本书
  本书将从设计模式的角度来阐述并行编程技术。图1列出了将要介绍的具体模式以及这些不同模式之间的关系。其中,数字代表了该模式所在的章节。
图1  并行编程模式
  如你所见,除第1章外,本书的内容大体上分为两个部分,一部分讨论数据的并行化实现;另一部分侧重于讨论任务的并行化。
  其中,只有并行循环和并行任务是只通过控制流来完成任务协调和排序的,而其他模式则需要同时利用控制流及数据流来完成相应的协调。其中的控制流实际上是指程序算法结构中的步骤序列。而数据流则通常指程序中有效的输入和输出。
引言部分
  在第1章中,我们宽泛地介绍了程序员在并行程序开发过程中所面临的性能问题,并借此引入后续内容中将要用到的基本概念。
  1.2.4节为你提供了一个表格,你可以通过它来为自己寻找适用的设计模式。
仅依靠控制流的并行化
  第2章和第3章介绍的所有操作都是仅仅依靠控制流来完成相关的任务协调和排序的:
     第2章“并行循环”:并行循环模式一般应用于对某个集合或者某个索引区间的每个元素执行相同的计算。当然,前提是集合成员之间不存在任何依赖关系。如果其中出现了有依赖关系的循环,我们就需要参考第4章中的内容了。
     第3章“并行任务”:并行任务模式一般应用于处理一系列独立的异步操作。这一章将为你详细解释任务和线程在使用上的不同之处。
  控制流和数据流共同协作下的并行化
  第4章和第5章介绍的并行化操作都是在控制流和数据流的共同协作下完成的。
     第4章“并行聚合”:并行聚合模式一般适用于存在依赖关系(包括数据依赖)的并行循环,例如累计计算、查找集合最大值之类的。
     第5章“Future”:Future模式的使用一般与某些操作的顺序有关,因为这些操作的输出通常是另一些操作的输入。通过数据依赖关系的定向图来约束操作顺序。这些操作中有一些是可以实现并行的,而另一些则必须串行执行,这取决于输入什么时候可用。
  动态任务并行化与管道应用
  第6章和第7章介绍了一些更高阶的应用。
     第6章“动态任务并行化”:在某些情况下,我们需要在计算的过程中动态地添加待办事项。这一模式应用范围很广,甚至包括了图算法与排序。
     第7章“管道”:当一个程序中允许同时运行多个组件时,我们就可以利用管道来实现串联式输出,就像流水线一样,即一个组件的输出进入另一个组件的输入队列。管道满并且一个以上的组件同时处于活动状态时实现并行化。
参考资料
  除了上面介绍的模式之外,这本书在附录部分还提供了其他参考资料:
     附录 A“任务调度器与资源管理器”:该附录带你预览并发运行时中的任务调度器和资源管理器,并详细介绍了它们的功能。
     附录 B“并行应用程序的调试与分析”:该附录详细介绍如何在Visual Studio 2010系统中调试并分析一个并行应用程序及其性能。
     附录 C“技术总览”:该附录带你预览更多来自Microsoft公司的并行编程技术与设计框架。
     术语表:这里列出了本书中大部分术语的定义。
  我们建议每一位读者都应该仔细阅读一下前3章,这有助于你们对这本书的内容框架形成一个最基本的概念。至于后续的章节,虽然严格来说也是按照逻辑顺序来排列的,但是从第4章开始,你完全可以按照自己喜欢的顺序来阅读。
  要注意的是,对本书中的这些模式运用要对症下药,不要生搬硬套,对于自己的需求必须有彻底的认识。
  人们总想用新的工具和技术来解决面临的所有问题,却没考虑新事物是否合适。俗话说得好:“当你手里有一把锤子的时候,看什么都像钉子。”“看什么都像钉子”是很容易导致一些意想不到的结果。例如下面这只小兔子的悲惨遭遇(见图2)。
  你肯定不希望在自己的并行程序中遇到如此糟糕的情况,不是吗?当我们引入并行化处理时,需要花费一定的时间,同时也增加了编程的复杂度。因此如果你想取得良好的结果,应该只针对那些利大于弊的部分进行并行优化。
图2  当你手里有一把锤子的时候,看什么都像钉子
本书未能涉及的内容
  本书介绍了内容可能更侧重于与处理器有关的工作,而不是与I/O相关的工作。这样做可以使我们更合理地利用内核资源,以便让那些计算密集型的应用能最大限度地提升它的执行速度。所以本书没有着重于I/O延迟方面。不过,我们还是一些地方兼顾讨论了计算密集型和I/O密集型之间的负载平衡问题(见第7章的相关内容)。
  另外,本书还讨论了如何在一个具有共享内存的单一多核节点内实现并行化的问题。请注意,这里讨论的对象不是一个具有分布式存储和网络节点的高性能计算服务器(HPC)集群。不过,即便是对开发集群应用的程序员来说,本书中的单节点中的并行技术范例也是有用的,从本质上说,集群也是由各个节点中多个处理单元共同组成的。
本书的目标
  在读完本书之后,我们希望你应该:
     能独立解答每一章末尾处的练习题。
     能从本书中找出最适合你的模式。如果确实有的话,不要错过实现并行化的好机会,直截了当地将它们应用到你的并行实现中。
     能理解这些模式不适合你的原因。要做到这一点,你或许需要更仔细地阅读专业文献和深入研究或者寻求专家的帮助。
     在你所实现的模式不能正常工作时,能独立思考并找出原因,例如存在某些依赖冲突或者任务之间错误地共享了数据。
     详细阅读每一章“补充阅读”中列出的参考资料。

上架指导

计算机\程序设计

封底文字

这本书通过将并行模式库和异步代理库引入设计模式来告诉程序员如何使用它们,这样开发者们可以快速上手编写并行程序,从而提高程序的执行效率。我相信,这本书以其对并行编程模式的强调和先进的编程模型,迈出了将并行化编程推入主流的重要的一步。
——Tony Hey 微软研究院副总裁
当前IT产业处在重要的转折点——并行硬件+移动设备=未来20年主流平台的便携式超级计算机,本书应势而生。这本书中阐释的Visual C++ 2010并行模式库(PPL)有助于将应用程序领进并行化的大门。
——Herb Sutter 微软首席架构师
在多核体系环境中,CPU仪表盘上经常显示计算机中只有一个CPU核在满负荷运行,而其他内核则都闲置着,这使得程序看上去受到了CPU性能的限制,但事实上,这只是利用了多核系统中的一小部分性能而已。那么,这个问题有更好的解决方案吗?
答案是简单且明确的,那就是并行编程。现如今,我们越来越多地发现,自己曾一直习惯于编写的且为所有程序员熟悉的那种串行化代码显然已经无法满足用户的性能需求。为了进一步提升系统中CPU资源的使用率,我们需要将应用程序分解成能各自为战的执行片断,以便使它们能够在同一时间内运行。
并行编程一直被认为是专家们涉足的领域,同时也经常被视为一个雷区,其中隐藏着各种难以重现的、诡异的软件缺陷。幸运的是,并行模式库(PPL)和异步代理库的出现将我们引入了一个全新的并行编程模型,该模型大大地简化了编写并行程序的工作。当然,这些简化的背后隐藏着一系列精致而复杂的算法,它们能够很好地适应多核体系中的动态分布式计算。
另外,Visual Studio 2010开发系统内置了一系列的调试器与分析工具,全面支持这个并行编程模型。你还可以求助于久经考验的设计模式,本书介绍了一些最重要的、也是最常用的并行编程模式,并提供相应基于PPL编写的可执行代码示例对其进行辅助说明。

作者简介

(美)Colin Campbell; Ade Miller  著:Ade Miller目前是微软研究院的首席软件开发工程师,担任基于Windows HPC Server团队的项目经理和微软公司模式与实践团队的开发主管。加入微软公司之前他曾经参加过网络启动、嵌入式语言以及高性能计算等项目。他目前的主要兴趣是并行和分布式计算以及通过使用工程领导方式改善团队开发的方式。他与人合著有《C++ AMP(Rough Cuts Version)》、《Parallel Programming with Microsoft .NET》。 Colin Campbell与人合著有《Model-Based Software Testing and Analysis in C#》、《Parallel Programming with Microsoft .NET》,他还撰写了若干篇针对软件分析的严格数学方法的学术论文。他是Model Computation公司的创始人。

译者简介

凌杰 译:暂无简介

译者序

说来凑巧,当开始着手翻译这本书的时候,我刚刚入手了自己的第一台四核计算机,而翻译工作临近完成之时,我又为自己添置了一台iPad 2(这是一台双核计算机)。由此可见,多核计算机已经完全进入了我的日常生活。鉴于自己是一个远远落后于时尚的家伙(例如我对双核手机就不太“感冒”),我毫不怀疑多核计算机已经走入了千家万户。这似乎也意味着多核应用的时代真正到来了……
  先别高兴得太早。如果你仔细观察,就会发现自己并没有真正进入多核世界。因为当前使用的计算机上的大部分应用依然都是单核的。也就是说,很多时候我们只是在一台多核计算机上运行着一堆单核程序罢了。或许,你的操作系统会为这些程序进程分配单独的执行内核,但是这种粒度上的多核优势是相当有限的,我们必须为自己开发出真正意义上的多核应用程序。是的,这意味着要让程序自己具备多核处理的能力。也就是说,我们现在要并行化的不是进程,而是线程。相信很多有经验的程序员看到这里都会像我一样皱起眉头,这毫无疑问是一件非常麻烦的事,操作繁多,极易出错。最要命的是,这里的绝大部分bug都是难以重现的,更别提运用什么异常处理机制了。除非能大大地简化这一过程,否则并行编程永远都是高手们手里的玩具而已。
  有趣的是,如果你问一个C++程序员,什么库用起来是最简单的?他十有八九会说是STL。若你再问他,STL有什么缺点?他十有八九又会说,它太基础了,缺少模式化应用。而这就是这本书的优势所在。
  这本书所介绍的并行模式库(Parallel Patterns Library,PPL)实际上是一个模式化的C++模版库,而且作为Visual Studio 2010开发系统的一部分,它已经完全被“内置”到了这一版本的C++语言中。这意味着你可以像使用std::for_each那样使用它的并行算法,像使用std::vector那样使用它的并行容器。除此之外,它还很好地兼容了最新的C++ 0x标准(现在称为C++11了)的部分特性,例如lambda表达式。这将帮助我们写出更接近C++的代码。然而,这本书令人兴奋的地方远远不止如此,更重要的是它模式化了并行编程。在PPL的帮助下,我们可以更多地从“设计”的角度来进行并行编程,这样一来,你只需要考虑如何并行化你的数据流或控制流,而不用太担心数据共享的安全或者操作同步的细节问题。当然,前提是你选对了设计模式。毕竟,设计模式不是设计模板,不能生搬硬套。你不能“手里有把锤子,就看什么都像钉子”,设计模式只是一组设计方案的高度抽象,有着很多种变化(称它为模式变体),我们必须学会灵活运用。这需要建立正确的模式化编程思维,而这就是这本书的终极目标。
  作为译者,我从这本书中学到了不少东西,我的朋友高博(《设计原本》和《研究之美》的译者)曾这样总结他的翻译心得:“译者应该从他的翻译中首先获益!”我非常认可,因而我对自己的这些工作深感荣幸。当然,毕竟这是第一次独立完成一本书的翻译工作,经验不足使我对这项工作战战兢兢,有收获也有遗憾,希望它至少已经做到了“正确性”。在翻译过程中我得到了很多朋友的帮助,在此对他们致以最诚挚的谢意。
  首先要感谢的是机械工业出版社的各位编辑和盛大创新院的项目经理高博先生,没有他们的帮助和鼓励,我恐怕永远都不会有机会翻译这样一本好书。接下来,必须要感谢凯捷咨询的姚皓工程师、微软亚洲研究院的徐宁工程师、EMC的朱磊工程师以及思科的金瓯工程师,他们都仔细地阅读了全书的初稿,并给出了大量的修改意见,使我避免了很多灾难性的错误。朱磊工程师和金瓯工程师甚至还帮助我翻译了前言和序言部分,对他们的帮助我铭记在心,希望这本书也能给他们带去快乐。

推荐序

推荐序一
  并行计算技术大约诞生于40年前,那时候它还只是一门冷僻学科(如高能物理学)和工程应用技术(如计算流体力学),是一个只有专家们才会涉足的领域。而如今这项技术已经取得了长足的进步。
  这种变化的根源来自于硬件的发展趋势。崇尚一味提高处理器时钟频率的时代已经走到了终点,取而代之的是由摩尔定律所预测的芯片密度的增加,由此多核处理器和单芯片集成多处理器应运而生。如今四核处理器已经司空见惯,按照这样的趋势,几十核的处理硬件也会在不久的将来面世。
  在过去的五年中,Microsoft公司借力这个技术变革的时机开发了多种并行软件,其中包括专为基于“消息传递接口”(Message-Passing Interface,MPI)程序而设计的高性能计算集群(High Performance Cluster,HPC)技术,提供基于“映射-缩减”(Map-Reduce)风格并行数据处理的Dryad平台,应用户要求提供计算处理核心的Windows Azure技术平台,为代码编写开发的并行模式库(PPL)和异步代理库,以及Microsoft .NET Framework 4的并行扩展等。
  从复杂的科学和设计问题到商业应用和新型人机交互接口,多核计算对应用程序开发的方方面面产生了广泛的影响。我们以前总是自嘲说:“并行计算的确是未来趋势,只是它永远在未来。”今天看来,显然是我们过于悲观了,并行计算最终从角落走向了应用开发和IT产业的中心舞台。
  但是这也带来了一个隐患。为了能让应用程序运行得更快,如今的程序员们不得不考虑怎样划分计算工作量以充分利用多核处理器的能力,而这种高级技能只有专家们才掌握。并行化编程给大多数开发人员提出了巨大的挑战,这种挑战对于很多人来说还是初次遇到。所以,怎样让诸多程序员尽快地从实践中学习并将并行化融入他们的应用程序,是当下迫在眉睫的需求。
  在我一些从事计算机学科的同事中,流行着两种可能的设计思路:一是设计一种新的并行化编程语言;二是开发一个“无所不能”的并行编译器。这两种方法在学术上听起来确实很有意思,但是在面对一般开发人员的普及和简化并行化编程方面则显得力不从心。与之相对,一种更为实用的方法是为程序员提供一个封装了并行化编程复杂细节的库,然后告诉他们应该如何使用。
  出于这样的目的,Microsoft Visual C++并行模式库和异步代理库提供了比以往API更高层的编程模型。举例来说,程序员可以以任务而非线程为单位来思考,这样就能避免复杂的线程管理问题。本书通过阐释将这些库放到设计模式的方式来告诉程序员如何使用它们,这样程序员们可以很快上手编写并行程序,从而提高程序的执行效率。
  我相信,这本书以其对并行编程模式的强调和先进的编程模型,迈出了将并行化编程推入主流的重要的第一步。
Tony Hey
微软研究院副总裁

推荐序二
  正当我们站在IT产业的重要转折点—并行硬件+移动设备=未来20年主流平台的便携式超级计算机,本书应势而生。
  为了将各个硬件平台的性能发挥到极致,我们对并行应用程序的需求也越来越多。这里所谓的发掘大部分设备上的最大计算性能(包括几乎所有的台式电脑和笔记本电脑、大多数的游戏控制台以及最新的智能手机),主要是指充分利用以多核处理器为主的本地并行硬件资源,这也是超级计算机的商业化进程。另外在今后,我们将会越来越多地发现,性能的最大化往往还意味着需要逐步引入多样化的计算处理方式,从通用图形处理单元(GPGPU)等本地资源到开拓以弹性计算云形式出现的远程并行计算资源。后者是一种以非均匀性存储结构(NUMA)为主导技术对异机种集群的泛化过程,计算实体从集成到芯片集中,转而扩展到整台计算机上,进而再集中到云端,而上述的每一种计算实体在之前都有实际应用的例子。
  从现在开始到可预见的将来,在计算机应用程序范畴内的“快速”不仅仅是“并行”的同义词,而应该更多地等同于“可扩展的并行”。只有可扩展的并行应用程序才具有超越现有主流设备的潜在并行性,故而当今天的程序安装在未来拥有更多并行支持的硬件上时,才能自然而然地在性能上得到飞跃。
  本书介绍的Visual C++ 2010并行模式库(PPL)有助于将应用程序领进并行化的大门。在PPL的设计过程中,许多人付出了巨大的心血。就我自己而言,我很荣幸能够贡献自己的绵薄之力,将lambda函数设计成该语言的核心扩展,这使得创建PPL中的其他部分如同标准模板库(Standard Template Library,STL)一样,就像使用一个普通库实现算法。当然我们可以向编程语言中加入一堆特定的并行循环(我们几乎就这么做了),但是这样做很粗鲁,而且也失去了一般性。而lambda函数可以用在PPL中,也可以用在别处。加入一个这样普遍适用的语言特性比填塞许多特定情况的用例要好上千倍。
  到目前为止,令我们感到欣慰的是,世界大部分地区的计算机行业已经达到了普适计算的目标—可以想象,我们已经把一台计算机放到了每一张写字桌上、每一间起居室里,甚至每一个人的口袋中。但是我们现在还处在推进普适甚而灵活弹性的超级计算进程中,这就相当于我们将一台囊括本地和远程资源的超级计算机放到每一张写字桌上、每一间起居室和每一个人的口袋里。在1984年我高中毕业那会儿,世界上最快的电脑是有4个处理器、128M内存、性能峰值为924 MFLOPS的Cray X-MP。换种通俗的方式来讲,在并行性、内存大小和处理能力方面,它只是2005年古董Xbox的零头,更无法与当今的“手机”和XBOX体感相提并论。时代在进步,而进步的步伐不仅愈迈愈大,而且愈迈愈快。
  业界转而走入并行化是以多核CPU的诞生开始的(其原因请参见我几年前的评论文章《免费午餐不再》(The Free Lunch Is Over)),以通用图形处理单元、弹性云计算以及其他新型且根本性的并行革命为继来发扬光大。这股并行风潮将带来大量的新式计算资源,并将通过主流的编程语言来为我们所掌握。在Microsoft,我们每个人都为能够给这代人和子子孙孙带来业界主流并行计算平台的开发工具而感到十分高兴。尤其对于PPL,我很乐于看到用户的最终产品会有多棒。另外我很期待看到最终的产品随着时代的推进性能也随着节节攀升,因为我们让应用程序能够再次享用免费的午餐—未来二十年中的可扩展并行。
Herb Sutter
微软首席架构师

图书目录

译者序
推荐序一
推荐序二
前言 1
致谢 7
第1章 引言 9
1.1 潜在并行化的重要意义 10
1.2 分解、协调、可扩展性共享 11
1.2.1 理解任务 12
1.2.2 协调任务 13
1.2.3 可扩展性数据共享 13
1.2.4 设计方法 14
1.3 选择正确的设计模式 15
1.4 关于术语 16
1.5 并行的局限 16
1.6 一些建议 18
1.7 练习题 19
1.8 更多资源 19
第2章 并行循环 21
2.1 基本用法 22
2.1.1 并行版的for循环 22
2.1.2 parallel_for_each 23
2.1.3 期望为何 24
2.2 实例示范 26
2.2.1 串行版的Credit Review 26
2.2.2 parallel_for_each版的Credit Review 27
2.2.3 性能对比 27
2.3 模式变体 28
2.3.1 提前退出循环 28
2.3.2 异常处理 29
2.3.3 小型循环体的特殊处理 29
2.3.4 并行度控制 30
2.4 反面模式 31
2.4.1 隐性循环体依赖 31
2.4.2 少量迭代的小循环体 31
2.4.3 重复输入性枚举 32
2.4.4 基于协同性阻塞的交叉调度 32
2.5 相关模式 32
2.6 练习题 32
2.7 补充阅读 33
第3章 并行任务 35
3.1 基本用法 36
3.2 实例示范 38
3.3 模式变体 39
3.3.1 基于协同性阻塞的任务协调 40
3.3.2 取消一个任务组 42
3.3.3 异常处理 44
3.3.4 预测性执行 44
3.4 反面模式 46
3.4.1 闭包中的变量捕获 46
3.4.2 计划外的取消状态传递 47
3.4.3 同步化成本 48
3.5 设计注意事项 48
3.5.1 任务组调用约定 48
3.5.2 任务与线程 48
3.5.3 如何调度任务 49
3.5.4 结构化任务组及任务处理 49
3.5.5 轻量级任务 50
3.6 练习题 50
3.7 补充阅读 50
第4章 并行聚合 53
4.1 基本用法 54
4.2 实例示范 57
4.3 模式变体 63
4.3.1 基于小型循环体的考虑 63
4.3.2 Combinable对象的其他用处 63
4.4 设计注意事项 63
4.5 相关模式 65
4.6 练习题 65
4.7 补充阅读 66
第5章 Future 69
5.1 基本用法 71
5.2 实例示范:Adatum金融仪表盘 73
5.2.1 业务对象 74
5.2.2 分析引擎 75
5.3 模式变体 78
5.3.1 取消Future对象 78
5.3.2 消除瓶颈 78
5.3.3 在运行时修改任务图 79
5.4 设计注意事项 79
5.4.1 分解到future对象中去 79
5.4.2 函数式风格 79
5.5 相关模式 80
5.5.1 管道模式 80
5.5.2 Master/Worker模式 80
5.5.3 动态任务并行化模式 80
5.5.4 离散事件模式 80
5.6 练习题 81
第6章 动态任务并行化 83
6.1 基本用法 83
6.2 实例示范 84
6.3 模式变体 87
6.3.1 非空while循环体的并行化 87
6.3.2 在挂起等待环境中添加任务 89
6.4 练习题 90
6.5 补充阅读 90
第7章 管道 93
7.1 消息块类型概述 94
7.2 基本用法 94
7.3 实例示范 101
7.3.1 串行化的图形处理 101
7.3.2 图形管道 102
7.3.3 性能特征 104
7.4 模式变体 106
7.4.1 异步管道 106
7.4.2 管道中的取消操作 109
7.4.3 管道中的异常处理 110
7.4.4 多生产者作用下的负载平衡 111
7.4.5 管道与流的关系 114
7.5 反面模式 114
7.5.1 在管道各阶段之间进行大量的数据拷贝 114
7.5.2 管道阶段中的工作量过小 114
7.5.3 在消息传递时忘记使用隔离技术 114
7.5.4 无限期的等待 114
7.5.5 无限制的队列增长 115
7.5.6 更多信息 115
7.6 设计注意事项 115
7.7 关联模式 116
7.8 练习题 116
7.9 补充阅读 116
附录A 任务调度器与资源管理器 117
附录B 并行应用程序的调试与分析 139
附录C 技术总览 153
术语表 157

教学资源推荐
作者: 王恺 王志 李涛 朱洪文 编著
作者: John Lewis Peter J. DePasquale;Joseph Chase;
作者: [美]本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著
参考读物推荐
作者: 刘冰 等编著
作者: 曹飞飞 高春艳 等编著
作者: 吴惠茹 等编著