我正在尝试了解硬件缓存。我有点想法,但我想在这里问一下我的理解是否正确。
所以我了解到缓存映射有 3 种类型,直接映射、全关联映射和集合关联映射。
我想知道在硬件中用逻辑门实现的映射类型是什么,具体来说是某些计算机系统,为了改变映射,需要改变电气连接吗?
我目前的理解是,在RAM中,存在一个内存地址来引用每一 block 内存。 block 内包含字,每个字包含多个字节。我们可以用位数表示选项的数量。 例如,4096 个内存位置,每个内存位置包含 16 个字节。如果我们要引用每个字节,那么 2^12*2^4 = 2^16 需要 16 位内存地址来引用每个字节。
缓存还有一个内存地址、有效位、标记和一些数据,能够存储一个 n 字的主内存块,也就是 m 字节。其中 m = n*i(每个字的字节数)
举个例子,直接映射 1 个主内存块只能位于高速缓存中的一个特定内存位置。当 CPU 使用 RAM 的 16 位内存位置请求某些数据时,它首先检查缓存。 它怎么知道这个特定的 16 位内存地址只能在几个地方?
我的想法是,每个 RAM 地址与高速缓存地址之间可能存在某种电气连接。然后可以将16bit地址拆分成几个部分,比如只比较左边的8bits和每个缓存地址,如果匹配则比较字节位,然后是标记位,然后是有效位
我的理解对吗?谢谢! 如果有人阅读这篇长文章,真的很感激
最佳答案
您可能需要阅读 Ulrich Drepper 的 What Every Programmer Should Know About Memory 中的 3.3.1 Associativity
。
https://people.freebsd.org/~lstewart/articles/cpumemory.pdf#subsubsection.3.3.1
标题有点朗朗上口,但它详细解释了您提出的所有问题。
简而言之:
缓存
的问题是比较次数。如果您的缓存
包含 100 个 block ,则您需要在一个周期内执行 100 次比较。您可以通过引入 sets
来减少这个数字。如果特定内存区域只能放在插槽 1-10 中,则将比较次数减少到 10 次。
集合
由内存地址中称为索引的附加位域寻址。
因此,例如您的 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
因此方法的选择取决于硬件资源的可用性和您要归档的访问时间。它几乎是固定的,因为您想减少比较逻辑。
关于c++ - 缓存映射技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53625231/