【问题标题】:Spacial Locality in loops循环中的空间局部性
【发布时间】:2014-05-06 05:30:21
【问题描述】:

据我了解,空间局部性与在不久的将来使用的附近内存有关。但是我想知道是否多次执行循环,这会导致良好的空间局部性吗?在此先感谢,如果我难以理解,请见谅。

【问题讨论】:

  • 没有代码无法回答这个问题。一些循环可能表现出很强的空间局部性,而另一些则可能没有任何表现。
  • 抱歉内容太宽泛了。你能给我举一个例子,说明一种强循环和不强循环吗?

标签: c performance loops localityofreference


【解决方案1】:

循环的迭代次数不一定会影响空间局部性。循环在做什么是做什么的。

在实践中,空间局部性的关键确实与缓存行有关。简单来说,限制对少量不同缓存行的访问的程序将表现出更多的缓存命中,从而获得更好的性能。访问大量不同缓存行的程序会遇到更多的缓存未命中,从而降低性能。

非常好的空间局部性:

uint8_t g_array[2];

void test(void) {
    int i, a=0;
    for (i=0; i<10000000; i++) {
        a += g_array[i % 2];      // Only ever accesses [0] or [1]
    }
}

这个循环有很好的空间局部性。数组很小,循环只访问索引 0 或 1。


空间局部性还是不错的:

uint8_t g_array[CACHELINE_SIZE] __attribute__ ((aligned (CACHELINE_SIZE)));

void test(void) {
    int i, a=0;
    for (i=0; i<10000000; i++) {
        a += g_array[i % CACHELINE_SIZE];
    }
}

这里我们有一个与一个缓存行对齐的数组。由于循环只访问该数组中的元素,我们可以说它具有良好的空间局部性 - 访问只会触及那个缓存行。


空间局部性差:

uint8_t g_array[RAND_MAX * CACHELINE_SIZE]
    __attribute__ ((aligned (CACHELINE_SIZE)));

void test(void) {
    int i, a=0;
    for (i=0; i<10000000; i++) {
        int r = rand();
        a += g_array[(r*CACHELINE_SIZE) + (i%CACHELINE_SIZE)];
    }
}

这个循环的空间局部性非常差。它正在访问整个内存中的随机位置。每次循环迭代,您可能会期望它反弹到不同的缓存行。这将导致各种缓存未命中,缓存本质上变得无用。

【讨论】:

  • @user3277606 就个人而言,我认为在没有接受答案的情况下留下这个问题是一件好事。它可能有助于提出其他意见。这里有很多聪明人(尤其是我添加的performance标签),我也想听听他们的意见。
  • 一个很好的例子是循环二维数组行和列与列和行与 4x4 正方形。
猜你喜欢
  • 2021-08-08
  • 2011-12-16
  • 1970-01-01
  • 2011-11-08
  • 2014-01-29
  • 2017-04-03
  • 2016-02-03
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多