全部博文(436)
分类: C/C++
2012-11-26 08:21:24
在第五章中我们主要学习的是一些提高代码性能的技术,让我们正确理解如何编写或改进高效程序。
首先,高效程序需要的是:1.最好的算法和数据结构。2,编写出编译器能够有效优化以转换成高效可执行代码的源代码。又由于一点小变动,就会引起编译器优化方式很大的变化,所以在这一章中也对优化大型程序和汇编代码的问题进行了讨论,这是理解编译器以及产生的代码会图和运行的重要途径。
一. 优化编译器的能力和局限性
妨碍优化因素:
1. 存储器别名使用现象(假设不同指针可能会指向存储器同一位置)
2. 函数调用(注意考虑函数副作用)
二. 表示程序性能
1. 度量标准:每元素的周期数
2. 处理器活动的顺序:时针控制(时针周期,纳秒)
3. 元素迭代循环
问题:具体如何理解每元素的周期数?
三. 程序示例
问题:边界检验
四. 消除循环的低效率
1. 例子:对vec_length 的调用移出循环测试,则简化了迭代程序。
2. 优化实例:代码移动。
3. 编程常见问题:代码片段有隐藏的渐进低效率。
五. 减少过程调用
1. 实例:避免combine2的代码在每次循环迭代都会调用get_vec_element来获取下一个向量元素,则在抽象数据类型层架一个函数get_vec_start,返回数组的起始地址,则在循环里没有函数调用,直接访问数组。
六. 消除不必要的储存器引用
1. 实例表明:编译器可以用寄存器x保存累计值,从而减少读的次数。
七. 理解现代处理器:
1. 超标量:在每个时钟周期执行多个操作,而且是乱序的。
2. 整个设计包括两个主要部分:
ICU:负责从存储器中读出指令序列,并根据这些指令序列生成一组针对程序数据的基本操作。
EU:负责执行以上操作。
3. ICU从指令告诉缓存中读取指令,指令告诉缓存是一个特殊的告诉缓存储存器,它包括最近访问的指令。通常,ICU会在当前正在执行的指令很早之前取指,所以它有组后的时间对指令解码,并操作发送到EU,不过会遇到分支问题。
4. 分支预测:处理器预测是否分支,并预测分支的目标地址。
5. 投机执行:取出预测的分支处的指令并对指令解码。
6. 功能单元的性能:
(1) 周期计数值:执行时间和发射时间。
(2) 发射时间指明一个单元的连续操作之间的周期数,在一个流水线化的单元中,发射时间比执行时间短。
7. 更近的观察处理器操作
(1) 并行性和分支预测
(2) 执行单元的操作处理:1,指令解码器生成的形式2,用计算图表示
八. 转换到指针代码
1. C的特性:能够对任意的层序对象创建和引用指针。
2. 指针与数组的联系与运用
九. 并行性
1. 实例:循环分割
2. 寄存器溢出:使用浮点数据是,希望将局部变量都放在浮点寄存器栈中,但是还需保持栈顶可用于从存贮器加载数据,因此简直了并行度小于或等于7.
3. 对并行的限制
十. 综合:优化合并代码的效果
1. 对于浮点乘法的正确使用和理解
2. 变换机器和编译器环境可以使进一步优化。
总结:此次看书,一共看到5.12,收获很大,也发现了许多自己还不懂得地方和知识,通过讨论和自己查找也解决了一些,还有近一步的问题需要请教老师或学长,也需要不断的学习来提高自己。
计划:本周会花更多的时间,把第五章掌握的更加熟悉,准确。也会适当的开始学习linux内核的知识,逐步提高自己。