我试图了解CPU缓存是如何运行的.让我们说我们有这个配置(作为一个例子).
1)根据这些配置,标签的长度应为32-5 = 27位,索引大小为5位(2 ^ 5 =高速缓存行中每个字节的32个地址).
如果总缓存大小为1024且有32个缓存行,那么标记+索引存储在哪里?(还有另外4*32 = 128字节.)这是否意味着缓存的实际大小是1024 + 128 = 1152?
2)如果在这个例子中高速缓存行是32字节,这意味着当需要从RAM获取新字节时,32个字节被复制到高速缓存中.我是否正确地假设所请求字节的缓存行位置将由其地址确定?
这就是我的意思是:如果CPU在请求的字节[FF FF 00 08],则可用的高速缓存线将充满了从字节[FF FF 00 00]到[FF FF 00 1F].我们要求的单字节将处于适当位置[08].
3)如果前面的语句是正确的,是否意味着用于索引的5位在技术上是不需要的,因为所有32个字节都在缓存行中?
如果我出错了,请告诉我.谢谢
Joh*_*ley 17
缓存由数据和标记RAM组成,安排为访问时间与效率和物理布局的折衷.你错过了一个重要的统计数据:方式(集)的数量.你很少有单向缓存,因为它们在简单的模式下在病态上表现很差.无论如何:
1)是的,标签需要额外的空间.这是设计折衷的一部分 - 您不希望它占总面积的很大一部分,以及为什么行大小不仅仅是1个字节或1个字.此外,同时访问索引的所有标记,如果存在大量方法,则会影响效率和布局.尺寸略大于您的估计.通常还有一些额外的位来标记有效性,有时还有提示.更多的方式和更小的线路需要更大的分数占用标签,因此通常线路很大(32+字节)和方式很小(4-16).
2)是的.一些缓存还会执行"关键字优先"提取,其中它们从导致行填充的单词开始,然后获取其余的.这减少了CPU等待实际请求的数据的周期数.如果您错过了写操作,一些缓存将"直写"并且不会分配一行,这样就可以在写入之前首先读取整个缓存行(这并不总是一个胜利).
3)标签不会存储低5位,因为它们不需要匹配高速缓存线.他们只是索引到单独的行.
维基百科有一个非常好的,如果有点激烈,写在缓存:http://en.wikipedia.org/wiki/CPU_cache - 请参阅"实施".有一个如何分割数据和标签的图表.我,我认为每个人都应该学习这些东西,因为当你知道底层机器实际上能够做什么时,你真的可以提高代码的性能.
| 归档时间: |
|
| 查看次数: |
21091 次 |
| 最近记录: |