27

有人可以解释一下我们通过拥有单独的指令缓存和数据缓存可以获得什么。任何指向解释这一点的良好链接的指针也将不胜感激。

4

5 回答 5

29

主要原因是:性能。另一个原因是功耗。

分离的 dCache 和 iCache 使得并行获取指令和数据成为可能。

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

很少写入 iCache。CPU 设计人员基于代码更改很少的假设优化 iCache 和 CPU 架构。例如,10h 和 12h 处理器的 AMD 软件优化指南指出:

预解码在 L1 指令高速缓存被填满时开始。预解码信息与指令缓存一起生成和存储。

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

大多数 CPU 都具有数据转发网络(存储到负载转发)。没有与代码相关的“存储加载转发”,仅仅是因为代码的修改频率远低于数据。

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

也就是说,现在大多数 CPU都有统一的 L2 缓存,可以同时保存代码和数据。这样做的原因是,拥有单独的 L2I 和 L2D 缓存会毫无意义地消耗晶体管预算,同时无法提供任何可衡量的性能提升。

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

于 2012-01-03T13:31:18.007 回答
6

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

于 2012-01-03T01:45:26.317 回答
2

一个原因是降低了复杂性——您可以实现一个共享缓存,它可以一次检索多行,或者只是异步检索(参见 Hit-Under-Miss),但这会使缓存控制器复杂得多。

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

正如 Dan 所说,将它们分开会使流水线更容易,而不会增加控制器的复杂性。

于 2012-01-03T01:52:41.490 回答
2

由于处理器的 MEM 和 FETCH 阶段可以同时访问 L1 缓存(假设合并),因此可能会出现优先级冲突(可能成为性能瓶颈)。解决此问题的一种方法是使 L1 缓存具有两个读取端口。但是增加端口的数量会二次增加缓存区域,因此会增加功耗。

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

此外,大多数情况下,处理器按顺序获取指令(很少有例外,如获取目标、跳转等),这为指令缓存提供了更多的空间局部性,从而提高了命中率。此外,正如其他答案中提到的,几乎没有任何写入 ICache(自修改代码,如 JIT 编译器)。因此,单独的 icache 和 dcache 设计可以根据它们的访问模式和其他组件(如加载/存储队列、写入缓冲区等)进行优化。

于 2017-02-13T07:02:24.250 回答
-1

一般有2种架构1.冯诺依曼架构和2.哈沃德架构。硬件架构使用 2 个独立的存储器。您可以在此 arm 页面http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3839.html上获得更多信息

于 2014-02-28T11:24:25.870 回答