新書推薦:
![中国二战史研究七十年(1950—2019)](http://103.6.6.69/upload/mall/productImages/y24/8/9787010255200.jpg)
《
中国二战史研究七十年(1950—2019)
》
售價:HK$
667.0
![摩梭仁者:东巴口述史](http://103.6.6.69/upload/mall/productImages/y24/8/9787521761313.jpg)
《
摩梭仁者:东巴口述史
》
售價:HK$
135.7
![趣话通信:6G的前世、今生和未来](http://103.6.6.66/upload/mall/productImages/24/30/9787302661344.jpg)
《
趣话通信:6G的前世、今生和未来
》
售價:HK$
90.9
![不羁.完结篇](http://103.6.6.66/upload/mall/productImages/24/29/9787553530208.jpg)
《
不羁.完结篇
》
售價:HK$
60.7
![性别经济学](http://103.6.6.66/upload/mall/productImages/24/30/9787521764451.jpg)
《
性别经济学
》
售價:HK$
71.3
![中国书法嬗变与思考(国家社科基金后期资助项目)](http://103.6.6.66/upload/mall/productImages/24/31/9787101165432.jpg)
《
中国书法嬗变与思考(国家社科基金后期资助项目)
》
售價:HK$
112.7
![关键冲突:如何化人际关系危机为合作共赢(原书第2版)](http://103.6.6.66/upload/mall/productImages/24/31/9787111750918.jpg)
《
关键冲突:如何化人际关系危机为合作共赢(原书第2版)
》
售價:HK$
86.3
![探索清陵五十年](http://103.6.6.66/upload/mall/productImages/24/30/9787507769098.jpg)
《
探索清陵五十年
》
售價:HK$
1012.0
|
編輯推薦: |
本书首先简要回顾了现代计算机架构的主要概念,特别关注并行代码的性能以及并行编程模型中的相关概念。然后,转向用于实现并行编程模型的基本算法,讨论它们如何与现代处理器交互。为了证明架构问题的普遍性,本书展示了当代多核处理器的性能。本书中的关键算法和概念都以易于理解的方式进行讨论,并且用许多具体示例、图表和源代码片段进行说明。本书的目标读者是研究编译器构造、并行编程或编程系统的计算机科学专业的学生。对用于实现并行运行时系统的核心算法感兴趣的软件开发人员,或者需要为需要本书中讨论的算法和概念的项目自学的软件开发人员,也将从阅读本书中受益。读者可以在https://github.com/parallel-runtimes/lomp找到本书的源代码。
|
內容簡介: |
本书聚焦于当今高性能多核处理器的并行编程系统的理论和实践方面,探讨实现并行编程模型所需的关键算法的有效实现。此类实现需要考虑底层计算机体系结构的特定体系结构方面以及执行环境提供的功能。本书简要回顾了现代计算机体系结构的关键概念,特别关注并行代码的性能以及并行编程模型中的相关概念。然后,本书转向用于实现并行编程模型的基本算法,并讨论它们如何与现代处理器交互。虽然本书将重点介绍一般机制,但我们将主要使用英特尔处理器体系结构来举例说明所讨论的实现概念,但也将在适当的情况下介绍其他处理器体系结构。所有的算法和概念都以一种易于理解的方式进行了讨论,并附有许多示例、图表和源代码片段。
|
關於作者: |
Michael Klemm是一位高性能计算专家,他主要研究高性能计算应用程序、并行编程、编译器和运行时实现的性能调整以及编程语言的设计。Jim Cownie是ACM杰出工程师,曾任Intel高级首席工程师。他曾是LLVM中OpenMP运行时的组件所有者。他喜欢滑雪。
|
目錄:
|
Contents 目 录译者序序前言术语表第1章 绪论11.1 本书结构11.2 探索设计空间21.2.1 作为库的并行31.2.2 作为语言的并行51.3 代码示例61.4 机器配置6第2章 并行编程模型与概念92.1 多进程与多线程92.1.1 线程基础112.1.2 线程亲和性142.1.3 基于线程编程的OpenMP API142.1.4 工作分享152.1.5 OpenMP线程亲和性182.2 基于任务的并行编程192.3 同步构造222.3.1 锁与互斥222.3.2 同步障、归约和闭锁242.3.3 任务同步障262.3.4 任务依赖282.4 阿姆达尔定律312.4.1 呈现性能结果322.4.2 对性能的影响342.4.3 将开销映射到阿姆达尔定律中352.4.4 阿姆达尔定律变体352.5 总结37第3章 众核与多核计算机架构393.1 执行机制393.1.1 冯·诺依曼架构与按序执行403.1.2 按序流水线执行423.1.3 乱序执行443.1.4 分支预测473.1.5 超标量执行483.1.6 同步多线程493.1.7 单指令多数据523.2 现代内存子系统543.2.1 内存层次结构543.2.2 内存模型与内存一致性583.2.3 缓存623.2.4 缓存一致性:概述623.2.5 缓存一致性:MESI协议623.2.6 性能影响663.2.7 非统一内存架构703.3 总结72第4章 编译器和运行时的交互734.1 编译器基础734.2 基于任务的并行模型的实现764.2.1 lambda函数和闭包774.2.2 TBB中的排队任务794.3 并行编程语言的编译器804.4 并行代码生成模式834.4.1 并行域的代码生成834.4.2 线程并行循环的代码生成854.4.3 SIMD并行循环的代码生成884.4.4 串行构造的代码生成914.4.5 静态任务的代码生成934.4.6 动态任务的代码生成944.5 OpenMP实现示例974.5.1 GNU编译器套件974.5.2 Intel编译器和LLVM编译器994.6 总结102第5章 并行运行时基本机制1035.1 管理并行性1035.1.1 生成并行性1035.1.2 等待1045.2 并行性管理与硬件结构1055.2.1 检测硬件结构1055.2.2 线程固定1075.3 并行运行时系统中的内存管理1085.3.1 内存效率及缓存使用1095.3.2 单线程内存分配器1095.3.3 多线程内存分配器1125.3.4 并行运行时系统的专用内存 分配器1135.3.5 线程本地存储1145.3.6 线程对象的数据布局1165.4 总结117第6章 互斥和原子性1186.1 互斥问题1186.1.1 锁的硬件支持:原子指令1206.1.2 ABA问题1226.2 我们应该写锁代码吗1236.3 锁的类别1246.4 锁算法的特性1246.5 锁算法1276.5.1 测试并设置锁1286.5.2 测试及测试并设置锁1296.5.3 票锁1306.5.4 排队锁1316.6 实际代码性能1336.6.1 无争用锁开销1336.6.2 争用锁的吞吐量1346.6.3 性能总结1366.7 如何等待1386.8 事务同步1436.8.1 事务语义1446.8.2 MESI协议中的实现1456.8.3 事务指令1466.8.4 事务锁1466.8.5 互斥和预测的比较1496.9 其他串行操作1496.9.1 master和masked构造1496.9.2 single构造1506.10 原子操作1516.10.1 原子指令映射1516.10.2 最小值和最大值的原子实现1536.11 总结1556.11.1 锁总结1556.11.2 原子操作总结155第7章 同步障和归约1567.1 同步障基本原理1577.2 同步障性能测量1587.2.1 同步障微基准程序1597.2.2 同步障性能模型1617.3 同步障组件1617.3.1 计数器和标志1617.3.2 广播1637.4 同步障算法分类1667.5 同步障算法1667.5.1 计数同步障1667.5.2 多对多同步障1697.5.3 蝶形/超立方体同步障1707.5.4 传播型同步障1727.5.5 树形签入同步障1747.6 归约1787.7 其他优化1827.8 总结183第8章 调度并行循环1858.1 调度目标1858.2 调度效率的理论极限1868.3 基本调度方法1888.3.1 静态循环调度1888.3.2 动态循环调度1898.4 映射为规范形式1898.5 编译器循环转换1918.6 循环调度单调性1938.7 静态循环调度实现1948.7.1 分块式循环调度1958.7.2 块循环式循环调度1958.8 动态循环调度实现1968.8.1 指导式调度1978.8.2 monotonic:dynamic1998.8.3 nonmonotonic:dynamic2018.9 循环调度评估2038.10 其他循环调度方案2078.10.1 使用历史信息2088.10.2 用户控制调度2088.11 总结208第9章 任务并行模型的运行时 支持2109.1 任务描述符2109.2 任务池实现2119.2.1 单任务池2129.2.2 多任务池2179.3 任务同步2239.3.1 等待任务子集完成2249.3.2 等待直接子任务完成2279.3.3 任务依赖2319.4 任务调度2349.4.1 任务调度点2349.4.2 广度优先调度和深度优先 调度2359.4.3 任务窃取2369.5 任务调度约束2399.5.1 栈调度2399.5.2 循环调度2409.6 其他任务主题2419.6.1 任务优先级2419.6.2 任务亲和性2439.7 总结245第10章 总结和感想246附录 技术缩略语248参考文献251
|
內容試閱:
|
Foreword 前 言写这本书的念头源自Michael在慕尼黑工业大学讲的一门课。你知道,这纯粹是出于兴趣。那门课叫“并行编程系统”,教的是将并行编程模型引入并行机器的基础知识。完全就是本书主题,真巧!并行运行时系统是非常有趣的主题。我们平时的工作就是解决不同处理器上的各种性能及底层机器细节的问题。但是,对应用程序代码性能的考虑,相对于对软件栈底层及支持并行编程模型的运行时库内部的性能的考虑,是不一样的。在底层有很多机器细节,为了尽可能获得高性能,开发者必须考虑这些细节。学生们在上了几节课以后,似乎对关于底层的部分很感兴趣,所以Michael认为可以写一本书!随着Jim加入作者团队,一切准备就绪。Jim不仅有多年的经验,还具有丰富的并行性知识,对底层机器细节非常感兴趣。我们希望你能和我们一样喜欢该主题。写这本书(及附带代码)确实非常有趣,我们也希望你能读得开心。我们使用了大量代码示例和图表来阐释各种概念,帮助你理解编写运行时系统关键部分的细节。大多数代码示例使用C和C++编写。我们还使用了一些汇编语言,以演示现代编译器处理源代码的方式。熟悉Fortran或其他语言的程序员不必感到失望,你依然能从本书学到很多知识,而且你能将关键概念转换到你所选用的语言。我们选用C/C++,不是因为我们认为其他语言无趣或不相关,而是因为我们认为,无论上层用户代码使用何种语言编写,对于非常贴近机器的底层实现而言,C和C++依然处于统治地位。所以请保持开放的心态,即使这种开放心态会带来一个小麻烦——总有人想向你的观念里塞点东西。感谢出版商De Gruyter出版本书,以及在我们忙于写书时给予我们耐心。感谢De Gruyter的Ute Skambraks耐心地与我们一起整理文稿。感谢那些在阅读了本书早期版本后没有“逃跑”的审稿人。他们是Mark Bull、Barbara Chapman、Florina M. Ciorba、Chris Dahnken、Alex Duran、Wooyoung Kim、Will Lovett、Larry Meadows、Jennifer Pittman、Carsten Trinitis和Terry Wilmarth。感谢我们的校对人Matthew Robertson(https://checkmatteditorial.com)和Randall Munroe。Randall是https://xkcd.com网站的创始人,他授权我们使用他的创意。如果书中依然遗留错误,那肯定就是我们自己的疏忽了。最后,本书使用了由GW4与UK Met Office运营的、由EPSRC(EP/P020224/1)资助的Isambard UK National Tier-2 HPC Service(http://gw4.ac.uk/isambard/),还使用了一些位于布里斯托大学的机器。衷心感谢所有人。现在,废话不多说,希望你能喜欢本书!Michael & Jim
|
|