两个环体或一个(结果相同)
我一直想知道如何更好地利用CPU缓存(已知会受益于参考的位置) – 两个循环遍历相同的数学数组,每个循环都有不同的循环体,或者具有一个“两个”结合成一体的循环,从而完成相同的总体结果,但本身呢?
在我看来,有两个循环将引入更少的缓存未命中和驱逐,因为循环中使用的更多指令和数据适合缓存.我对吗? 假设: f和g的成本与完成包含每个的整个循环的成本相比可以忽略不计 迭代的集合是数学集合,而不是存储器中数字的容器,如矢量或列表.参见下面的例子. 请不要回答“过早优化是邪恶”的角色:-) 我倡导的双循环版本的一个例子: int j = 0,k = 0; for(int i = 0; i < 1000000; i++) { j += f(i); } for(int i = 0; i < 1000000; i++) { k += g(i); } 解决方法
我可以看到三个变量(即使在一个看似简单的代码块):
> f()和g()做什么?其中一个可以使所有指令高速缓存行无效(有效地将另一个引出)?也可以在L2指令缓存中发生(不太可能)?然后只保留其中一个可能是有益的.注意:逆并不意味着“有一个循环”,因为: 最后的想法:考虑到像上面这样的过程在你的系统中可能是一个罕见的事情(而且我很自由地使用“罕见”),你可以考虑将这两个函数内联起来,让编译器展开循环.这是因为对于指令缓存,故障回到L2并不大,而在该循环中包含i,j,k的单个缓存行将被无效的概率看起来并不可怕.但是,如果不是这样,一些更多的细节将是有用的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |