Arrays C-缓存线和关联 上下文

Arrays C-缓存线和关联 上下文,arrays,caching,memory,optimization,computer-architecture,Arrays,Caching,Memory,Optimization,Computer Architecture,阅读有关缓存优化的论文(与循环中的缓存线关联…) 问题与此上下文相关:1024个整数的数组 大小:cpu缓存64k,缓存线32字节,整数大小: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 useless

阅读有关缓存优化的论文(与循环中的缓存线关联…)

问题与此上下文相关:1024个整数的数组

大小:cpu缓存64k,缓存线32字节,整数大小: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[4]所处的地址不会导致缓存线加载,而不是arr[7]

int数组通常在4字节边界上对齐(假设int为32位,字节为8位),因此您不知道缓存线边界在哪里

要吸取的教训是,您不应该担心偶尔的缓存线被浪费(即使用2条缓存线,即使您需要的数据小于32字节),因为在用C编写代码时,这大部分是您无法控制的

如果存在性能问题,您可能会担心的是选择减少缓存未命中的算法

典型的例子是循环:

int array[N][M];  // Assume N * M * sizeof (int) is much larger than the cache.

// Example 1
for (i=0; i<N; i++) {
  for (j=0; j<M; j++) {
    <do something with array[i][j]>
  }
}

// Example 2
int array[N][M];
for (j=0; j<M; j++) {
  for (i=0; i<N; i++) {
    <do something with array[i][j]>
  }
}
int数组[N][M];//假设N*M*sizeof(int)比缓存大得多。
//例1

就你的主要问题而言,是的,你在两种情况下都是正确的

在第二种情况下,如果加载了
arr[7]
,并且可能希望继续向上运行,您应该注意,编译器或某些预取机制可能会考虑此类数据的性能,从而提高性能


更进一步说,如果数组在内存中没有正确对齐,读取数组中的其他地址可能会导致缓存线加载,而不是
arr[7]
,但在这种情况下,对齐不是由您决定的,而是由编译器决定的。

谢谢。+1对于失控,我认为ex2会有更多缓存未命中是正确的吗?