Caching 为什么需要单独的icache和dcache

Caching 为什么需要单独的icache和dcache,caching,x86,cpu-architecture,cpu-cache,Caching,X86,Cpu Architecture,Cpu Cache,有人能解释一下,使用单独的指令缓存和数据缓存会带来什么好处吗。 任何指向解释这一点的好链接的指针都将受到赞赏。这与CPU的哪些功能单元主要访问该缓存有关。由于ALU和FPU访问数据缓存,而解码器和调度器访问指令缓存,并且管道通常允许指令处理器和执行单元同时工作,因此使用单个缓存将导致这两个组件之间的争用。通过将它们分开,我们失去了一些灵活性,并获得了处理器的这两个主要组件同时从缓存中获取数据的能力。一个原因是降低了复杂性-您可以实现一个共享缓存,可以一次检索多行数据,也可以异步检索多行数据(请参

有人能解释一下,使用单独的指令缓存和数据缓存会带来什么好处吗。
任何指向解释这一点的好链接的指针都将受到赞赏。

这与CPU的哪些功能单元主要访问该缓存有关。由于ALU和FPU访问数据缓存,而解码器和调度器访问指令缓存,并且管道通常允许指令处理器和执行单元同时工作,因此使用单个缓存将导致这两个组件之间的争用。通过将它们分开,我们失去了一些灵活性,并获得了处理器的这两个主要组件同时从缓存中获取数据的能力。

一个原因是降低了复杂性-您可以实现一个共享缓存,可以一次检索多行数据,也可以异步检索多行数据(请参见“未命中”下的“命中”),但它使缓存控制器变得更加复杂

另一个原因是执行稳定性——如果您有已知数量的icache和dcache,则数据缓存不能使缓存系统的指令不足,这可能发生在过于简单的共享缓存中


正如Dan所说,将它们分开可以简化流水线,而不会增加控制器的复杂性。

主要原因是:性能。另一个原因是电力消耗

单独的dCache和iCache使并行获取指令和数据成为可能

指令和数据具有不同的访问模式

给伊卡什的信很少。CPU设计者正在基于代码更改很少的假设优化iCache和CPU体系结构。例如,缔约国指出:

预编码在一级指令缓存填满时开始。预编码信息与指令缓存一起生成和存储

Intel Nehalem CPU具有环回缓冲区,除此之外,Sandy Bridge CPU还具有µop缓存。请注意,这些特性与代码相关,与数据没有直接对应关系。它们有利于性能,而且由于英特尔“禁止”CPU设计人员引入导致功耗过度增加的功能,因此它们可能也有利于总功耗

大多数CPU具有数据转发网络(存储到加载转发)。代码没有“存储到加载的转发”,这仅仅是因为代码修改的频率比数据修改的频率要低得多

代码表现出与数据不同的模式

这就是说,现在大多数CPU都有统一的二级缓存,它同时保存代码和数据。原因是,拥有单独的L2I和L2D缓存将毫无意义地消耗晶体管预算,同时无法提供任何可测量的性能增益


(当然,单独使用iCache和dCache的原因并没有降低复杂性,因为如果原因是降低了复杂性,那么在当前的任何CPU设计中都不会有任何流水线。有流水线的CPU比没有流水线的CPU更复杂。我们希望增加复杂性。事实是:下一个CPU设计是(通常)比以前的设计更复杂。)

通常有两种体系结构1.冯·诺依曼体系结构和2.哈沃德体系结构。哈沃德体系结构使用两个独立的内存。您可以在这个arm页面上了解更多信息,因为处理器的MEM和FETCH阶段可以访问一级缓存(假设组合)同时,还可能存在优先权冲突(可能成为性能瓶颈)。解决这一问题的一种方法是使一级缓存具有两个读取端口。但端口数量的增加会以二次方式增加缓存面积,从而增加功耗

此外,如果一级缓存是组合缓存,则可能会有一些数据块替换包含重要指令且即将被访问的指令的块。这些逐出和随后的缓存未命中会损害整体性能


此外,大多数时间处理器都会按顺序获取指令(很少有例外情况,如获取目标、跳转等),这使指令缓存具有更大的空间局部性,因此具有良好的命中率。此外,如其他答案中所述,几乎没有任何对ICache的写入(自修改代码,如JIT编译器)。因此,可以根据访问模式和其他组件(如加载/存储队列、写入缓冲区等)优化单独的icache和dcache设计。

一个用于数据,一个用于指令:两者可能以不同的速率“搅动”,并且具有不同的访问模式。:“指令缓存和数据缓存可以通过哈佛CPU分离以获得更高的性能,但也可以结合使用以减少硬件开销。"因此它们并不总是不同的。有趣的是,JIT可以通过数据缓存写入指令来产生问题,或者在检索指令时它们不在内存/较低的共享缓存中,或者指令缓存可能有一条过时的指令。您必须手动处理同步。我的意思是缓存控制器的简单性。写入I-cache的情况并不罕见,在大多数CPU设计中,写入I-cache几乎是不可能的;它可以构建为只读的,不需要额外的标记空间来跟踪数据是否“脏”。ECC粒度可以任意大。(当然,数据必须在缓存未命中时通过逐出进入和离开,并从外部缓存中获取,因此它仍然需要一个“写端口”来实现这一点)存储转发是从存储缓冲区而不是L1d缓存中完成的。无论L1是拆分还是统一,它都可以工作。此外,“数据转发网络”通常是指绕过从执行单元到执行单元的转发(而不是等待写回+寄存器读取)。这个答案的顶部是正确的,不过:关键原因是读写端口:两个并行使用的较小缓存比一个具有读写总和的较大缓存便宜得多