Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2220416
  • 博文数量: 436
  • 博客积分: 9833
  • 博客等级: 中将
  • 技术积分: 5558
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-29 10:27
文章存档

2013年(47)

2012年(79)

2011年(192)

2010年(118)

分类: 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内核的知识,逐步提高自己。

阅读(717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~