本书从原理、技术、经验和工具等方面为读者提供关于多核程序设计技术的全方位解释。本书由三大部分组成:第一部分包括第1~4章,介绍软件多线程的内容;第二部分包括第5章和第6章,其中讨论用于编写并行程序的常用编程API:第三部分包括其余五章关于多核程序设计的内容,讲述常见并行程序设计问题及解决方法(第7章)、多线程应用程序的调试技术(第8章)、单核与多核处理器基本原理(第9、10章)和所需的Inter公司的软件开发辅助工具(第11章)。\r\n 本书作者都是长期供职于Inter公司的资深软件工程师和结构师,书中融入了他们自己丰富的软硬件开发经验,可以为面向多核体系结构进行并行程序设计的开发人员提供巨大的帮助。不论对从未接触过并行程序设计的开发人员,还是转型面向多核体系结构进行并行程序设计的开发人员来讲,本书都是一本难得的参考书。
第1章 多核体系结构概述 \r\n 1.1 促成软件并发的因素 \r\n 1.2 并行计算平台 \r\n 1.3 “性能”解析 \r\n 1.4 本章要点 \r\n第2章 多线程技术概述 \r\n 2.1 线程的定义 \r\n 2.2 线程的层次 \r\n 2.3 线程创建之后的相关行为 \r\n 2.4 应用程序设计模型与多线程技术\r\n 2.5 虚拟环境:虚拟机和虚拟平台 \r\n 2.6 本章要点 \r\n第3章 并行程序设计的基本概念\r\n 3.1 多线程设计 \r\n 3.2 并行程序设计人员面临的挑战 \r\n 3.3 并行程序设计模式\r\n 3.4 误差扩散问题:一个具有启发意义的例子\r\n 3.5 本章要点\r\n第4章 多线程和并行程序设计结构 \r\n 4.1 同步 \r\n 4.2 临界段\r\n 4.3 死锁 \r\n 4.4 同步原语 \r\n 4.5 消息 \r\n 4.6 流控制相关的概念\r\n 4.7 与实现相关的多线程特征\r\n 4.8 本章要点 \r\n第5章 线程API\r\n 5.1 微软Windows的线程API\r\n 5.2 微软.NET框架的线程API\r\n 5.3 POSIX线程 \r\n 5.4 本章要点 \r\n第6章 OpenMP?:一种可移植的多线程解决方案\r\n 6.1 将循环多线程化所面临的挑战 \r\n 6.2 降低线程开销 \r\n 6.3 提高程序性能的设计方法\r\n 6.4 OpenMP库函数 \r\n 6.5 OpenMP环境变量 \r\n 6.6 编译 \r\n 6.7 调试 \r\n 6.8 性能\r\n 6.9 本章要点 \r\n第7章 常见并行程序设计问题的解决方法\r\n 7.1 线程过多 \r\n 7.2 数据竞争、死锁和活锁\r\n 7.3 竞争激烈的锁 \r\n 7.4 非阻塞算法 \r\n 7.5 线程安全函数和库\r\n 7.6 存储问题 \r\n 7.7 cache相关的问题 \r\n 7.8 避免IA-32上的流水线停顿 \r\n 7.9 面向高性能的数据组织 \r\n 7.10 本章要点\r\n第8章 多线程调试技术 \r\n 8.1 通用调试技术\r\n 8.2 Windows多线程程序的调试\r\n 8.3 使用GDB进行多线程调试\r\n 8.4 本章要点\r\n第9章 单核处理器基础 \r\n 9.1 处理器体系结构基础知识\r\n 9.2 超标量结构与EPIC结构的对比 \r\n 9.3 本章要点 \r\n第10章 面向Intel®多核处理器的多线程技术 \r\n 10.1 基于硬件的多线程技术\r\n 10.2 超线程技术\r\n 10.3 多核处理器 \r\n 10.4 多个处理器之间的交互 \r\n 10.5 功耗\r\n 10.6 多核处理器体系结构未来发展趋势\r\n 10.7 本章要点 \r\n第11章 Intel®软件开发产品 \r\n 11.1 概述 \r\n 11.2 Intel®线程检测器 \r\n 11.3 Intel编译器 \r\n 11.4 Intel®调试器 \r\n 11.5 Intel库\r\n 11.6 Intel® VTuneTM性能分析器 \r\n 11.7 Intel®线程直方统计器\r\n 11.8 MPI程序设计\r\n 11.9 本章要点\r\n术语表 \r\n参考文献\r\n索引
毫无疑问,信息技术目前已经成为推动人类社会生产力进步的主导力量,其影响深入到社会生产和人类活动的方方面面,甚至每个人的工作、生活和学习方式也都因此发生了翻天覆地的变化。作为信息技术的龙头,计算机技术也同样经历了虽短暂但绝对惊天动地的发展历程。
一直以来,推动计算机技术不断进步的动力主要来自两个方面:一方面是以生产工艺为代表的实现技术,其一直推动着计算机主频和器件密度不断向纵深发展;另一方面是以并行技术为代表的计算机体系结构技术,不断推动着计算机性能横向发展。但由于器件物理极限的存在,计算机主频和器件密度不可能无限提高。正因为这个缘由,目前主流的处理器厂商都在将发展重心转向采用体系结构技术来提高计算机性能的轨道上,最终导致了各种多核处理器的面世。
多核体系结构技术在单个封装内集成了更多的执行核,为实现真正并行提供了物质基础。那么究竟如何设计和编写并行应用程序才能充分发挥多核体系结构的资源优势?这正是软件开发人员所要解决的问题。本书从这一需求出发,期望为面向多核体系结构设计和编写并行应用程序的开发人员提供一些力所能及的帮助。
在翻译本书的过程中,我们最大的体会,或者说本书最大的特色在于:
覆盖范围广泛 书中不仅讲述了面向多核体系结构进行并行程序设计的方法,而且还对多核体系结构基础知识、多线程程序设计基础知识、并行程序调试和优化技术、常见并行程序设计问题及解决方法,甚至所使用的工具都进行了或详或简的阐述。
实用性强 书中所有内容都结合实例进行阐述,不仅使各种枯燥的技术、方法和原理都易于理解,而且读者能够真正从实践中掌握这些技术、方法和原理。
软硬兼顾 作者长期在Intel公司供职,不仅从事过体系结构技术的研究,也熟悉各种软件工具的开发,具备了坚实的知识背景和实践经验。
本书共11章,其内容大概可以分为三个部分:第一部分包括第1章到第4章,介绍软件多线程的内容;第二部分包括第5章和第6章,其中讨论用于编写并行程序的常用编程API;第三部分包括其余的五章,都是关于多核程序设计的内容,讲述常见并行程序设计问题及解决方法(第7章)、多线程应用程序的调试技术(第8章)、单核与多核处理器基本原理(第9、10章)和所需的Intel公司的软件开发辅助工具(第11章)。作者结合自身丰富的软硬件开发经验和宽广的知识背景为读者提供了一本关于多核程序设计技术的全面参考书。
本书的翻译工作主要由李宝峰、富弘毅和李韬三位博士共同完成。其中李宝峰博士负责前言部分、第1、2、3、9、10、11章的翻译工作,富弘毅博士负责第6、7、8章的翻译,李韬博士负责第4、5章的翻译。Be Flying工作室负责人肖国尊负责本书译员的确定、翻译质量和进度的控制与管理。欢迎各位读者对本书提供反馈意见,我们希望读者能从本书中受益,也希望通过读者的意见来了解自己的不足,以求在今后译作中更多地、更切实际地考虑读者的需要。我们的邮件地址:be_flying_workroom@163.com或be-flying@sohu.com,欢迎来函。
译 者
Shameem Akhter是Intel公司的一名平台结构师,主要从事单插槽多核体系结构和性能分析的研究和实现工作。他曾经是Inter软件和解决方案小组的一名资深软件工程师,负责面向桌面和服务器平台的应用程序的优化设计。Shameem获得了一项关于面向受限程序的优化设计的多线程接口的专利技术,该项专利是其硕士论文(计算机科学)的组成部分。
到目前为止,绝大部分专业技术人员都已意识到了现代计算平台的设计方式正在经历一个本质性的转型阶段。Intel、IBM、Sun以及AMD公司都不约而同地推出了在单个芯片上集成多个执行核的微处理器产品。在2005年,在消费者面前的桌面平台、服务器以及游戏控制台都出现了采用多核CPU的情况。但这仅仅只是一个开始而已,未来还会出现更多的多核处理器产品;目前,半导体制造厂商正致力于在单个基片上集成更多的执行核,而不是努力将处理器的主频提升到10GHz。可以预见,未来的计算平台,不论是桌面应用、移动应用、服务器还是专用嵌入式平台都很有可能采用多核结构。
硬件工业的这种发展趋势也为软件开发人员提供了新的机遇。以前的硬件平台向程序开发人员提供的是一种串行程序设计模型。操作系统及其他系统软件只能够通过利用计算速度或者人类感知能力弱点的方式来模拟多任务环境。因此,在这种条件下,多线程只是一种效果表象而已。但是,现代多核体系结构为开发人员提供了一个真正的并行计算平台,为软件开发人员设计和实现软件提供了一种更加强大的工具。本书将对面向多核平台的软件设计开发的方方面面进行简要的介绍。
本书适合的读者
本书的主要目标是为开发人员提供一些帮助,使他们能够面向并行硬件平台开发高效的软件。并行硬件平台包括多核处理器和采用同时多线程技术(例如超线程技术)的处理器。本书的主要内容是讲述一些程序设计技术,使开发人员能够充分利用底层硬件平台所提供的支持。我们希望尽可能地扩大本书所适合的读者群,因此,书中也设置了相当一部分介绍性的内容,例如基本的线程概念,这对于刚刚涉足多线程程序设计的开发人员而言非常有益。但是,并行程序设计是一门非常复杂的技术,其中有大量不同的方法和基本原理。本书的目标(从另一方面说也是挑战)就是为读者提供一个多核处理器或者那些采用同时多线程技术的平台的硬件能力的详细讨论,而不是让读者迷失在各种不同的学术争论(例如关于某种方法是否是编写可靠的、易于维护的并行程序的最优方案的争论)之中。此外,书中所引用的权威著作都已列在书后的“参考文献”中,读者如果需要了解更加详细的信息,请阅读这些参考文献的内容。
我们假设读者都是经验非常丰富的程序开发人员,但是对多线程程序设计技术却知之甚少。可能有些人会说这个假设过于谨慎了,因为许多阅读本书的开发人员在面向单核平台编写应用程序时都接触过线程,他们熟悉多线程程序设计的基本原理,并且至少熟悉一种线程API。但是,请注意:面向单核平台、多核平台以及支持同时多线程技术的平台编写应用程序是极其不同的。本书会对其中的差别加以讨论。正因为如此,本书从一开始就在相应的章节中着重讲述了这些差异。本书假设读者至少熟悉一种高级程序设计语言,尤以熟悉C/C++者为佳。但是,书中所给出的许多建议也同样适合其他的高级语言,例如Java和Perl。我们希望通过以上努力能够使得本书具有更加广泛的读者群。
关于本书
本书由三大部分组成。第一部分包括第1~4章,介绍软件线程的内容。这一部分包括许多背景知识:为什么芯片制造商都将重心转移到了多核体系结构上?线程是如何工作的?如何衡量某种特定的多线程实现、某些面向并行硬件平台的程序设计范例或使用多线程时所采用的抽象数据类型所带来的性能提升?读者阅读完这些章节之后就应该能够找出硬件平台当前为什么如此发展的原因,同时还会对编写并行程序所需的一些基本原理有所领悟。
第二部分包括第5章和第6章的内容,其中讨论了编写并行程序时常用的编程API,主要讨论三种编程接口:微软的面向Win32、MFC和.NET的API、POSIX Threads,以及OpenMP。虽然开发人员可以选用的不同API和程序设计模型非常多,但是限于篇幅和时间,本书只选择了最常用的具有代表意义的API来讲述。
第三部分,也是最后一部分,都是关于多核程序设计的内容。第7章对常见的并行程序设计问题及解决方法进行了讨论。第8章讨论的是关于多线程应用程序的调试问题。第9章介绍或者回顾了一些硬件基本原理,第10章继续第9章的内容,进一步从硬件层次讨论了多核处理器的基本原理。第11章则对Intel公司开发的软件工具进行了介绍,这些软件工具能够辅助开发人员对多线程应用程序进行编写、调试以及描述。
最后,需要特别指出的是书中所有基于Windows†操作系统的示例都采用微软的Visual Studio† 2005来编译和构建。这些应用程序的测试环境为微软的Windows XP Service Pack 2版本。对于书中所有的Linux†示例,则采用gcc编译器进行编译和构建,测试环境为Linux 2.6。所有的OpenMP示例都采用最新的Intel® C++编译器进行编译和构建,关于这些代码示例的更新、勘误以及其他信息,请访问本书的网站:http://www.intel.com/intelpress/mcp。
Intel®软件开发产品
在阅读本书,尤其是第11章的过程中会发现这样一个事实:Intel公司并不仅仅只生产多核处理器产品。除了硬件平台以外,Intel公司还为软件开发人员提供了各种各样的资源,其中包括一个面向多线程而开发的功能全面的工具包,该工具包包含以下组件:
Intel C++和Fortran编译器 二者提供了对OpenMP和自动并行技术的支持,从而支持多线程技术。
Intel数学核心函数库和Intel集成式高性能原函数库 这两个库中的例程都采用OpenMP实现了多线程化。
Intel VTuneTM性能分析器 用于监控与多线程性能相关的处理器事件。
Intel线程检测器和Intel调试器 辅助开发人员调试常见的多线程问题,例如死锁。
Intel线程直方统计器 辅助开发人员优化基于OpenMP、微软的Windows和POSIX的多线程应用程序。
除了上述工具,Intel公司还提供了Intel软件网络(Intel Software Network),主要致力于和世界上的软件厂商一起来辅助应用程序产品的开发和配置。Intel软件网络由大量不同的资源组成。其中一部分就是Intel体系结构师编写的白皮书和文章,分享了一些技术上的关键观点,包括最优线程技术。Intel软件网络也包括一些供用户讨论的论坛,在这些论坛中,用户可以与Intel工程师进行交流,共同讨论关于技术方面的所有问题。Intel软件学院(Intel Software College)提供各种方式的培训课程,包括Webcast、在线培训和课堂培训。这些课程涉及包括多线程程序设计在内的多种主题。Intel解决方案服务(Intel Solution Services)则向那些正在为某个技术难题而寻求专家意见的公司提供咨询服务。
关注多核平台的开发人员可以在Intel网站的多核主页(http://www.intel.com/ multi-core/)上面浏览和获取相关的在线资源。
致谢
本书的出版是团体协作努力的结果。在此,对为本书的编写和出版提供了巨大帮助的人们致以特别感谢。首先我们要列出参与本书编写工作的其他作者的名字:本书第6章——“OpenMP†:一种可移植的多线程解决方案”,作者是Xinmin Tian;第7章——“常见并行程序设计问题的解决方法”,作者是Arch Robison;最后,James Reinders与Eric Moore和Gordon Saladino一起编写了第11章——“Intel®软件开发产品”。其他参与本书编写的人员有:Sergey Zheltov,Stanislav Bratanov,Eugene Gorbatov和Cameron McNairy。向以上参与编写的人们表示真挚的感谢。
Intel出版社的所有书籍都需要经过严格的评审才能最终出版。在此,我们要对所有参与本书评审的人员表示感谢,他们指出了原稿中的许多错误,提供了很多极具价值的建议,并一直给予我们鼓励。没有他们的帮助,本书就不能够成功出版。Intel公司的许多人在不同时期都参与了本书的评审,他们是:Andy Anderson,Jeff Austin,Ernie Brickell,Daniel Brown,Doris Burrill,Stephen Chao,Brad Corrion,Jim Cownie,David Grawrock,Gerard Hartnett,William Holt,James Howard,Bob Kuhn,Tim Mattson,My-Hanh Nguyen,Paul Petersen,James Reinders,Arch Robison,Thom Sawicki,Sanjiv Shah,Xinmin Tian,Kimberly Turner,Richard Uhlig,Greg Welch,Paul Work和Sergey Zheltov。其他评审人员还有Pacific Data Works,LLC的Andrew Binstock、Eastman Kodak的Thomas Kinsman和Florida Atlantic University的副教授Hari Kalva。
最后,我们要感谢Intel出版社的全体员工。Stuart Goldstein负责本书的内容结构,他稳定的领导和查找所需资源的能力使得本书总能够跟上技术更新的步伐。David Clark是本书的编辑,他将我们散乱无章
无封面