《多核应用编程实战》是一本全面实用的多核应用编程指南,旨在介绍如何编写功能正确、性能优越且适合扩展为在多个CPU核心的系统运行的应用程序。《多核应用编程实战》面向多种操作系统和处理器类型引用程序示例,内容涵盖类UNIX操作系统(Linux、Oracle Solaris、OS X)和Windows系统上多核应用的编写方法、多核的硬件实现对应用程序的性能影响、编写并行应用程序时要避免的潜在问题,以及如何编写可扩展至大量并行线程的应用程序。
《多核应用编程实战》适合所有C程序员学习参考。
第1章 硬件、进程和线程1
1.1 计算机的内部结构1
1.2 多核处理器的缘起3
1.2.1 在单芯片上支持多线程4
1.2.2 通过处理器核心流水线作业提高指令发出率8
1.2.3 使用缓存保存最近使用的数据10
1.2.4 用虚拟内存存储数据12
1.2.5 从虚拟地址转换到物理地址13
1.3 多处理器系统的特征14
1.4 源代码到汇编语言的转换16
1.4.1 32位与64位代码的性能18
1.4.2 确保内存操作的正确顺序19
1.4.3 进程和线程的差异21
1.5 小结23
第2章 高性能编码24
2.1 定义性能24
2.2 了解算法复杂度25
2.2.1 算法复杂度的示例26
2.2.2 算法复杂度的重要性28
2.2.3 谨慎运用算法复杂度30
2.3 结构如何影响性能30
2.3.1 在源代码和生成结构上权衡性能和便利性30
2.3.2 利用库结构化应用程序33
2.3.3 数据结构对性能的影响42
2.4 编译器的作用47
2.4.1 两种编译器优化48
2.4.2 选择合适的编译器选项50
2.4.3 如何用跨文件优化提高性能51
2.4.4 使用配置文件反馈53
2.4.5 潜在的指针别名会如何抑制编译器优化55
2.5 通过分析确定占用时间的地方58
2.6 怎样避免手动优化64
2.7 从设计角度看性能64
2.8 小结65
第3章 识别并行机会66
3.1 使用多进程提高系统工作效率66
3.2 多用户使用一个系统67
3.3 通过整合提高机器工作效率68
3.3.1 用容器隔离共享一个系统的应用程序69
3.3.2 使用虚拟机监控程序托管多个操作系统69
3.4 采用并行机制提高单个任务的性能71
3.4.1 理解并行应用程序72
3.4.2 并行如何影响算法的选择72
3.4.3 Amdahl定律73
3.4.4 确定最大实际线程数75
3.4.5 同步成本怎样降低扩展性76
3.5 并行模式78
3.5.1 使用SIMD指令的数据并行78
3.5.2 通过进程或线程实现并行化79
3.5.3 多个独立任务79
3.5.4 多个松散耦合的任务80
3.5.5 相同任务的多个副本81
3.5.6 单个任务拆分到多个线程82
3.5.7 使用流水线任务完成某个事项82
3.5.8 将工作分配给客户端和服务器83
3.5.9 将责任划分给生产者和消费者84
3.5.10 结合多种并行化策略85
3.6 依赖关系对并行运行代码能力的影响85
3.6.1 反依赖和输出依赖86
3.6.2 通过推测打破依赖88
3.6.3 关键路径91
3.7 发现并行机会92
3.8 小结93
第4章 同步和数据共享94
4.1 数据争用94
4.1.1 使用工具检测数据争用95
4.1.2 避免数据争用98
4.2 同步原语98
4.2.1 互斥量和临界区98
4.2.2 自旋锁99
4.2.3 信号量100
4.2.4 读写锁100
4.2.5 屏障101
4.2.6 原子操作和无锁代码102
4.3 死锁和活锁103
4.4 线程和进程间的通信104
4.4.1 内存、共享内存和内存映射文件104
4.4.2 条件变量105
4.4.3 信号和事件107
4.4.4 消息队列108
4.4.5 命名管道108
4.4.6 通过网络栈进行通信109
4.4.7 线程之间共享数据的其他方法110
4.5 存储线程私有数据110
4.6 小结112
第5章 使用POSIX线程113
5.1 创建线程113
5.1.1 线程终止114
5.1.2 用子线程接收和传递数据115
5.1.3 分离线程116
5.1.4 设置pthread的属性117
5.2 编译多线程代码119
5.3 进程终止121
5.4 线程之间共享数据122
5.4.1 使用互斥锁保护访问122
5.4.2 互斥锁属性124
5.4.3 使用自旋锁125
5.4.4 读写锁127
5.4.5 屏障129
5.4.6 信号量130
5.4.7 条件变量136
5.5 变量和内存140
5.6 多进程编程143
5.6.1 在进程之间共享内存144
5.6.2 在进程之间共享信号量147
5.6.3 消息队列147
5.6.4 管道和命名管道150
5.6.5 使用信号与进程通信151
5.7 套接字156
5.8 可重入代码和编译器标志158
5.9 小结160
第6章 Windows线程161
6.1 创建Windows本机线程161
6.1.1 终止线程165
6.1.2 创建和重新启动挂起的线程167
6.1.3 使用内核资源的句柄168
6.2 同步和资源共享的方式168
6.2.1 线程间需要同步的一个例子169
6.2.2 保护对临界区代码的访问170
6.2.3 用互斥量保护代码段172
6.2.4 轻量级读写锁173
6.2.5 信号量175
6.2.6 条件变量177
6.2.7 向其他线程或进程发出事件完成的信号178
6.3 Windows中的宽字符串处理179
6.4 创建进程180
6.4.1 在进程之间共享内存182
6.4.2 在子进程中继承句柄185
6.4.3 互斥量命名及其在进程间的共享186
6.4.4 用管道通信187
6.4.5 用套接字进行通信190
6.5 变量的原子更新193
6.6 分配线程本地存储195
6.7 设置线程的优先级197
6.8 小结198
第7章 自动并行化和OpenMP199
7.1 使用自动并行化产生并行代码199
7.1.1 识别和并行约简203
7.1.2 对包含调用的代码进行自动并行化204
7.1.3 协助编译器实现代码的自动并行化206
7.2 使用OpenMP生成并行应用程序208
7.2.1 使用OpenMP并行化循环209
7.2.2 OpenMP应用程序的运行时行为210
7.2.3 OpenMP并行区域中的变量作用域210
7.2.4 使用OpenMP并行化约简212
7.2.5 在并行区域外访问私有数据212
7.2.6 使用调度改进工作分配214
7.2.7 用并行段完成独立工作217
7.2.8 嵌套并行218
7.2.9 使用OpenMP动态定义并行任务219
7.2.10 保持数据对线程私有223
7.2.11 控制OpenMP运行时环境225
7.2.12 等待工作完成227
7.2.13 限制执行代码区域的线程229
7.3 确保并行区域的代码按顺序执行232
7.4 折叠循环改进工作负荷均衡233
7.5 强制实现内存一致性234
7.6 并行化示例235
7.7 小结239
第8章 手工编码的同步和共享240
8.1 原子操作240
8.1.1 用比较和交换指令构成更复杂的原子操作242
8.1.2 强制实现内存排序以确保正确操作245
8.1.3 编译器对内存排序指令的支持247
8.1.4 编译器对操作的重新排序247
8.1.5 易失变量251
8.2 操作系统提供的原子操作251
8.3 无锁算法254
8.3.1 Dekker算法254
8.3.2 带循环缓存的生产者/消费者256
8.3.3 扩展到多个消费者或生产者259
8.3.4 将生产者/消费者扩展到多个线程260
8.3.5 更改生产者/消费者代码为使用原子操作266
8.3.6 ABA问题268
8.4 小结271
第9章 基于多核处理器的扩展272
9.1 对应用程序扩展的限制272
9.1.1 串行代码对性能的限制272
9.1.2 超线性扩展275
9.1.3 工作负荷不均衡276
9.1.4 热锁277
9.1.5 库代码扩展282
9.1.6 工作量不足284
9.1.7 算法限制286
9.2 扩展的硬件限制288
9.2.1 核心之间的带宽共享288
9.2.2 伪共享290
9.2.3 缓存冲突和容量293
9.2.4 流水线资源匮乏297
9.3 操作系统对扩展性的限制301
9.3.1 过度订阅301
9.3.2 使用处理器绑定改善内存局部性303
9.3.3 优先级反转310
9.4 多核处理器和扩展310
9.5 小结311
第10章 其他并行技术312
10.1 基于GPU的运算312
10.2 语言扩展314
10.2.1 线程构建模块314
10.2.2 Cilk++317
10.2.3 Grand Central Dispatch320
10.2.4 为未来C和C++标准提议的可能功能321
10.2.5 微软的C++/CLI324
10.3 其他语言325
10.4 集群技术327
10.4.1 MPI328
10.4.2 以MapReduce作为扩展策略331
10.4.3 网格332
10.5 事务性内存332
10.6 向量化333
10.7 小结334
第11章 结束语335
11.1 编写并行应用程序335
11.1.1 识别任务335
11.1.2 估算性能提升336
11.1.3 确定依赖关系336
11.1.4 数据争用和互斥锁扩展限制336
11.1.5 锁的粒度337
11.2 多核处理器上的并行代码337
11.3 并行化的未来339
参考文献340
索引342
Everwonderwhysometypelooksmoreprofessional,moresophisticatedthanothertype?Theans...
《考古有意思:秦始皇的兵与城》内容简介:考古大咖写给大众的考古版寻秦记! 兵马俑一号坑第三次发掘和秦咸阳城发掘领队许卫红根据
基于计算机、数码及网络技术的因特网已经在设计领域营造出了一个"网页设计"的新典范。仅仅五六年时间,飞速发展的因特网促进了网
这本书,暴露了阿里在智能领域的野心万物互联,这件大事,才刚刚开始2015年,全世界各个领域都在为IoT蠢蠢欲动。无论是互联网企业
计算机基础及WPS Office应用-全国计算机等级考试一级教程-(2015年版) 本书特色 本书是根据《全国计算机等级考试一级wps office考试大纲(2...
《一本书读懂内部审计》内容简介:内部审计工作涉及公司经营的每一个环节,小到一份经济合同、一张财务报表,大到业务流程、部门绩
《元代辽阳行省女真人研究》内容简介:本书对元代辽阳行省女真人进行全景式系列研究。书中将元代辽阳行省女真人分成北部、东部、南
《构图之本(风光摄影四部曲)》内容简介:任何风光摄影师要想拍好风光,都必须学习和谙熟构图知识。高觉著的《构图之本》从风光拍
《译前译后》内容简介:《译前译后》主要涉及到笔者多年来翻译并出版过的作品。译前,系译者对原著的认识。译后,这里包括译著的成
通用软件服装CAD 内容简介 《通用软件服装CAD》是一部计算机软件应用技术专著,本书既可用于高等学校服装专业教学,也可以指导服装设计与生产。本书详细研究探讨了...
《王阳明的智慧》内容简介:王阳明是中国历史上极为重要的思想家,他的“心即理”“知行合一”“致良知”“万物一体”等主张,不仅
本书是无线通信方面的一部新作。该书在材料取舍、内容组织和讲授方式方面均具有鲜明特色。书中主要针对无线网络的物理层,阐述了
《循环:大学学习那些事儿》内容简介:本书的内容,对于好生和差生都是适用的,对于前者,如果你尚未清楚自己为什么能够取得优异的
《Excel财务数据处理与分析自动化案例视频精讲》内容简介:财务人员每天都在处理各种各样的表格,计算各种各样的数据,然而,有些财
《图像处理、分析与机器视觉(第3版)》是为计算机专业图像处理、图像分析和机器视觉课程编写的教材。《图像处理、分析与机器视觉(
《现代化的政治》内容简介:该书对发展中国家的政治现代化道路进行了深入的分析,特别是在实现政治现代化的过程中影响政治变革的一
《百年雀巢》将带领读者纵览雀巢的百年风雨历史,从它的产品、创新、品牌、管理、文化五大方面揭秘了全球食品工业巨人长盛不衰的
《徐霞客(中华先贤人物故事汇)【中宣部2022年主题出版重点出版物】》内容简介:徐霞客,明代地理学家、旅行家、文学家。一生志在
《杰出青少年的哈佛智商》内容简介:本书从介绍智力的各个方面考虑,为家长和孩子提供切实可行的有效方法,对兴趣和智力的作用、非
全国数据库技术水平考试一级学员教材 本书特色 本书按照教学大纲中规定的内容,系统、全面地介绍了数据库水平考试所涵概的内容。既重视基本理论、基础知识的阐述,又指导...