【问题标题】:How does a cache actually store data in the "offset"? [closed]缓存实际上如何将数据存储在“偏移量”中? [关闭]
【发布时间】:2014-04-06 14:07:53
【问题描述】:

因此,对于我的计算机体系结构课程,我必须在 C# 上模拟缓存/内存关系,但我只是不确定缓存如何实际存储数据。我得到了缓存标签的概念,但我真的没有得到偏移量。

假设我有一个可容纳 256 个 32 位整数的 RAM。我想拥有一个缓存系统,其中我有一个包含 8 个 32 位整数的缓存。但是然后在缓存中的那些 32 位整数中,我需要添加标记和有效位,这使其大致缩小到 26 位左右。那么如何将 32 位数据存储在剩下的 26 位中呢?

这是我现在拥有的代码,它仍在进行中

class Memory
{
    public List<UInt32> instructions = new List<UInt32>();

    const int directCacheSize = 8;
    ulong[] directCache = new ulong[directCacheSize];

    private int[] stack = new int[256];

    public int this[int i]
    {
        get
        {
            int directMapIndex = i % directCacheSize;
            if (directCache[directMapIndex] == Convert.ToUInt64(stack[i]))
            {
                return Convert.ToInt32(directCache[directMapIndex] - 18446744069414584320);
            }
            else
            {
                directCache[directMapIndex] = (Convert.ToUInt64(i) << 32) + Convert.ToUInt64(stack[i]);
                return stack[i];
            }
        }
        set
        {
            stack[i] = value;
        }
    }
}

【问题讨论】:

  • 我很难理解这个问题。缓存不存储偏移量中的数据;缓存将数据存储在数据块中。

标签: c# caching computer-architecture


【解决方案1】:

我一直在努力理解这个几乎不连贯的问题,我想我明白了。

我最初认为您的基本错误是从数据大小中减去了用于维护缓存数据结构位的位;这没有任何意义。它们被添加到数据大小中。

但后来我意识到不,您的基本错误是您将位与字节混淆了。您从 32 个 字节 减去 六个 得到 26,但您应该将 6 个位 添加 到 32 x 8

令人困惑的错误是,您似乎也将数据块的偏移量与数据块本身混淆了。数据块存储数据。 偏移量标识数据块内相关数据的位置。偏移量是有效地址的一部分,而不是缓存行

您似乎也完全忘记了肮脏的部分。

那么我的直接地图缓存中的单个块将如下所示:[tag 5bit][data 32bit]

没有。 32在这个问题中出现的次数让你很困惑:

  • 8 个 32 位字是 32 个字节
  • 5 位可以代表 32 个可能的标签
  • 如果您有 32 个标签和 1024 个字节,则每个标签标识 32 个字节

有很多 32,你把他们搞糊涂了。

重新开始。

假设您想要一行包含 8 个 32 位字,总共 32 个字节。单个缓存行中必须包含什么?

  • 32 个字节——不是位
  • 标识 32 个字节的来源的标签
  • 一个有效位
  • 一个脏位

如果我们假设 32 字节只能在 32 字节边界上,并且有 1024 / 32 = 32 个这样的边界,那么对于标签我们需要 log2(32) = 5 位,所以总缓存行大小应该是:

  • 32 字节 NOT BITS 数据
  • 5位标签
  • 一个有效位
  • 一个脏位

有意义吗?

【讨论】:

  • 感谢您花时间回答我的问题,如果措辞奇怪,我们深表歉意。因此,对于我的示例,我必须将 26 位更改为 32 位?那么我的直接地图缓存中的单个块将如下所示:[tag 5bit][data 32bit]?
  • @KeithYong:不。我终于明白你为什么感到困惑了。您将位与字节混淆了。我会在我的答案中添加更多内容。
  • @KeithYong:你的问题让我想起了一个著名的谜题:三个人共用一个 300 美元的酒店房间,每人支付 100 美元现金。经理意识到他多收了费用;房间只有250美元。经理带着五个十人把服务生送到房间。服务员决定保留 20 美元,并给每个人 10 美元。所以每个人付了 90 美元,乘以 3 是 270 美元,而服务员保留了 20 美元,所以这就是 290 美元。丢失的 10 美元钞票在哪里?
  • 好的,我现在看到了错误,但我仍然对缓存的其他事情感到困惑。因此,如果我想将一个 32 位整数存储到缓存的块 #1 中,我会将它放在块中的哪个位置?该块是否能够保存许多 32 位整数以供使用?所以,也许它看起来像 [tag 5bit][data 32bit][tag 5bit][data 32bit] ... [tag 5bit][data 32bit]
  • @KeithYong:您对处理器缓存的工作原理非常困惑;我不确定我是否可以在简短的评论中让您感到困惑,而且时间不多。处理器高速缓存是高速缓存行的集合。每个高速缓存行都包含一份主存的副本,称为数据块。每个数据块的大小相同。如果你有 8 条缓存线,每条都包含 4 个字节,那么每条都包含来自主存的一个特定区域的 4 个字节,而不是来自这里的一个字节和来自那里的另一个字节。
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多