“数据位”容量与“开销位”大小?

我有点卡住,因为我找不到任何覆盖缓存的“数据”部分的东西,我用Google搜索的所有内容都使用缓存的地址达到了99.9%。 我被问到的问题是这样的

对比“数据位”容量和“开销位”大小之间的差异
对于两个缓存。

我不想要答案,所以我不会发布实际的设置大小,什么不是,我只是寻找一个方向可能是一个网站或解释如何“对比”两个。 任何可能的帮助都非常感谢!

我不确定你是否已经为这个问题给了我们足够的背景,但是这里有。

高速缓存不仅要存储实际的高速缓存数据,还要存储每个数据 – 它所引用的“索引”。 因此,当您查找记录N时,缓存不仅必须保存记录N的值,还必须保存N – 以便您可以实际查找数据。 这是一种非常简单的方式来看待它。 缓存可以具有其他元数据以指示有效性和上次访问时间等。

示例#1:32位地址空间中的字节缓存

每个高速缓存条目必须存储数据值(8位)加上地址(32位)= 40位,

示例#2:32位地址空间中的32位字的高速缓存

每个高速缓存条目必须存储数据值(32位)加上地址(32位)= 64位,

您可以看到示例#1的开销明显更高。

一如既往,维基百科可能有所帮助。 http://en.wikipedia.org/wiki/Cache_(computing

缓存存储数据,通常在SRAM中,如数据数组,但也有开销。 我并不特别喜欢术语“数据位大小”和“开销位大小”,因为(a)存在不是存储位单元的开销,以及(b)并非所有位单元都具有相同的成本。 但是现在让我们继续这些条款。

我的看法是“开销位大小”可能是指为了访问高速缓存而需要存储的标记位数。 通常这些存储在不同的数组中,与数据数组分开的标记数组。 与数据位数相比较。

这里有三个简单的例子:

考虑一个32 KiB(千字节)的缓存,具有64个B(字节)缓存行。 通常,我们会让地址的0-5位为高速缓存行偏移量。

32 KiB /(64 B / line)=> 2 ^(5 + 10)/ 2 ^ 6 => 2 ^ 9 => 512个高速缓存行。

— ++示例1:直接映射

让我们想象它是一个直接映射的缓存。 然后我们可以将接下来的9位(地址的第6-14位)作为高速缓存行数组的“索引”。

到现在为止还挺好。 现在,要弄清楚标记,我们需要知道完整的地址宽度。 我们假设它是64位(尽管大多数“64位”机器在2012年仅实现40或48位)。 为了区分高速缓存行与映射到高速缓存中相同条目的任何其他高速缓存行,我们需要将地址的剩余位(位15-63,49位)存储为标记。

然后,通过提取索引,读出带有该索引的标签和数据,将读出的标签与我们正在查找的地址的标签进行比较,如果它们匹配则声明命中和未命中,继续访问这种直接映射的高速缓存。如果没有,依此类推。

开销:每64B(512位)数据有49位标记。

总计:*标签或“开销”:512 * 49位*数据位:512 * 512 = 32KiB = 256 Kib(kibi位)。

— ++例2:8路组关联

现在让我们假设缓存是8路关联的。 这意味着512行将分为512/8 = 64组,每组包含8行。

高速缓存行内的偏移量仍为0-5位。

但是,我们现在只需要6位作为索引来确定设置数。 比特6-11。

标签需要是所有剩余的位,位12-63,总共52位。

因此,8路关联高速缓存的标记开销是512位数据的52位标记。

总计:*标签:512 * 52位*数据:512 Kib

比较直接映射的49位标记。 8路组关联基本上将log2(8)更多位移动到标签中; 通常,N路组关联将ceil(log2(N))位移动到标签中。

— ++例3:完全关联

这是直接映射的频谱的远端。 我们每个高速缓存行仍然有512位数据,但现在除了6位偏移之外,整个64位地址都是标记。 用于完全关联的58位标记,而8位用于52位,而直接映射用49位。

但请记住我说我不喜欢“架空位”一词? 完全关联高速缓存中的标记位通常不仅必须是普通存储位,还必须具有比较器 – 基本上是异或门。 这种“CAM(内容可寻址存储器)”位通常比普通位更昂贵。

— +结论

所以,我认为这是你老师想要的:数据位与标记位的直接比较。 这是开销的下限。

从直接映射到N路组关联到完全关联的频谱提供了一个例子。 但是缓存设计的其他方面会影响开销。 例如:

  • 如果使用不同的地址大小,则开销百分比会发生变化。 例如,32位地址在diredt映射示例中仅具有17位标记,而对于64位地址则为49位。

  • 如果更改缓存索引function,则可能需要更改标记大小。 例如,在高速缓存中具有素数的高速缓存行或集合有一些好处,例如对于sdirect映射的高速缓存而言为511行而不是512行。 像这样的素数减少了共振问题。 但简单地说,它们需要将标签宽度增加到全宽58位。

  • 像扇区高速缓存这样的方案允许共享标记位的某些部分。

等等。

至于教程网站:

  • 对不起,我不知道有哪些这样的初学者的东西。 但我会google许多大学的课堂笔记。

  • 我的网站http://comp-arch.net涵盖了计算机体系结构的高级主题。 但是这种事情太基础了,太基础了,我不能把它放在comp.arch上。 虽然我认为在进入高级主题之前我应该​​先写一些基本的简单解释。 偶尔我会写这样的教程,但是我还没有收集它们。

  • USEnet新闻组comp.arch可能很有用。

— +为什么这对堆栈溢出的程序员来说很重要?

这主要是硬件主题。

但程序员调整代码需要理解这样的东西,以获得最佳性能。

由于你已经标记了计算机体系结构和C我假设这是一个任务,你被要求用C或类似的东西制作缓存“模拟器”。 并且问题中的“两个缓存”指的是两种不同类型的缓存(完全关联,n路,直接映射……)。 在该范围内,问题是要求您讨论两种类型的缓存之间的差异,主要是“开销位”大小之间的比率,这是缓存条目缓存所需的信息(有效位,偏移量,标记)和“数据位“这是存储在高速缓存行中的实际数据。 我希望这有帮助。