小智 23
主要原因是:表现.另一个原因是功耗.
单独的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设计(通常)比以前的设计更复杂.)
它与CPU的哪些功能单元主要访问该缓存有关.由于ALU和FPU访问解码器和调度器访问指令高速缓存的数据高速缓存,并且通常流水线操作允许指令处理器和执行单元同时工作,因此使用单个高速缓存将导致这两个组件之间的争用.通过分离它们,我们失去了一些灵活性,并使处理器的这两个主要组件能够同时从缓存中获取数据.