大话处理器
chenchong_219
这个作者很懒,什么都没留下…
展开
-
编写高效代码(2) 空间换时间——我们总是在走,却忘了停留
时间和空间的关系,是霍金这种智商的人要研究的东西,我们只需要知道,在编程时,空间是可以换时间的,时间也是可以换空间的。 李开复在他的自传《世界因你不同》中描述了他小时候在美国学校里的一个故事,老师出了道题:“谁知道1/7等于多少?”小开复马上大声回答:“0.142857”,老师和同学们都惊呼开复是个天才,其实事实情况是,开复以前在台湾时就记下了这个答案。这就是一个典型的以空转载 2015-03-27 21:08:28 · 854 阅读 · 0 评论 -
编写高效代码(8) 程序、数据访问符合Cache的时间、空间局部性
Cache正是利用了程序、数据访问时的时间局部性和空间局部性,为了使Cache的访问效率最高,程序和数据的组织,也应该要符合这两个特性。最典型的例子就是二维数组的访问,下面就是一个二维数组:二维数组 如果a[i][j]在Cache中,那么a[i][j+1]就很可能也在Cache中,但是a[i+1][j]则不一定。于是代码这样写就不太好: for转载 2015-03-27 21:11:50 · 1884 阅读 · 0 评论 -
编写高效代码(3) 减少处理器不擅长的操作——不要逼我做我不喜欢的事情
尺有所短,寸有所长,每种处理器都有自己擅长与不擅长的操作。 在与处理器配套发布的指令集手册中,都会描述每个指令的执行周期,单周期指令是处理器最喜欢的,不仅执行时间短,而且利于流水线执行。加、减、逻辑运算等,常常是单周期指令,乘、除、分支指令、浮点指令、内存存取操作等,常常需要较多的时钟周期。我们在编程时,就应该少使用执行时间长的指令。 Q:这些复杂指令都转载 2015-03-27 21:09:33 · 813 阅读 · 0 评论 -
编写高效代码(1) 减少函数调用——不要老打断我
函数是结构化程序设计的产物,它使代码更加模块化,耦合性更低,重用性更高。不过,函数调用会带来额外的开销,除了引起跳转外,还会产生额外的指令。 人都有这样的经验,做一件事情时,如果被人打断,重新再回来做这件事情,就需要一段恢复时间,如果老是被打断,那事情就没法做了。函数调用也是这样,要进行参数压栈出栈、寄存器保存、指令跳转等。多个步骤如果程序的性能要求较高,就可以将一些小的函数转载 2015-03-27 21:07:48 · 934 阅读 · 0 评论 -
编写高效代码(4) 在精度允许的条件下,将浮点数定点化
浮点指令要比定点指令慢很多,功耗也大很多,在精度要求不那么高的情况下,就可以将浮点数定点化,用定点指令来代替浮点指令,一个典型的例子就是alpha混合。 《反恐精英》是很多人非常喜欢的游戏,在下面的游戏截图中,一个人扔了个烟雾弹,画面呈现出半透明的烟雾效果,随着时间的推移,烟雾逐渐散去,画面恢复到原来的状态。 这种效果如果让美工来实现,那会把人累死,其实转载 2015-03-27 21:10:02 · 1943 阅读 · 3 评论 -
编写高效代码(5) 尽量减少分支
我们在介绍处理器时,已经知道了,现在的处理器都是流水线结构,if和switch等语句会带来跳转,而跳转会打乱流水线的正常执行,影响程序的执行效率。 下面这段代码,把奇数赋一个值,把偶数赋一个值,可以用这种方式实现: [cpp] view plaincopyprint?for(i=0; i { if转载 2015-03-27 21:10:22 · 887 阅读 · 0 评论 -
编写高效代码(6) 数据对齐访问
在32位处理器中,一个int型变量占4个byte,假设这个变量i在内存中占据2、3、4、5这4个byte的位置,如下图所示。 数据非对齐存储 内核在访问这个数据时,会先将从0开始的4个byte读入到寄存器A中,再将从4开始的4个byte读入到寄存器B中,再将有效的数据拼成一个int数据,放在寄存器C中,可见,这种访问效率是多么的低下啊,如果变量i存储在从0开始转载 2015-03-27 21:11:19 · 816 阅读 · 0 评论 -
编写高效代码(7) 优化内存访问——别让包袱拖垮了你
从理论上看,每条运算指令的执行时间都很短,大多数指令一个Cycle就能完成,很多时候还能一个Cycle执行多条指令,可是实际上,执行指令只是处理器要做的很少一部分工作,处理器还要从存储器中取指令,从存储器中将数据导入到寄存器中,等算完后,再将结果存入到存储器中。 处理器运算的速度像兔子赛跑一样快,但是存储器的访问速度像乌龟走路一样慢,而且越是远离内核的存储器,访问速度越慢。转载 2015-03-27 21:11:27 · 1342 阅读 · 0 评论