内容简介
第一部分 性能分析工具和基本概念(开胃品)
第1章 引言
软件优化
软件优化陷阱
软件优化过程
要点
第2章 测试基准
Benchmark的属性
可重复性(必须)
代表性(必须)
易用性(必须)
可验性(必须)
时间可测性(可选)
完全覆盖性(条件依赖)
精确性(条件依赖)
Benchmark示例
要点
第3章 性能分析工具
计时机制
优化编译器
使用Intel?C++和Fortran编译器
特定处理器优化
针对特定处理器的函数实现
其他编译器优化
软件分析的类型
性能监测
VTuneTM性能分析器
采样
调用图分析
Intel编译器Codecov分析器
Microsoft Visual C++分析器
采样与插桩型分析器的比较
尝试、错误、判断力与耐心
要点
第4章 热点
什么因素导致热点和冷点?
不仅仅是时间
均匀执行与没有热点
要点
第5章 处理器体系结构
功能模块
要两个汉堡!
取指与译码
指令执行
退出
寄存器和内存
要点
第二部分 性能相关问题(主菜)
第6章 算法
计算复杂度
指令选择
数据相关与指令并行
内存需求
并行算法
算法的通用性
检测算法问题
要点
第7章 分支
找到关键的预测错误的分支
第一步:找到预测错误的分支
第二步:找到耗时的热点
第三步:确定预测错误的分支的比率
最后的全面检查
分支的不同类型
使分支更容易被预测
使用CMOV移除分支
使用标志移除分支
使用min/max指令移除分支
通过额外工作去除分支
要点
第8章 内存
内存概览
主存和虚拟内存
处理器缓存
缓存细节
硬件预取
软件预取
不通过缓存写数据:非临时性写
影响内存性能的问题
强制缓存载入
容量缓存载入
冲突缓存载入
缓存效率
存储转发
数据对齐
编译器和数据对齐
软件预取
检测内存问题
找到页缺失
找到存储转发问题
找到L1缓存缺失
理解潜在的改进
修复内存问题
要点
第9章 循环
数据相关
循环分配和融合
循环剥离
循环展开与合并
循环交换
循环不变计算
循环不变分支
循环不变结果
要点
第10章 慢操作
慢指令
查找表
系统调用
系统空闲进程
要点
第11章 浮点
数值异常
清零和非格式化到零
精度
打包和标量模式
浮点到整数的转换,取整
下界和上界函数
浮点操作技巧
浮点类型到整型的转换
平方根
倒数平方根
要点
第12章 SIMD技术
SIMD技术介绍
MMXTM技术
SIMD流扩展
使用SIMD技术
自动矢量化
C++类库
Intrinsics
嵌入汇编语言
四种方法的优缺点
SIMD技术的考虑事项
决定何处使用SIMD技术
内存对齐
数据布局
选择合适的打包数据类型
SIMD和x87 FPU计算的兼容性
要点
第13章 自动矢量化
矢量化相关的编译开关
常用的编译开关
编译开关使用示例
矢量化相关的编译提示
常用的编译提示
编译提示使用示例
矢量化指南
设计与实现的考虑
矢量化诊断的使用
别名与负面影响的最小化
编程风格
目标体系结构
要点
第14章 面向处理器的特殊优化
32位Intel?体系结构
Pentium?M处理器
一级指令缓存
指令译码
指令延迟
指令集
浮点控制寄存器
MXCSR状态寄存器
一级数据缓存
内存预取
处理器事件
部分寄存器延迟
部分标志延迟
暂停指令
要点
第15章 多处理技术介绍
并行程序设计
线程管理
使用OpenMP+高层线程化
低层线程
线程化的目标
线程化的相关问题
Intel编译器与线程工具
要点
第16章 OpenMP+多线程
OpenMP+的关键要素
多线程执行模型
OpenMP+的存储模型
OpenMP+的限制
编译OpenMP+程序
自动并行化
线程化指南
要点
第17章 任务队列和OpenMP+的高等应用专题
任务队列—Intel对OpenMP+的扩展
任务队列执行模型
任务队列和任务结构
线程化N皇后问题:一个实例研究
线程级流水线并行
开发嵌套式并行性
多级并行
线程绑定研究
理解循环调度
要点
第三部分 设计和应用优化(甜点)
第18章 实例研究:线程化视频编码器
H.264视频编码器的初始性能
H.264视频编码器的并行化
任务和数据划分
切片级并行性
帧级并行
基于两个切片队列的实现
基于任务队列模型的实现
性能
速度提高与压缩效率间的折衷
在支持HT技术的多处理器上的性能
性能的理解
多线程的额外开销
进一步的性能调试
线程化总结
要点
第19章 针对性能的设计
数据移动
内存与并行性
设计过程中的性能实验
算法
要点
第20章 综合:基本的优化
采摘低处的果实
应用
相关资料
Benchmark
Benchmark结果的理解
浮点到长整型转换的改进
算法的并行化
采用自动矢量化
基于Intrinsics的指令级并行
优化总结
要点
第21章 综合:最后的百分之十
最快的速度
更高的SIMD效率
最终的优化
优化总结
要点
参考文献
索引