了解空间和时间局部性

时间:2018-05-03 22:22:43

标签: c cache-locality

我正在为我的架构决赛学习并遇到以下几行代码:

for(i = 0; i <= N ;i++){
   a[i] = b[i] + c[i]; 
}

问题是:“此代码段如何演示时间和空间位置的示例?请务必考虑 数据和指令的内存引用。“

就空间局部性而言,我相信代码通过访问连续的内存位置(a [0]然后a [i]等)来演示它。然而,我的困惑来自时间局部性。我不确定这段代码如何在一小段时间内引用相同的位置?任何形式的帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

  

我不确定这段代码如何在一小段时间内引用相同的位置?

正如已经评论过的那样,变量i被频繁访问,在您的示例中采用以下代码行:

a[i] = b[i] + c[i];

在此示例中,abc都可能是指指向不同内存位置的数组类型(即使是连续的,仍然不同);但是,每次引用变量i,然后确定要引用的数组的位置。

这样想:

get i from memory and store value in register x.
get value of b + [value in register x] from memory, store in register b.
get i from memory and store value in register y
get value of c + [value in register y] from memory, store in register c.
get i from memory and store value in register z
add value of [register b] to value in [register c] and store in memory location a + [value in register z]

优化编译器可能会看到此时间局部性,而是执行与以下类似的操作:

get i from memory and store value in register i.
get value of b + [value in register i] from memory, store in register b.
get value of c + [value in register i] from memory, store in register c.
add value of [register b] to value in [register c] and store in memory location a + [value in register i]

通过这种方式,i在相邻引用之间具有时间上的接近度。

我希望可以提供帮助。

答案 1 :(得分:1)

  

我不确定这段代码是如何引用相同的位置的   在很短的时间内。

除了txtechhelp's answer之外,构成for循环的指令也存储在内存中。每次执行时,都会从内存/高速缓存中“提取”这些指令。由于这些指令中的每一条在非常短的时间内执行N + 1次,这证明了时间局部性。