【问题标题】:Fully Associative Cache全关联缓存
【发布时间】:2017-02-13 09:16:12
【问题描述】:

我正在尝试解决硬件问题,我需要查看以下嵌套循环发生了多少缓存未命中

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

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

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

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

【问题讨论】:

  • 如果arr 是一个普通的多维数组(而不是指针数组或其他东西),那么您的循环只是对内存块的顺序读取。假设 i、j 和 sum 没有溢出到内存中,缓存关联性在这里没有差异;即使是直接映射的缓存也会执行相同的操作。
  • 是的,arr 是多维数组

标签: c++ caching memory cpu-architecture


【解决方案1】:

假设一个整数存储在一个单词中。

让我们从 1st 内存访问开始,即。 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 在 cmets 中所说,在您的特定情况下,完全关联缓存的行为方式与直接映射缓存完全相同。

【讨论】:

  • 这个问题没有说整数。它们可以是字大小的floats,或者其他任何东西。您假设每个数组元素都是一个单词可能是预期的结果,即使该问题不排除两个单词double,或每个单词4 个char,或(因为这是C++)a具有重载 operator++ 的大型类。
  • @PeterCordes 是的。我假设元素大小是一个单词。但是我给出的想法足以计算任何大小的数据
  • 是的,当然 :) 我想我主要是想再多抱怨一下问题的质量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2015-07-17
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2015-01-10
  • 2012-02-25
相关资源
最近更新 更多