【问题标题】:Understanding spatial and temporal locality了解时空局部性
【发布时间】:2018-10-14 07:58:34
【问题描述】:

我正在为我的架构期末考试而学习,并遇到了以下代码行:

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

问题是:“这段代码sn-p如何演示时间和空间局部性的例子?一定要考虑 数据和指令的内存引用。”

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

【问题讨论】:

  • 代码不会在短时间内引用同一个位置,因为它只“引用”每个位置一次,除非a == b || a == c || b == c
  • 变量i在短时间内被大量访问。
  • @JGroven 问题是关于 a[0] 然后 a[i] 虽然您的观点确实考虑了 请务必考虑数据和指令的内存引用
  • @WeatherVane 这只是 OP 对空间局部性的解释,而不是问题。问题是关于空间和时间的局部性。
  • 我在您输入时编辑了之前的评论。

标签: c cache-locality


【解决方案1】:

我不确定这段 sn-p 代码是如何在短时间内引用同一个位置的?

正如已经评论的那样,变量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 正是通过这种方式在相邻引用之间建立了时间上的接近。

希望能帮到你。

【讨论】:

  • 这是子问题,但如果这里没有编译器优化,你将如何优化 OP 代码以提高时间局部性?
  • @GRC 它取决于这种情况下的代码细节(特别是因为这只是一个学术问题),但我最有可能做的优化类似于以下内容:while (N-- &gt;= 0) { *a++ = *b++ + *c++; } .. 但这对代码本身做出了某些假设。
【解决方案2】:

我不确定这个 sn-p 代码是如何引用同一个位置的 在很短的时间内。

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

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2011-11-08
    • 2014-01-29
    • 2016-02-03
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2012-08-09
    • 2016-01-14
    相关资源
    最近更新 更多