《深入理解计算机系统》疑问
时间:2011-08-19
来源:互联网
请问各位大侠:
最近在看《深入理解计算机系统》第6章存储器层次结构,在编写高速缓存友好的代码那儿有看到这样的总结,步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块,但是在第五章优化程序性能那一章提到为了考虑到流水线化的能力可在循环内使用多次展开,多路并行的方法,小弟这里疑问就是:那我们平时该如何取舍呢?还有书上练习题6.10引用地址0X0E34为什么会命中。谢谢。
最近在看《深入理解计算机系统》第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 赋给每个奇数编号的元素。通过展开循环,可以在每个迭代中同时执行两个赋值,从而消除循环体中的一个分支。
而且也涉及到编译优化.
现代的编译器优化已经很好了, 除非检测到是瓶颈, 否则不建议手动循环展开.
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28