有人可以通过单独的指令缓存和数据缓存来解释我们获得了什么。 任何指向解释这个的好链接的指针也将受到赞赏。
答案 0 :(得分:21)
主要原因是:表现。另一个原因是功耗。
单独的dCache和iCache可以并行获取指令和数据。
说明和数据具有不同的访问模式。
写入iCache很少见。 CPU设计人员正在基于代码更改很少的假设来优化iCache和CPU架构。例如,AMD Software Optimization Guide for 10h and 12h Processors表示:
预填充在L1指令缓存填满时开始。生成预编码信息并将其与指令缓存一起存储。
Intel Nehalem CPU具有环回缓冲区,除此之外,Sandy Bridge CPU还具有μop缓存The microarchitecture of Intel, AMD and VIA CPUs。请注意,这些是与代码相关的功能,并且与数据无直接对应关系。它们有利于性能,并且由于英特尔“禁止”CPU设计人员引入导致功耗过度增加的功能,因此它们可能也有利于总功耗。
大多数CPU都具有数据转发网络(存储到加载转发)。与代码相关的“存储加载转发”没有,因为代码的修改频率远低于数据。
代码表现出与数据不同的模式。
也就是说,现在大多数CPU 具有统一的L2缓存,它同时包含代码和数据。这样做的原因是,单独使用L2I和L2D缓存会毫无意义地消耗晶体管预算,同时无法提供任何可衡量的性能提升。
(当然,分离iCache和dCache 的原因并不是降低了复杂性,因为如果原因是复杂性降低,那么任何当前的CPU设计都不会有任何流水线操作。使用流水线操作的CPU比没有流水线操作的CPU更复杂。我们希望增加复杂性。事实是:下一个CPU设计(通常)比以前的设计更复杂。)
答案 1 :(得分:5)
它与CPU的哪些功能单元主要访问该缓存有关。由于ALU和FPU访问解码器和调度器访问指令高速缓存的数据高速缓存,并且通常流水线操作允许指令处理器和执行单元同时工作,因此使用单个高速缓存将导致这两个组件之间的争用。通过分离它们,我们失去了一些灵活性,并使处理器的这两个主要组件能够同时从缓存中获取数据。
答案 2 :(得分:2)
一个原因是降低了复杂性 - 您可以实现一次可以检索多行的共享缓存,或者只是异步检索(请参阅Hit-Under-Miss),但这会使缓存控制器变得更加复杂。
另一个原因是执行稳定性 - 如果你有一定数量的icache和dcache,数据缓存不会使缓存系统的指令饿死,这可能发生在简单的共享缓存中。
正如Dan所说,将它们分开使得流水线更容易,而不会增加控制器的复杂性。
答案 3 :(得分:1)
由于处理器的MEM和FETCH阶段可以同时访问L1缓存(假设组合),因此可能存在冲突,即哪个优先(可能成为性能瓶颈)。解决此问题的一种方法是使L1缓存具有两个读端口。但是增加端口数量会增加缓存区域的二次方,从而增加功耗。
此外,如果L1缓存是组合缓存,则有可能某些数据块可能会替换包含重要且即将被访问的指令的块。这些驱逐和跟随缓存未命中可能会损害整体性能。
此外,大多数时候处理器顺序取指令(少数例外情况,如采取目标,跳转等),这使指令缓存更多的空间局部性,从而获得良好的命中率。另外,正如其他答案中所提到的,几乎没有任何写入ICache(自修改代码,如JIT编译器)。因此,考虑到访问模式和其他组件(如加载/存储队列,写入缓冲区等),可以优化单独的icache和dcache设计。
答案 4 :(得分:0)
一般有2种架构1.von neuman架构和2. harward架构。 harward架构使用2个独立的存储器。您可以在此页面http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3839.html
上获得更多相关信息