参考地点 - 等距地区的英语解释

时间:2012-03-20 09:45:12

标签: computer-science localityofreference

我正在阅读关于Locality of Reference的维基百科文章,我不禁发现 Equidistant Locality 的解释相当神秘。

我真的无法理解它,我想知道是否有人可以尝试用简单的英语解释它?

  

等距地点:它位于空间位置和空间之间   分支机构所在地。考虑一个访问位置的循环   等距模式,即时空坐标中的路径   空间是一条虚线。在这种情况下,一个简单的线性函数就可以   预测在不久的将来将访问哪个位置。

以等距模式访问位置的循环”是什么意思?这些位置彼此之间的距离是否相等?

关于“时空坐标空间是一条虚线。”的所有垃圾是什么?这对我来说毫无意义。

如果有人可以对 Equidistant locality 的意思做出一些澄清,那就太棒了!

2 个答案:

答案 0 :(得分:2)

我认为最好用例子来解释。这些地方原则通常用于优化事物。现代CPU中可能的组件是内存预取器,它会尝试猜测您将使用哪个内存,并在需要时将其放入缓存中。这在很大程度上依赖于地方原则。

以数组为例,如果你这样做(c ++例子):

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> test = { 1, 2, 3, 4, 5};
    for(int& i: test)
    {
        std::cout << i << std::endl;
    }
}

在向量(或其他语言中的数组)中,元素被打包在具有固定步幅的连续块中。因此,如果test的第一个元素位于地址X,则第二个元素位于X+Y,第三个元素位于X+2Y...。因此,向量本身是空间局部性的一个非常基本的例子,甚至更好的局部性是非常可预测的。 接下来,元素在紧密循环中被访问,因此我们也具有良好的时间空间性。因为元素也是按顺序访问的,所以我们在'spacetime'中具有等距的空间。这意味着一旦CPU识别出X+Y, X+2Y, X+3Y模式,它就会立即开始拉入缓存中的未来元素。

您可以将其与例如:

进行对比
#include <iostream>
#include <list>

int main()
{
    std::list<int> test = { 1, 2, 3, 4, 5};
    for(int& i: test)
    {
        std::cout << i << std::endl;
    }
}

在链接列表中,元素互相引用,并且各个元素可以位于内存中的任何位置,因此您将失去空间局部性。但是,您可以访问循环中的元素,因此您仍然具有时间空间性。像这样的东西更难以检测和优化预取(但并非不可能)。

最后,作为一个指标,为什么组合时空空间很重要,请考虑这个(有点人为的)例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <iterator>

int main()
{
    std::vector<int> test = { 1, 2, 3, 4, 5 };
    std::vector<unsigned int> indices = { 0, 1, 2, 3, 4 };
    std::random_device rd;
    std::shuffle(std::begin(indices), std::end(indices), std::mt19937 { rd() });
    for (unsigned int& i : indices)
    {
        std::cout << test[i] << std::endl;
    }
}

如果您纯粹查看test容器,它又具有良好的空间局部性(如第一个示例中所示)。如果您查看循环中的test访问权限,您会发现查找中存在时间局部性。但是,在“时空”中,当您从数组的一部分跳到另一部分时,查找不是等距的,访问不是顺序的,因此空间和时间都没有等距的空间。这几乎是不可能优化的。

答案 1 :(得分:1)

  

以等距模式访问位置的循环

这非常神秘,但如果我不得不猜测,这意味着循环的所有迭代都具有相同级别的空间/时间局部性:如果循环只是迭代数组,那么在每次迭代中,我们访问位于前一个元素旁边的元素(因此空间局部性与上一次迭代中的相同),并且它与最后一次迭代中的“近期”一样(因此时间局部性也不变)。

因此,每次迭代的等距位置都是相同的。