频道栏目
读书频道 > 软件开发 > C++ > Visual C++并行编程实战:多核架构下分工与协作的设计模式
前言
2012-08-13 13:09:45     我来说两句
收藏   我要投稿
这本书所介绍的并行模式库(Parallel Patterns Library,PPL)实际上是一个模式化的C++模版库,而且作为Visual Studio 2010开发系统的一部分,它已经完全被内置到了这一版本的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)集群。不过,即便是对开发集群应用的程序员来说,本书中的单节点中的并行技术范例也是有用的,从本质上说,集群也是由各个节点中多个处理单元共同组成的。
本书的目标
在读完本书之后,我们希望你应该:
?  能独立解答每一章末尾处的练习题。
?  能从本书中找出最适合你的模式。如果确实有的话,不要错过实现并行化的好机会,直截了当地将它们应用到你的并行实现中。
?  能理解这些模式不适合你的原因。要做到这一点,你或许需要更仔细地阅读专业文献和深入研究或者寻求专家的帮助。
?  在你所实现的模式不能正常工作时,能独立思考并找出原因,例如存在某些依赖冲突或者任务之间错误地共享了数据。
?  详细阅读每一章“补充阅读”中列出的参考资料。

 
 
 
 
 
致谢
通常,编写这样一本技术类书籍是需要团队合作的。例如在模式应用方面,我们征求了许多专家的意见,也查阅了与该项目相关的论坛社区。虽然这使得我们的编写过程更为漫长和复杂,但这是非常重要的。这使得本书所面向的对象和内容得到了最终的确定,不过我们还是要感谢通过各种不同方式为本书作出贡献的人们。
这本书和我们之前在《Parallel Programming with Microsoft .NET》这本书中所做的工作有着莫大的联系。尽管内容变化了许多,但其中所讨论的基本模式是相同的。由于这个分享的经历,我们要再次感谢第一本书的合作者:Ralph Johnson (伊利诺伊大学Urbana分校)和Stephen Toub(Microsoft);接下来是全书的评审人员:Nicholas Chen、Danny Dig、Munawar Hafiz、Fredrik Berg Kjolstad以及Samira Tasharofi (都来自伊利诺伊大学Urbana分校),Reed Copsey, Jr.(C Tech 开发公司)和Daan Leijen (Microsoft研究院)、Judith Bishop(Microsoft研究院),他们仔细审阅了全书并且给出了非常宝贵的意见。这些意见不仅影响了.NET那本书,在本书中也仍然发挥着显著的作用。
一旦我们掌握了如何在C++中应用这些模式,我们所面临的最大挑战就是保证技术上的准确性。我们非常信赖来自Microsoft并行计算平台(Parallel Computing Platform,PCP)小组所提供的相关信息,这些有关并行模式库及异步代理库的详细信息不仅可以用来审阅本书内容,还可以帮助我们检阅书中的代码示例。此外,Dana Groff、Niklas Gustafsson 以及Rick Molloy(都来自Microsoft)在我们最初构思这本书时也提供了许多帮助。而其他几位PCP小组的其他成员也为我们奉献了大量的宝贵时间。他们是Genevieve Fernandes、Bill Messmer、Artur Laksberg以及Ayman Shoukry(都来自Microsoft)。
除了上面提到的两个程序库外,本书还引出了一系列相关的话题。幸运的是,我们非常荣幸地得到了负责相关领域的Visual Studio项目组成员的帮助。Drake Campbell、Sasha Dadiomov以及Daniel Moth(都来自Microsoft)针对附录B中的有关调试器与并发可视化工具的内容向我们提供了大量反馈意见。Pat Brenner和Stephan T. Lavavej(来自Microsoft)则审阅了我们所使用的代码实例及Microsoft基础类和标准模板库。
我们还得再次感谢Reed Copsey, Jr.(C Tech开发公司)和Samira Tasharofi(伊利诺伊大学Urbana分校)以及Paul Petersen(Intel),他们逐章逐节地审阅了全书。和第一本书一样,我们的进度安排非常紧迫,我们的审阅者都格外辛苦地帮助我们完成了这一目标。真心地感谢每一个人!
还有许多人为本书提供了宝贵意见。其中包括了Intel和Microsoft并行技术研讨日(Bellevue)的参与者,他们还为本书中提到的CodePlex网站提供了支持。
此外,我们还有一个由技术类文章作者和编辑组成的团队,他们的努力使本书读上去妙趣横生。他们是Roberta Leibovitz(Modeled Computation)、Nancy Michel(Content Masters)以及RoAnnCorbisier(Microsoft) 。
Rick Carr(DCB软件测试公司)测试了本书中所有的实例和内容。
在本书中,最初的可视化设计的概念是由Roberta Leibovitz 以及Colin Campbell(Modeled Computation公司)开发的,他们是一群极具天赋的设计师和阐述者。本书的设计工作由John Hubbard(Eson)担当。最后,本书各章节的卡通图案由屡获大奖的在西雅图画家Ellen Forney执笔。技术性说明则由Katie Niemer (Modeled Computation公司)负责。
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:目录
下一篇:引言
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站