+ -
当前位置:首页 → 问答吧 → 《深入理解计算机系统》疑问

《深入理解计算机系统》疑问

时间:2011-08-19

来源:互联网

请问各位大侠:

  最近在看《深入理解计算机系统》第6章存储器层次结构,在编写高速缓存友好的代码那儿有看到这样的总结,步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块,但是在第五章优化程序性能那一章提到为了考虑到流水线化的能力可在循环内使用多次展开,多路并行的方法,小弟这里疑问就是:那我们平时该如何取舍呢?还有书上练习题6.10引用地址0X0E34为什么会命中。谢谢。

作者: iampengxiaojin   发布时间: 2011-08-19

我有这样的问题哈,你说第6章的东西我的理解是在讲从cache获得数据,而在第5章讲的东西好像是在讲code的优化.你把针对数据获取与代码优化的不同方法做了以下比较是什么意思?不知道我是不是真的理解LZ了。

作者: wt_net   发布时间: 2011-08-20

循环展开也有限制的,不是展开越多越好.
而且也涉及到编译优化.
现代的编译器优化已经很好了, 除非检测到是瓶颈, 否则不建议手动循环展开.

for (; i<n; ++i) //这个每执行一次都有要判断i<n 循环展开可以消除掉一些判断次数. 
  dosomthing;

另外一个:
循环展开示例

以下循环展开示例显示在进行展开的同时如何使其它优化方法成为可能:

展开之前:

do i=1,100

if (i mod 2 == 0) then a(i) = x

else a(i) = y

enddo

展开之后

do i=1,100,2

a(i) = y

a(i+1) = x

enddo

在本例中,执行 100 次的循环将 x 赋给偶数编号的每个元素,将 y 赋给每个奇数编号的元素。通过展开循环,可以在每个迭代中同时执行两个赋值,从而消除循环体中的一个分支。

作者: zmlovelx   发布时间: 2011-08-20