了解CPU缓存和缓存行

我试图了解CPU缓存是如何运行的 . 让我们说我们有这个配置(作为一个例子) .

  • 缓存大小1024字节

  • 缓存行32个字节

  • 1024/32 = 32个缓存行全部在一起 .

  • Singel缓存行可以存储32/4 = 8个整数 .

1)根据这些配置,标签的长度应为32-5 = 27位,索引大小为5位(2 ^ 5 =高速缓存行中每个字节的32个地址) .

如果总缓存大小为1024且有32个缓存行,那么标记索引存储在哪里? (还有另外4 * 32 = 128个字节 . )这是否意味着缓存的实际大小是1024 128 = 1152?

2)如果在这个例子中高速缓存行是32字节,这意味着当CPU需要从RAM获取新字节时,32个字节被复制到高速缓存中 . 我是否正确地假设所请求字节的缓存行位置将由其地址确定?

这就是我的意思:如果CPU在 [FF FF 00 08] 请求了字节,那么可用的缓存行将填充从 [FF FF 00 00][FF FF 00 1F] 的字节 . 我们需要的单字节位于 [08] 位置 .

3)如果前面的语句是正确的,是否意味着用于索引的5位在技术上是不需要的,因为无论如何所有32个字节都在缓存行中?

如果我出错了,请告诉我 . 谢谢

回答(3)

2 years ago

缓存由数据和标记RAM组成,作为访问时间与效率和物理布局的折衷安排 . 你错过了一个重要的统计数据:方式(集)的数量 . 你很少有单向缓存,因为它们在简单的模式下在病态上表现很差 . 无论如何:

1)是的,标签需要额外的空间 . 这是设计折衷的一部分 - 您不希望它占总面积的很大一部分,以及为什么行大小不仅仅是1个字节或1个字 . 此外,同时访问索引的所有标记,如果存在大量方法,则会影响效率和布局 . 尺寸略大于您的估计 . 通常还有一些额外的位来标记有效性,有时还有提示 . 更多的方式和更小的线路需要更大的分数占用标签,因此通常线路很大(32字节)和方式很小(4-16) .

2)是的 . 一些缓存还会执行“关键字优先”提取,其中它们从导致行填充的单词开始,然后获取其余的 . 这减少了CPU等待实际请求的数据的周期数 . 如果你错过了写操作,一些缓存将“直写”并且不会分配一行,这样就可以在写入之前首先读取整个缓存行(这并不总是一个胜利) .

3)标签不会存储低5位,因为它们不需要匹配高速缓存行 . 他们只是索引到单独的行 .

维基百科有一个非常好的,如果有点激烈,写缓存:http://en.wikipedia.org/wiki/CPU_cache - 见"Implementation" . 有一个如何分割数据和标签的图表 . 我,我认为每个人都应该学习这些东西,因为当你知道底层机器实际上能够做什么时,你真的可以提高代码的性能 .

2 years ago

  • 缓存元数据通常不计入缓存本身的一部分 . 它甚至可能不存储在CPU的同一部分(它可能在另一个缓存中,使用特殊的CPU寄存器实现等) .

  • 这取决于您的CPU是否会获取未对齐的地址 . 如果它只获取对齐的地址,那么您提供的示例将是正确的 . 如果CPU获取未对齐的地址,则可能会将范围0xFFFF0008提取到0xFFFF0027 .

  • 索引字节仍然有用,即使对齐缓存访问也是如此 . 这为CPU提供了一种速记方法,用于引用缓存行中可以在其内部簿记中使用的字节 . 您可以通过了解与缓存行关联的地址以及与该字节关联的地址来获取相同的信息,但这是可以携带的更多信息 .

不同的CPU实现缓存的方式截然不同 . 要获得问题的最佳答案,请提供有关您正在讨论的特定CPU(类型,型号等)的一些其他详细信息 .

2 years ago

这是基于我模糊的记忆,你应该阅读Hennessey和Patterson的“计算机架构:定量方法”等书 . 好书 .

假设一个32位CPU ...(否则你的数字需要使用> 4个字节(可能<8个字节,因为某些/大多数64位CPU没有使用所有64位地址线)) .

1)我相信它至少有4 * 32字节 . 根据CPU的不同,芯片架构师可能已经决定跟踪除完整地址之外的其他信息 . 但它通常不被视为缓存的一部分 .

2)是的,但是如何完成映射是不同的 . 请参阅Wikipedia - CPU cache - associativity有简单的直接映射缓存和更复杂的关联映射缓存 . 您希望避免某些代码需要两条信息但两个地址映射到完全相同的缓存行的情况 .