语境
阅读有关缓存优化的文章(与循环中的缓存行关联。)
问题与此上下文有关:1024个整数的数组。
大小:CPU缓存64k,缓存行32bytes,整数大小:4个字节。
英特尔酷睿2处理器
问题
根据我的CPU,高速缓存行中可以容纳8个整数。
[0,1,2,3,4,5,6,7,8,9,10,...,1023]
^
If I want to access 4 and go downward, 3,2,1 and 0 will be loaded already. 5,6,7 are loaded uselessly.
[0,1,2,3,4,5,6,7,8,..,1023]
^
If I want to access 7 and go downward, all the next elements will be in cache already. if I want to go upward, according to my cpu I will have to load another cache line immediatly after the arr[7] read.
我对么 ?更进一步
但是什么告诉我arr [4]不在将导致缓存行加载的地址上,而不是arr [7]?
如果我的说法是正确的,我们不仅应该考虑数组内对齐,还应该考虑程序的整个内存对齐,以最大程度地减少缓存浪费,对吗?
最佳答案
就您的主要问题而言,是的,在两种情况下您都是正确的。
在第二种情况下,加载了arr[7]
并可能希望继续向上运行,您应该注意,可能是编译器或某种预取机制都将此类数据的spatial locality考虑在内,从而提高了性能。
更进一步,如果数组未在内存中正确对齐,则确实读取数组中的其他地址可能会导致缓存行加载而不是arr[7]
加载,但是在这种情况下对齐不取决于您,而是取决于编译器。