【问题标题】:Temporal vs Spatial Locality with arrays使用数组的时间与空间局部性
【发布时间】:2013-04-23 18:07:45
【问题描述】:

我对空间和时间局部性的含义有些困惑。我希望通过一个数组示例来查看它,它可以帮助我更好地理解它。

在这样的示例中: A[0][1]、A[0][2]、A[0][3]....等

这是否表明了时间局部性?我看到同一行被多次访问,但偏移量不同……这是否意味着访问了不同的地址?

另外,我说这样的例子是否正确: A[1]、A[2]、A[3]...等

展示空间局部性?

希望对时间和空间局部性如何在实际代码中工作的一些说明有助于我更好地理解它们。

【问题讨论】:

    标签: arrays caching cpu-architecture cpu-cache


    【解决方案1】:

    时间局部性:时间局部性基于重复引用的资源。

    空间局部性:空间局部性表明与最近引用的数据相邻的数据将在不久的将来被请求。

    【讨论】:

      【解决方案2】:

      虽然我记得两种类型的地方,但我时断时续地难以记住它们之间的区别。

      空间局部性要记住,记住“顺序”副词。

      时间局部性要记住,在开始学习排序算法时,您会看到要交换的“临时变量”。例如冒泡排序。它有两个循环,在那里交换就像int temp = .....

      你可以通过方式识别哪个定义属于什么。

      【讨论】:

      • 这些术语基于单词的标准英文含义。 Spatial = 在空间/位置。 Temporal = 时间关系。 Locality = 接近度。 (链接是谷歌词典)。 “临时”与“时间”有相同的词根,拉丁语“tempus”=时间。但除此之外,暂时和暂时是不同的概念。如果这种联系/助记技巧可以帮助您记住“时间”的含义,那就太好了。
      【解决方案3】:

      这是一个带有局部性的代码示例:

      var sum = 0;
      for (i = 0; i < n; i++){
        for(j=0; j < m ; j++){
          sum += a[i][j];
          }
      }
      return sum;
      
      • 存在时间局部性,因为 sum 在循环中经常被访问。通过将最近使用的指令和数据值保存在高速缓存中并利用高速缓存层次结构来利用时间局部性。甚至在寄存器中,根本不在内存中。

      • 存在 spatial locality 因为我们有一个数组 'a' 并且我们 按顺序访问数组的每个元素。空间局部性通常通过使用更大的缓存块并将预取机制(获取预期使用的项目)合并到缓存控制逻辑中来加以利用。

      【讨论】:

      • 我认为您颠倒了每个要点的第二句。顺便说一句,编译器会将sum 保存在寄存器中,而不是内存中,以获得重复访问的最大好处。
      • 是的,你的权利@peterCordes,我会做出调整
      • 对于未来的读者,空间局部性在此处出现,前提是a 以行优先顺序存储:a[0] [0], a[0][1],...,a[0][m],a[1][0], a[1][1],... 有些语言没有指定它们的二维数组就是这样存储的。例如,Fortran 就没有。在这种情况下,要获得空间局部性,需要交换循环。
      【解决方案4】:

      时间局部性空间局部性的特例。

      【讨论】:

      • 对于基于行/数据块的高速缓存(如 CPU 高速缓存)来说,这有点正确,而且是一个有趣的观察。 (而不是最近的搜索查询列表或其他东西,其中空间局部性甚至没有得到很好的定义。但这是一个计算机体系结构问题,其中缓存几乎总是某种地址空间,无论是 TLB,解码 - uop 缓存或数据缓存)。但通常空间局部性意味着附近的访问几乎是同时的,并且基本上是一个更大的访问的一部分。时间通常意味着很快,但不一定马上。
      • 即您需要空间 时间局部性来获得缓存命中,否则包含该项目的行将被驱逐。但是,是的,再次访问同一个项目的情况是空间局部性的一种特殊情况。如果它这么说,我想赞成这个答案,请考虑编辑:)
      • 为什么投反对票?这是正确的,也在en.wikipedia.org/wiki/…上给出。
      【解决方案5】:

      简单来说,

      时间局部性:资源在某一点被引用的概念 in time 将在不久的将来某个时候再次被引用。

      空间局部性:引用资源的可能性是 如果它附近的资源刚刚被引用,则更高。

      来源:维基百科

      【讨论】:

        【解决方案6】:

        空间和时间局部性描述了程序如何访问数据(或指令)的两个不同特征。维基百科上有一篇关于locality of reference 的好文章。

        如果引用的时间接近的事物在空间上也接近(附近的内存地址,磁盘上的附近扇区等),则称引用序列具有spatial 局部性。如果对同一事物的访问是及时聚集的,则称一个序列具有temporal 局部性。

        如果一个程序访问一个大数组中的每个元素并读取一次,然后移动到下一个元素并且不重复访问任何给定的位置,直到它触及所有其他位置,那么很明显 spatial locality 但不是 temporal locality。另一方面,如果一个程序在移动到另一个随机子集之前花时间重复访问数组上位置的随机子集,则称它具有时间局部性但不具有空间 em> 地方性。一个编写良好的程序将具有将一起访问的事物组合在一起的数据结构,从而确保空间局部性。如果您的程序很可能在访问 A 后不久访问 B,那么 AB 都应该分配在附近彼此。

        你的第一个例子

        A[0][1], A[0][2], A[0][3]
        

        显示空间局部性,在时间上接近的事物在空间上接近。它不显示时间局部性,因为您没有多次访问同一事物。

        你的第二个例子

        A[1], A[2], A[3]
        

        还显示空间局部性,但不显示时间局部性。

        这是一个显示时间局部性的示例

        A[1], A[2000], A[1], A[1], A[2000], A[30], A[30], A[2000], A[30], A[2000], A[30], A[4], A[4]
        

        【讨论】:

          猜你喜欢
          • 2011-11-08
          • 2016-02-03
          • 2011-12-16
          • 2014-01-29
          • 2018-07-24
          • 2013-05-09
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多