我们都知道以下代码的性能较低,因为在每次迭代时,CPU都会从RAM中加载新元素s
。
#define N a very large number
struct{
float m;
int x[N]
} S;
void main(){
struct S s[elements];
...
//working with data
for (i=0; i<elements;i++){
total+=s[i].m;
}
...
}
如果N很小,并且elements
种类s
可以保留在缓存中,则速度非常快。否则,CPU将始终向RAM请求新元素。
由于数组s [k] .x未在循环内部使用,所以要求CPU收集缓存中的元素,让我们说每个N*sizeof(int)
个字节都存在?< / p>
这样,缓存将包含所有s [k] .m变量,因此它可以将所有内容保存在缓存中。
答案 0 :(得分:0)
这是现代CPU能够识别的模式。阅读Optimizing Application Performance on Intel® Core™ Microarchitecture Using Hardware-Implemented Prefetchers:
硬件预取器:硬件预取器在没有程序员干预的情况下透明地运行,以从内存中获取数据流和指令到统一的二级缓存中。预取器能够以向前或向后的方向处理多个流。当在最后一级高速缓存中发生连续高速缓存未命中并且检测到访问模式中的步幅时触发它,例如在访问数组元素的循环迭代的情况下。