注册 登录 进入教材巡展
#
  • #

出版时间:2025-06-13

出版社:机械工业出版社

以下为《软件系统优化》的配套数字资源,这些资源在您购买图书后将免费附送给您:
  • 机械工业出版社
  • 9787111772248
  • 1-1
  • 548266
  • 平装
  • 2025-06-13
  • 412
  • 本科
内容简介
本书详细介绍了软件系统优化的原理、技术和常用方法。本书强调从系统视角进行优化,提出了“数据驱动的系统优化”方法,围绕“软件 + 硬件 + 数据”三个方面展开讲解。本书共 18 章,分为五个部分。第1章和第2章从一个性能优化案例引入,概述了软件系统优化的方法论。第二部分包括第 3~6 章,介绍了性能工程的基础知识。第三部分包括第 7~10 章,介绍了计算机体系结构优化的相关知识。第四部分包括第 11~16 章,介绍了编译优化的相关知识。第五部分包括第17章和第18章,针对新兴场景下的系统优化技术展开专题讨论。
目录
CONTENTS
目  录
推荐序一
推荐序二
前言
第一部分 绪论
第1章 开篇案例:矩阵乘法的性能
优化 2
1.1 不同编程语言的实现 2
1.2 循环交换 5
1.3 编译器的不同优化级别 7
1.4 多核并行优化 8
1.5 循环分块 11
1.6 内建函数 15
1.7 本章小结 17
1.8 思考题 18
第2章 系统优化方法论概述 19
2.1 后摩尔时代性能优化的驱动力 19
2.2 数据驱动的系统优化方法 21
2.3 从单点到全局的系统观 21
2.4 本章小结 23
2.5 思考题 23
第二部分 性能工程基础
第3章 性能测量 26
3.1 测量方法 26
3.1.1 外部测量 27
3.1.2 内部测量 28
3.1.3 仿真测量 29
3.2 计时器的选择 30
3.3 数据收集策略 33
3.3.1 计数型 33
3.3.2 采样型 35
3.3.3 追踪型 37
3.4 性能波动 38
3.5 测量开销 42
3.6 测量误差 43
3.7 本章小结 44
3.8 思考题 44
第4章 基准评测 45
4.1 基准评测程序 45
4.1.1 单一指令 46
4.1.2 指令组合 46
4.1.3 合成程序 47
4.1.4 程序内核 47
4.1.5 微基准评测程序 47
4.1.6 应用基准评测程序 48
4.2 标准化基准评测套件 48
4.2.1 SPEC CPU 2017 49
4.2.2 基准评测套件的开发
标准 51
4.3 基准评测的策略 52
4.3.1 固定计算的基准评测 52
4.3.2 固定时间的基准评测 52
4.3.3 可变计算和可变时间的
基准评测 53
4.4 阿姆达尔定律 53
4.5 古斯塔夫森定律 54
4.6 本章小结 55
4.7 思考题 56
第5章 配置优化 57
5.1 基本概念 57
5.2 技术挑战 59
5.2.1 配置空间的组合爆炸 59
5.2.2 性能测量的高昂代价 60
5.2.3 复杂隐蔽的特征交互 61
5.3 实验设计 62
5.3.1 单次单因子设计 62
5.3.2 全因子设计 62
5.3.3 部分因子设计 63
5.3.4 2kr因子设计 64
5.3.5 随机搜索 69
5.3.6 自动调优 70
5.4 基于机器学习的方法 70
5.5 领域知识驱动的方法 72
5.6 本章小结 73
5.7 思考题 73
第6章 性能评价 74
6.1 评价目标的设定 74
6.2 评价方法的选择 75
6.2.1 评价方法的选择条件 75
6.2.2 评价方法的优缺点 76
6.3 评价指标的选择 77
6.3.1 评价指标的分类 77
6.3.2 评价指标的选择条件 78
6.3.3 量纲分析与合理性检查 78
6.4 数据的分析与解释 79
6.4.1 数据的汇总 79
6.4.2 数据的比较 81
6.5 常见错误与规避方法 87
6.6 本章小结 88
6.7 思考题 88
第三部分 计算机体系结构优化
第7章 处理器优化 90
7.1 五阶段处理器 90
7.2 流水线执行 93
7.2.1 指令流水线 93
7.2.2 前端与后端 94
7.2.3 流水线的性能评价和
细分 94
7.2.4 流水线的停顿与冒险 95
7.3 超标量处理 96
7.3.1 超标量指令流水线 96
7.3.2 机器指令与微操作 98
7.4 乱序执行 99
7.4.1 数据依赖的分类 99
7.4.2 旁路 99
7.4.3 顺序执行与乱序执行 100
7.4.4 寄存器重命名 102
7.5 推测执行 103
7.5.1 条件分支造成的控制
冒险 103
7.5.2 分支预测器 104
7.6 本章小结 105
7.7 思考题 105
第8章 存储器优化 106
8.1 高速缓存 108
8.1.1 存储器的层次结构 108
8.1.2 高速缓存的组织结构 109
8.1.3 缓存预取 111
8.2 多核访存架构 113
8.2.1 多处理器系统架构 113
8.2.2 异构系统架构 115
8.2.3 缓存一致性 116
8.3 编写缓存友好的代码 120
8.3.1 顺序访问数据 120
8.3.2 数据打包 121
8.3.3 对齐与填充 121
8.4 本章小结 123
8.5 思考题 123
第9章 微体系结构性能分析 124
9.1 处理器性能的铁律 124
9.1.1 优化每时钟周期的时长 125
9.1.2 优化指令路径长度 126
9.1.3 优化CPI 128
9.2 CPI分解方法 129
9.2.1 根据不同类型的指令进行
CPI分解 129
9.2.2 根据不同停顿进行CPI
分解 130
9.3 自顶向下的微体系结构分析
方法 132
9.4 本章小结 134
9.5 思考题 135
第10章 异构计算与编程 136
10.1 异构计算概述 136
10.1.1 体系结构的分类 136
10.1.2 异构计算的特性 138
10.2 并行编程框架 139
10.2.1 多核编程 139
10.2.2 多节点编程 144
10.3 异构编程:SYCL 148
10.3.1 硬件设备抽象:设备和
队列 148
10.3.2 数据访问方法 149
10.3.3 并行性表达 150
10.3.4 软硬件结合 151
10.3.5 案例分析:矩阵乘法 153
10.4 本章小结 155
10.5 思考题 155
第四部分 编译优化
第11章 源程序级别的常见优化
方法 158
11.1 程序的工作量 158
11.2 数据结构优化示例 159
11.2.1 打包和编码 159
11.2.2 数据增添 160
11.2.3 预先计算 161
11.2.4 编译时做初始化 162
11.2.5 缓存 163
11.2.6 稀疏性 164
11.3 程序逻辑优化 166
11.3.1 常数折叠与传播 167
11.3.2 公共子表达式消除 167
11.3.3 代数恒等替换 167
11.3.4 创建快速通道 168
11.3.5 逻辑短路 168
11.3.6 判断顺序 170
11.3.7 组合判断 170
11.4 循环优化 171
11.4.1 循环不变量外提 172
11.4.2 设置“哨兵” 172
11.4.3 循环展开 173
11.4.4 循环合并 173
11.4.5 消除无用迭代 174
11.5 函数优化 174
11.5.1 函数内联 174
11.5.2 尾递归消除 175
11.5.3 粗化递归 176
11.6 本章小结 176
11.7 思考题 177
第12章 编译器概述 178
12.1 编译器的定义、分类及典型
架构 178
12.1.1 编译器的定义与分类 178
12.1.2 编译器的典型架构 181
12.1.3 程序中间表示的
必要性 182
12.1.4 程序中间表示的设计
思考 183
12.1.5 LLVM IR:LLVM的程序中间表示 184
12.2 符号表 187
12.3 程序运行时的内存组织 188
12.4 程序分析和优化 189
12.5 交叉编译 191
12.6 用编译器优化程序的迭代
循环 192
12.7 本章小结 193
12.8 思考题 193
第13章 目标指令集架构与汇编
语言 194
13.1 编译与汇编语言 194
13.2 x86-64指令集架构 197
13.2.1 数据类型 197
13.2.2 寄存器 198
13.2.3 指令 200
13.2.4 寻址方式 202
13.3 常用的汇编指令模式 204
13.4 浮点和向量化指令 205
13.4.1 浮点运算指令 205
13.4.2 向量化指令 206
13.5 本章小结 208
13.6 思考题 208
第14章 C程序的汇编代码生成 209
14.1 C程序是如何被转换成汇编
代码的 209
14.2 C程序转换成LLVM IR 210
14.2.1 直线代码到LLVM IR的
转换 211
14.2.2 C函数到LLVM IR的
转换 212
14.2.3 条件分支语句到LLVM IR的转换 213
14.2.4 循环语句到LLVM IR的
转换 215
14.2.5 LLVM IR中的属性 217
14.2.6 小结 218
14.3 LLVM IR转换成汇编程序 218
14.3.1 汇编制导指令与程序的
内存布局 219
14.3.2 函数调用规范 220
14.4 本章小结 222
14.5 思考题 223
第15章 编译器的优化能力 225
15.1 编译分析/优化报告 225
15.2 编译器常见的优化能力 227
15.3 编译优化示例 228
15.3.1 标量优化 230
15.3.2 结构体优化 232
15.3.3 函数调用优化 234
15.3.4 循环优化 236
15.4 编译优化的挑战 238
15.4.1 静态信息的不准确性 238
15.4.2 编译单元的局限性 239
15.4.3 优化顺序的不唯一性 240
15.5 链接时间优化 240
15.6 本章小结 241
15.7 思考题 242
第16章 程序插桩与优化机会识别 243
16.1 什么是程序插桩 243
16.1.1 程序插桩应用示例 244
16.1.2 程序插桩的手段 246
16.2 二进制翻译助力程序插桩 246
16.3 利用插桩信息识别编译优化
机会 249
16.3.1 最原始的编译器优化
机会识别方法 249
16.3.2 常用的编译优化机会
识别方法 250
16.3.3 热点驱动的半自动编译
优化机会识别框架 250
16.4 本章小结 257
16.5 思考题 257
第五部分 专题讨论
第17章 数据中心的性能优化 260
17.1 数据中心简介 260
17.2 混部应用的性能干扰检修 261
17.3 数据中心的性能分析 264
17.4 数据中心的性能评价 267
17.5 本章小结 272
17.6 思考题 272
第18章 深度学习框架的优化 273
18.1 深度学习框架简介 273
18.2 优化基础 274
18.3 算子优化 275
18.3.1 提高占用率 276
18.3.2 提高内存带宽的
利用率 277
18.3.3 使用(局部)共享
内存 278
18.3.4 小结 278
18.4 基于计算图的优化 278
18.4.1 图编译器 279
18.4.2 图编译优化 279
18.4.3 算子融合 280
18.4.4 MLIR简介 281
18.4.5 小结 281
18.5 本章小结 282
18.6 思考题 282
参考文献 283