第一部分 性能分析工具和基本概念(开胃品) 3
第1章 引言 3
软件优化 4
软件优化陷阱 4
软件优化过程 6
要点 7
第2章 测试基准 9
Benchmark的属性 10
可重复性(必须) 10
代表性(必须) 11
易用性(必须) 11
可验性(必须) 11
时间可测性(可选) 11
完全覆盖性(条件依赖) 12
精确性(条件依赖) 12
Benchmark示例 12
要点 16
第3章 性能分析工具 18
计时机制 18
优化编译器 20
使用Intel?C++和Fortran编译器 20
特定处理器优化 21
针对特定处理器的函数实现 22
其他编译器优化 23
软件分析的类型 24
性能监测 25
VTuneTM性能分析器 25
采样 26
调用图分析 27
Intel编译器Codecov分析器 28
Microsoft Visual C++分析器 29
采样与插桩型分析器的比较 30
尝试、错误、判断力与耐心 31
要点 32
第4章 热点 34
什么因素导致热点和冷点? 36
不仅仅是时间 36
均匀执行与没有热点 37
要点 39
第5章 处理器体系结构 41
功能模块 42
要两个汉堡! 43
取指与译码 45
指令执行 47
退出 50
寄存器和内存 50
要点 52
第二部分 性能相关问题(主菜) 55
第6章 算法 55
计算复杂度 55
指令选择 56
数据相关与指令并行 61
内存需求 63
并行算法 64
算法的通用性 65
检测算法问题 65
要点 69
第7章 分支 72
找到关键的预测错误的分支 74
第一步:找到预测错误的分支 74
第二步:找到耗时的热点 75
第三步:确定预测错误的分支的比率 76
最后的全面检查 77
分支的不同类型 78
使分支更容易被预测 80
使用CMOV移除分支 81
使用标志移除分支 83
使用min/max指令移除分支 84
通过额外工作去除分支 85
要点 86
第8章 内存 88
内存概览 89
主存和虚拟内存 89
处理器缓存 90
缓存细节 92
硬件预取 93
软件预取 94
不通过缓存写数据:非临时性写 95
影响内存性能的问题 96
强制缓存载入 96
容量缓存载入 97
冲突缓存载入 97
缓存效率 98
存储转发 99
数据对齐 100
编译器和数据对齐 101
软件预取 102
检测内存问题 103
找到页缺失 104
找到存储转发问题 106
找到L1缓存缺失 106
理解潜在的改进 108
修复内存问题 109
要点 115
第9章 循环 117
数据相关 118
循环分配和融合 120
循环剥离 122
循环展开与合并 123
循环交换 126
循环不变计算 128
循环不变分支 128
循环不变结果 129
要点 130
第10章 慢操作 132
慢指令 132
查找表 134
系统调用 137
系统空闲进程 140
要点 143
第11章 浮点 145
数值异常 145
清零和非格式化到零 148
精度 149
打包和标量模式 152
浮点到整数的转换,取整 153
下界和上界函数 154
浮点操作技巧 154
浮点类型到整型的转换 155
平方根 155
倒数平方根 155
要点 156
第12章 SIMD技术 158
SIMD技术介绍 159
MMXTM技术 159
SIMD流扩展 160
使用SIMD技术 161
自动矢量化 162
C++类库 163
Intrinsics 164
嵌入汇编语言 165
四种方法的优缺点 166
SIMD技术的考虑事项 167
决定何处使用SIMD技术 167
内存对齐 167
数据布局 169
选择合适的打包数据类型 171
SIMD和x87 FPU计算的兼容性 173
要点 173
第13章 自动矢量化 176
矢量化相关的编译开关 176
常用的编译开关 176
编译开关使用示例 179
矢量化相关的编译提示 180
常用的编译提示 180
编译提示使用示例 185
矢量化指南 186
设计与实现的考虑 187
矢量化诊断的使用 189
别名与负面影响的最小化 192
编程风格 196
目标体系结构 197
要点 200
第14章 面向处理器的特殊优化 202
32位Intel?体系结构 202
Pentium?M处理器 204
一级指令缓存 205
指令译码 206
指令延迟 207
指令集 208
浮点控制寄存器 208
MXCSR状态寄存器 209
一级数据缓存 209
内存预取 209
处理器事件 210
部分寄存器延迟 210
部分标志延迟 212
暂停指令 212
要点 213
第15章 多处理技术介绍 214
并行程序设计 215
线程管理 217
使用OpenMP+高层线程化 217
低层线程 220
线程化的目标 220
线程化的相关问题 222
Intel编译器与线程工具 225
要点 226
第16章 OpenMP+多线程 228
OpenMP+的关键要素 228
多线程执行模型 232
OpenMP+的存储模型 234
OpenMP+的限制 238
编译OpenMP+程序 239
自动并行化 241
线程化指南 244
要点 246
第17章 任务队列和OpenMP+的高等应用专题 249
任务队列—Intel对OpenMP+的扩展 249
任务队列执行模型 249
任务队列和任务结构 252
线程化N皇后问题:一个实例研究 255
线程级流水线并行 260
开发嵌套式并行性 263
多级并行 267
线程绑定研究 269
理解循环调度 271
要点 274
第三部分 设计和应用优化(甜点) 279
第18章 实例研究:线程化视频编码器 279
H.264视频编码器的初始性能 279
H.264视频编码器的并行化 280
任务和数据划分 281
切片级并行性 282
帧级并行 283
基于两个切片队列的实现 284
基于任务队列模型的实现 285
性能 288
速度提高与压缩效率间的折衷 288
在支持HT技术的多处理器上的性能 290
性能的理解 291
多线程的额外开销 294
进一步的性能调试 295
线程化总结 296
要点 297
第19章 针对性能的设计 298
数据移动 299
内存与并行性 299
设计过程中的性能实验 300
算法 301
要点 303
第20章 综合:基本的优化 306
采摘低处的果实 306
应用 307
相关资料 309
Benchmark 309
Benchmark结果的理解 310
浮点到长整型转换的改进 310
算法的并行化 312
采用自动矢量化 313
基于Intrinsics的指令级并行 314
优化总结 315
要点 316
第21章 综合:最后的百分之十 318
最快的速度 318
更高的SIMD效率 320
最终的优化 323
优化总结 324
要点 325
参考文献 326
索引 332