全部博文(436)
分类: LINUX
2012-11-26 07:37:56
第五章主要讲了如何优化计算机性能,我们在写程序的时候主要的目标是使它在所有的情况下都能正确工作。在此基础上研究算法提高他的工作效率。
编写程序需要以下几个步骤:
l 必须选择一组合适的算法和数据结构
l 我们必须编写出编译器能够有效优化转换成高效可执行代码的源代码。
l 将一个任务分成多个部分,这些部分可以在多核和多处理器的某种组合上并行的运算。
妨碍优化的因素及解决方法:
减少函数调用:对于这种状况我们可以用内联函数替换优化函数调用,这样的替换既减少了函数调用的开销,也允许对展开的代码做进一步吧的优化。
消除循环的低效率:常见的优化方法有代码移动,包括识别要执行多次(例如在循环里)但是计算结果不会改变的计算。因而可以将计算移动到代码前面不会被多次求值的部分,优化编译器会试着进行代码移动。
消除不必要的存储器引用:引用多个不必要的存储器,这样会使读写都很浪费,并且大大的降低了程序的效率。如果我们能消除这些无用的存储器读写,就可以减少操作次数,提高程序的效率。
理解现代微处理器:
微体系结构:将大量的晶体管集成到一块芯片上,采用了复杂的硬件,试图使程序性能最大化,复杂而奇异。其中 ,多条指令可以并行的执行,同时又呈现出一种简单的顺序执行指令的表象。
Nehalem微体系结构包括两个主要部分:指令控制单元(ICU)和执行单元(EU)。前者负责从存储器中读出指令序列,并根据这些指令序列生成一组指针对程序数据的基本操作;而后者执行这些操作。
对于形成循环的代码片段,我们可以将访问到的寄存器分为四类:
只读:这些寄存器只用作源值,可以作为数据,也可以用来计算存储地址,但是在循环中他们是不会被修改的。
只写:这些寄存器作为数据传送操作的目的。
局部:这些寄存器在循环内部被修改和使用,迭代与迭代之间不相关
循环:对循环来说这些寄存器既作为源值 ,又作为目的,一次迭代中产生的值会在另一次迭代中用到。
循环展开:
它是一种程序变换,通过增加每次迭代计算的元素的数量,减少循环的迭代次数。
可以从两个方面改程序的性能:
v 减少了不直接有助于程序结果的操作的数量,eg循环索引计算机和条件分支。
v 她提供了一些方法,可以进一步变化代码,减少整个计算机中关键路径上的操作数量。
Question:
为什么循环展开不会改进三个浮点数情况的性能?