caching - 为什么需要单独的 icache 和 dcache

标签 caching x86 cpu-architecture cpu-cache

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

最佳答案

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

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

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

写入 iCache 的情况很少见。 CPU 设计人员基于代码更改很少的假设来优化 iCache 和 CPU 架构。例如,AMD Software Optimization Guide for 10h and 12h Processors指出:

Predecoding begins as the L1 instruction cache is filled. Predecode information is generated and stored alongside the instruction cache.

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 设计(通常)比以前的设计更复杂。)

关于caching - 为什么需要单独的 icache 和 dcache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8707041/

相关文章:

php - 缓存远程访问的网站

java - 是否可以仅通过在java客户端中提供缓存配置来启动ignite缓存?

android - 将 Qt QML 应用程序部署到 Android 时出现黑屏

arrays - 计算汇编中数组元素的数量

laravel - Redis 连接拒绝 [tcp ://127. 0.0.1:6379]

java - Android HttpUrlConnection 不支持摘要身份验证?

c - 使用内联 asm 在 C 中强制消除尾调用

cpu-architecture - perf stat 统计单位

x86 - 为什么 x86 中存在 CLFLUSH?

assembly - 内存屏障是CPU执行的指令,还是只是一个标记?