完全关联缓存

时间:2016-10-05 04:08:51

标签: c++ caching memory cpu-architecture

我想为hw设计一个问题,我需要看看下面的嵌套循环有多少缓存未命中

for i=0; i < 32 ; i++
   for j=0; j < 32; j++
      sum += arr[i][j];

我有一个完全关联的缓存,它有16个缓存行,每个缓存行可以存储32个字。缓存最初为空,arr [0] [0]映射到第一个缓存行

现在根据我的理解,总共会有32个未命中。最初在发出请求时,缓存为空,因此计为未命中,根据完全关联的缓存,所有块都会填充,然后LRU被申请;被应用。

我在这里有点困惑,可以在这里使用一些指导

1 个答案:

答案 0 :(得分:2)

假设整数存储在单词中。

让我们从1 st 内存访问开始,即。 arr[0][0]。这将导致错过强制性错过。这将把32个整数带入缓存。 为了我们的利益,我们将在进一步访问中访问这些确切的内存位置。哪个位于arr[0][0]arr[0][31]

现在,当我们访问arr[1][0]时,我们正在访问第33个位置,而这不在我们的缓存中。所以这又是一次失败。

通常,对于您访问的每32个值,您都会错过。请注意,这仅适用于您所显示的那种循环:

for i=0; i < 32 ; i++
   for j=0; j < 32; j++
      sum += arr[i][j];

这里的内存访问是连续的。此外,正如@Peter Cordes在评论中所说,完全关联的缓存在特定情况下的行为方式与直接映射缓存完全相同。