结合最近的工作和这篇文章,把prefetch杂七杂八的想法整理一下。
最近在armv5t平台上调优,测试发现一次l1 dcache miss的开销是70cycle左右。对高性能要求的业务而言,这个开销是非常可观的。
比较可靠的提高dcache效率的方法:
1、减小数据结构。
2、重新组织数据结构,将访问概率大的成员放到一起。
比较不可靠的方法,prefetch就是其中名头最响的一种了,基本上性能调优的书都会推荐这个,呵呵。
按照lwn这篇文章解释,prefetch在x86平台上是无益甚至有害的,因为x86有硬件data prefetch单元(
http://software.intel.com/en-us/blogs/2009/08/24/what-you-need-to-know-about-prefetching)
而且工作的还相当好。呵呵,在真理面前,再牛逼的程序员也显得自以为是啊。。。
armv5下没有data prefetch单元,貌似cortex-a9才开始有。prefetch应该还是有用的,但是作用有限。我觉得有几个前提条件:
1)一般都是在循环中使用prefetch,其他代码不太合适。
2)循环次数够多。
3)循环体工作集不能过大。否则ache controller访问内存都忙不过来,哪里顾得过来prefetch啊。
4)循环体计算量要够大,能屏蔽掉prefetch本身的开销。
基本上,我觉得就是在一些计算密集型的算法代码使用prefetch,其他地方都得慎用。
阅读(2266) | 评论(0) | 转发(0) |