【问题标题】:Cache mapping techniques缓存映射技术
【发布时间】:2018-12-05 04:33:20
【问题描述】:

我试图了解硬件缓存。我有个小想法,但我想在这里问一下我的理解是否正确。

所以我知道缓存映射有 3 种类型,直接、完全关联和集合关联。

我想知道用硬件中的逻辑门实现的映射类型,具体来说是一些计算机系统,为了更改映射,需要更改电气连接?

我目前的理解是,在 RAM 中,存在一个内存地址来引用每个内存块。块内包含单词,每个单词包含多个字节。我们可以用位数来表示选项的数量。 例如,4096 个内存位置,每个内存位置包含 16 个字节。如果我们要引用每个字节,那么 2^12*2^4 = 2^16 需要 16 位内存地址来引用每个字节。

高速缓存还具有内存地址、有效位、标记和一些数据,这些数据能够存储一块 n 字和 m 字节的主存储器。其中 m = n*i(每个字的字节数)

例如,直接映射 1 块主内存只能位于高速缓存中的一个特定内存位置。当 CPU 使用 RAM 的 16 位内存位置请求某些数据时,它首先检查缓存。 它怎么知道这个特殊的 16 位内存地址只能在几个地方?

我的想法是,每个 RAM 地址与缓存地址之间可能存在某种电气连接。然后可以将 16 位地址拆分为多个部分,例如仅将左 8 位与每个高速缓存地址进行比较,然后如果匹配则比较字节位,然后标记位,然后是有效位

我的理解正确吗?谢谢! 如果有人阅读这篇长文,真的很感激

【问题讨论】:

  • 也许electronics.stackexchange.com 是这个问题的更好论坛,因为这个问题是关于硬件的。
  • 好的,我试试看

标签: c++ caching memory


【解决方案1】:

您可能想阅读 Ulrich Drepper 的 What Every Programmer Should Know About Memory 中的 3.3.1 Associativityhttps://people.freebsd.org/~lstewart/articles/cpumemory.pdf#subsubsection.3.3.1

标题有点吸引人,但它详细解释了您所询问的一切。

简而言之: caches 的问题是比较次数。如果你的cache 持有 100 个块,则需要在一个周期内执行 100 次比较。您可以通过引入sets 来减少这个数字。如果一个特定的内存区域只能放置在插槽 1-10 中,则将比较次数减少到 10。 sets 由内存地址内称为索引的附加位字段寻址。 因此,例如您的 16 位(来自您的示例)可以分为:

[15:6] block-address; stored in the `cache` as the `tag` to identify the block
[5:4] index-bits; 2Bit-->4 sets
[3:0] block-offset; byte position inside the block

所以方法的选择取决于硬件资源的可用性和您想要归档的访问时间。它几乎是硬连线的,因为您想减少比较逻辑。

【讨论】:

    【解决方案2】:

    很少有映射函数用于映射高速缓存行与主内存

    • 直接映射
    • 关联映射
    • 集关联映射

    你必须对这三个映射函数有一点了解

    【讨论】: