缓存颠簸,一般帮助理解

时间:2014-02-04 11:32:09

标签: caching

我正在尝试了解缓存抖动,以下文字是否正确?

以下面的代码为例。

long max = 1024*1024;
long a(max), b(max), c(max), d(max), e(max); 
for(i = 1; i < max; i++) 
    a(i) = b(i)*c(i) + d(i)*e(i);

ARM Cortex A9是四路组关联,每个缓存行为32字节,总缓存为32kb。总共有1024个缓存行。为了执行上述计算,必须移动一个高速缓存行。当a(i)被计算时,b(i)将被抛出。然后当循环迭代时,需要b(i),因此移位另一个向量。在上面的示例中,没有缓存重用。

要解决此问题,可以在向量之间引入填充,以便将它们的起始地址分隔开。理想情况下,每个填充应至少为完整缓存行的大小。

上述问题可以解决这个问题

long a(max), pad1(256), b(max), pad2(256), c(max), pad3(256), d(max), pad4(256), e(max) 

对于多维数组,足以使前导维度为奇数。

如果上述情况属实或我发生错误,请提供任何帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

每个载体需要8MB内存(1024 * 1024 * 8B,假设8B为长)。因此,如果连续分配这些向量,则a(i),b(i),c(i),d(i)和e(i)将映射到相同的高速缓存集(总是不是相同的高速缓存行,因为它是2种方法)。然而,在缓存集中一次只能有两个。因此,当包含d(i)和e(i)的缓存行被放入缓存时,包含b(i)和c(i)的缓存行将被逐出。

如果您确定这些向量是连续分配的,则可以使用一个高速缓存行大小(即32B)填充它们。那就行了。因此a(i),b(i),c(i),d(i)和e(i)将在连续的高速缓存集上。在访问向量的4个元素后,每个缓存行将被逐出。这是因为每个缓存行包含4个长变量(a(0),a(1),a(2),a(3)将在同一缓存行上,将是a(4),a(5), a(6),a(7))。

所以你声明你的矢量

long a(max),pad1(32),b(max),pad2(32),c(max),pad3(32),d(max),pad4(32),e(max)

有关相关讨论,您可以点击此链接

why-is-one-loop-so-much-slower-than-two-loops