如果长时间闲置,Cache 会自行清空吗?

gun*_*lls 4 cpu-architecture cpu-cache

如果在阈值时间内没有遇到任何指令,缓存是否会自行刷新?

我的意思是假设,我有一台多核机器,并且上面有隔离的内核。现在,对于其中一个核心,有几秒钟没有活动。在这种情况下,是否会在经过一定时间后刷新指令缓存中的最后一条指令?

我知道这可能取决于体系结构,但我正在寻找有关该概念的一般指示。

Had*_*ais 6

如果在特定空闲状态下对缓存进行电源门控,并且使用易失性存储器技术(例如 SRAM)实现,则缓存将丢失其内容。在这种情况下,为了维护架构状态,必须将所有脏行写入一些将保留其状态的内存结构(例如内存层次结构的下一级)。大多数处理器支持电源门控空闲状态。例如,在 Intel 处理器上,在核心 C6 和更深的状态下,核心是完全电源门控的,包括所有私有缓存。当内核从这些状态中的任何一个唤醒时,缓存将变冷。

在空闲状态下,为了省电,刷新缓存但不对其进行电源门控很有用。ACPI 规范在第 8.1.4 节(6.3 版)中定义了这样一种状态,称为 C3:

在 C3 状态下,处理器的缓存保持状态,但处理器不需要监听总线主控或多处理器 CPU 对内存的访问。

稍后在同一部分详细说明 C3 不需要保留缓存的状态,但也不需要刷新它。本质上,ACPI C3 中的核心不保证缓存一致性。在 ACPI C3 的实现中,要么需要系统软件在核心进入 C3 之前手动刷新缓存,要么硬件将采用某种机制来确保一致性(刷新不是唯一的方法)。由于不必参与缓存一致性,这种空闲状态与较浅的状态相比可以潜在地节省更多功率。

据我所知,唯一实现 ACPI C3 非电源门控版本的处理器是 Intel 的处理器,从 Pentium II 开始。所有现有的 Intel x86 处理器都可以根据它们实现 ACPI C3 的方式进行分类:

  • Intel Core 及更高版本和 Bonnell 及更高版本:硬件状态称为 C3。该实现使用了多种节能机制。与问题相关的一个刷新所有核心缓存(指令、数据、uop、分页单元),可能是通过在进入空闲状态时执行微代码例程。也就是说,所有脏行都被写回到内存层次结构的最近共享级别(L2 或 L3),并且所有有效的干净行都无效。这就是保持缓存一致性的方式。保留核心状态的其余部分。
  • Pentium II、Pentium III、Pentium 4 和 Pentium M:硬件状态在这些处理器中称为睡眠。在睡眠状态下,处理器完全时钟门控并且不响应窥探(除其他外)。片上缓存不会被刷新,硬件也没有提供一种替代机制来保护有效行不会变得不连贯。因此,系统软件负责确保缓存一致性。否则,英特尔规定,如果正在进入或退出睡眠状态或已经处于睡眠状态的处理器发生监听请求,则结果行为是不可预测的。
  • 所有其他人都不支持 ACPI C3。

请注意,时钟门控通过以下方式节省功耗:

  • 关闭本身消耗功率的时钟生成逻辑。
  • 关闭在每个时钟周期执行某些操作的任何逻辑。

使用时钟门控,动态功耗基本上降为零。但是仍然消耗静态功率来维持易失性存储器结构中的状态。

许多处理器包括至少一层在多个内核之间共享的片上缓存。处理器品牌 Core Solo 和 Core Duo(无论是基于 Enhanced Pentium M 还是 Core 微架构)引入了一个空闲状态,它在封装级别实现了 ACPI C3,其中共享缓存可能会逐渐断电和恢复(英特尔的封装级状态对应于 ACPI 规范中的系统级状态)。此硬件状态称为 PC7、增强型深度睡眠状态、深度 C4 或其他名称,具体取决于处理器。与私有缓存相比,共享缓存要大得多,因此完全刷新需要更多时间。这会降低 PC7 的有效性。因此,它是逐渐刷新的(进入 CC7 的包的最后一个内核执行此操作)。此外,当包退出PC7时,共享缓存也逐渐开启,可以降低下次进入PC7的成本。这是基本思想,但细节取决于处理器。在 PC7 中,封装的重要部分是电源门控的。