c++ - 缓存映射技术

标签 c++ caching memory

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

所以我了解到缓存映射有 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 Associativityhttps://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/

相关文章:

c++ - C++ 中的快速排序实现(失败测试)

c++ - 计算PI最多42个小数位

c++ - 将二维数组转换为一维数组以绘制线条

c++ - 获取 Qt5 中的语言列表

file - 如何避免在输入或中间输出文件更新后运行 Snakemake 规则

c# - 在 ASP.NET MVC 3 中缓存数据

javascript - 查找未销毁的 Vue 组件

ios View Controller 保持在内存中

android - Android如何计算缓存和数据大小?

C++ 结构数组和相等数组之间的区别