为什么会有单独的L1缓存用于数据和指令?


Answers:


28

实际上有几个原因。

首先也是最重要的一点是,指令高速缓存中存储的数据通常与数据高速缓存中存储的数据有所不同-连同指令本身一样,还有下一条指令从何处开始的注释,以帮助解码器。某些处理器(例如Netburst,某些SPARC)使用“跟踪缓存”,该缓存存储对指令进行解码的结果,而不是以其编码形式存储原始指令。

其次,它稍微简化了电路-数据缓存必须处理读写操作,而指令缓存仅处理读取操作。(这就是为什么自修改代码如此昂贵的原因-写入不直接覆盖指令高速缓存中的数据,而是通过数据高速缓存到达L2高速缓存,然后指令高速缓存中的行无效并重新-从L2加载)。

第三,它增加了带宽:大多数现代处理器可以同时从指令高速缓存和数据高速缓存中读取数据。大多数服务器还在缓存的“入口”处有队列,因此它们实际上可以在任何给定周期中进行两次读取和一次写入。

第四,可以省电。当您需要维持存储单元本身的电源以维护其内容时,某些处理器可以在不使用时关闭某些关联电路(解码器等)的电源。借助单独的缓存,它们可以分别为这些电路供电以获取指令和数据,从而增加了电路在任何给定周期内保持断电的可能性(我不确定任何x86处理器都可以这样做-AFAIK,更多的是ARM事情)。


3
同样重要的是,代码和数据可能表现出不同的访问模式。例如,用于求和数组中所有元素的指令具有时间局部性(经常使用相同的指令(如果您通过循环来执行)),而数组中的数据具有空间局部性(接下来将使用以下数据)。
gablin 2011年

1
@gablin:的确如此,这些模式上的差异通常倾向于统一缓存。在您提到的紧密循环中,大多数指令高速缓存都处于空闲状态。在循环期间,统一缓存基本上会使数据缓存的大小增加一倍。
杰里·科芬

并非如此,因为在这个小循环之后还有更多的代码,并且可能与数组一起工作。这代表了很多代码(例如,字符串处理)。实际上,CPU中的第一个缓存是统一缓存–它们位于CPU的主内存接口和外部总线之间,这是放置它们的简单位置–但是我们现在使用分区缓存,因为它在实践中速度更快
多纳研究员

@Donal研究员:是的,真的。我很清楚早期缓存是如何完成的,为什么它们会更改为拆分缓存。
杰里·科芬

5

就像不动产一样,缓存的使用受三个因素驱动:位置,位置,位置。拥有缓存的全部目的是,大多数程序表现出位置模式:如果它们访问字节1111111,则它们将要访问的下一个字节可能是1111110或1111112,而不是太多的字节99999999。但是,大多数程序将表现出很大的不同。他们的指令和数据的位置模式。这意味着指令和数据不可能有效地共享高速缓存。因为指令和数据在内存中不一定彼此靠近。数据访问会碰撞来自缓存的指令,而加载指令会碰撞来自缓存的数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.