Cache 闲置时间长了会不会自己清空?
Does Cache empty itself if idle for a long time?
如果在阈值时间内没有遇到任何指令,高速缓存是否会自行刷新?
我的意思是假设我有一台多核机器并且上面有独立的核心。现在,对于其中一个核心,有几秒钟没有 activity。在这种情况下,指令缓存中的最后一条指令是否会在经过一定时间后被刷新?
我知道这可能取决于体系结构,但我正在寻找有关该概念的一般指示。
这取决于您所说的 "idle" 是什么意思 - 具体来说 "idle" 是否涉及缓存是否被供电。
缓存通常由包含 SRAM 个单元的寄存器组成,只要单元通电,它们就会保存存储在其中的数据(与需要定期刷新的 DRAM 不同)。 Peter 在他的评论中提到了这一点:如果电源被切断,即使是 SRAM 单元也无法保持其状态并且数据会丢失。
如果缓存在特定空闲状态下是电源门控的,并且如果它是使用易失性内存技术(例如 SRAM)实现的,则缓存将丢失其内容。在这种情况下,为了维护体系结构状态,所有脏行都必须写入某些将保留其状态的内存结构(例如内存层次结构的下一级)。大多数处理器支持电源门控空闲状态。例如,在 Intel 处理器上,在核心 C6 和更深的状态下,核心是完全电源门控的,包括所有私有缓存。当核心从这些状态中的任何一个唤醒时,缓存将变冷。
它在空闲状态下很有用,为了省电,刷新缓存但不对其进行电源门控。 ACPI 规范在第 8.1.4 节(版本 6.3)中定义了这样一个状态,称为 C3:
While in the C3 state, the processor’s caches maintain state but the
processor is not required to snoop bus master or multiprocessor CPU
accesses to memory.
稍后在同一部分详细说明 C3 不需要保留缓存的状态,但也不需要刷新它。本质上,ACPI C3 中的核心并不能保证缓存一致性。在 ACPI C3 的实现中,要么系统软件需要在核心进入 C3 之前手动刷新缓存,要么硬件将采用某种机制来确保一致性(刷新不是唯一的方法)。与较浅的状态相比,由于不必参与缓存一致性,这种空闲状态可能会节省更多电量。
据我所知,唯一实现 ACPI C3 非电源门控版本的处理器是 Intel 的处理器,从 Pentium II 开始。所有现有的英特尔 x86 处理器都可以根据它们如何实现 ACPI C3 进行分类:
- Intel Core 及更高版本和 Bonnell 及更高版本:硬件状态称为 C3。该实现使用多种功率降低机制。与问题相关的一个刷新所有核心缓存(指令、数据、uop、分页单元),可能是通过在进入空闲状态时执行微代码例程。也就是说,所有脏行都被写回内存层次结构中最接近的共享级别(L2 或 L3),并且所有有效的干净行都无效。这就是保持高速缓存一致性的方式。保留核心状态的其余部分。
- Pentium II、Pentium III、Pentium 4 和 Pentium M:在这些处理器中,硬件状态称为睡眠。在睡眠状态下,处理器是完全时钟门控的并且不响应侦听(除其他外)。片上缓存不会被刷新,硬件也不会提供替代机制来防止有效行变得不连贯。因此,系统软件负责确保缓存的一致性。否则,Intel 指定如果处理器正在进入或退出睡眠状态或已经处于睡眠状态时发生窥探请求,则所产生的行为是不可预测的。
- 所有其他不支持 ACPI C3。
请注意,时钟门控通过以下方式节省电量:
- 关闭时钟生成逻辑,它本身会耗电。
- 关闭在每个时钟周期执行某些操作的任何逻辑。
有了时钟门控,动态功耗基本上降低到零。但是仍然消耗静态功率来维持易失性存储器结构中的状态。
许多处理器至少包含一级片上高速缓存,可在多个内核之间共享。 Core Solo 和 Core Duo 处理器(无论是基于 Enhanced Pentium M 还是 Core 微架构)引入了一种空闲状态,在封装级别实现 ACPI C3,共享缓存可能会逐渐断电和恢复(英特尔的封装级别状态对应于 ACPI 规范中的系统级状态)。这种硬件状态称为 PC7、增强型深度睡眠状态、深度 C4 或其他名称,具体取决于处理器。共享缓存比私有缓存大得多,因此完全刷新需要更多时间。这会降低 PC7 的有效性。因此,它是逐渐刷新的(进入CC7的包的最后一个核心执行此操作)。另外,当包退出PC7时,共享缓存也会逐渐开启,这样可以降低下次进入PC7的成本。这是基本思路,但细节取决于处理器。在 PC7 中,封装的重要部分是电源门控的。
如果在阈值时间内没有遇到任何指令,高速缓存是否会自行刷新?
我的意思是假设我有一台多核机器并且上面有独立的核心。现在,对于其中一个核心,有几秒钟没有 activity。在这种情况下,指令缓存中的最后一条指令是否会在经过一定时间后被刷新?
我知道这可能取决于体系结构,但我正在寻找有关该概念的一般指示。
这取决于您所说的 "idle" 是什么意思 - 具体来说 "idle" 是否涉及缓存是否被供电。
缓存通常由包含 SRAM 个单元的寄存器组成,只要单元通电,它们就会保存存储在其中的数据(与需要定期刷新的 DRAM 不同)。 Peter 在他的评论中提到了这一点:如果电源被切断,即使是 SRAM 单元也无法保持其状态并且数据会丢失。
如果缓存在特定空闲状态下是电源门控的,并且如果它是使用易失性内存技术(例如 SRAM)实现的,则缓存将丢失其内容。在这种情况下,为了维护体系结构状态,所有脏行都必须写入某些将保留其状态的内存结构(例如内存层次结构的下一级)。大多数处理器支持电源门控空闲状态。例如,在 Intel 处理器上,在核心 C6 和更深的状态下,核心是完全电源门控的,包括所有私有缓存。当核心从这些状态中的任何一个唤醒时,缓存将变冷。
它在空闲状态下很有用,为了省电,刷新缓存但不对其进行电源门控。 ACPI 规范在第 8.1.4 节(版本 6.3)中定义了这样一个状态,称为 C3:
While in the C3 state, the processor’s caches maintain state but the processor is not required to snoop bus master or multiprocessor CPU accesses to memory.
稍后在同一部分详细说明 C3 不需要保留缓存的状态,但也不需要刷新它。本质上,ACPI C3 中的核心并不能保证缓存一致性。在 ACPI C3 的实现中,要么系统软件需要在核心进入 C3 之前手动刷新缓存,要么硬件将采用某种机制来确保一致性(刷新不是唯一的方法)。与较浅的状态相比,由于不必参与缓存一致性,这种空闲状态可能会节省更多电量。
据我所知,唯一实现 ACPI C3 非电源门控版本的处理器是 Intel 的处理器,从 Pentium II 开始。所有现有的英特尔 x86 处理器都可以根据它们如何实现 ACPI C3 进行分类:
- Intel Core 及更高版本和 Bonnell 及更高版本:硬件状态称为 C3。该实现使用多种功率降低机制。与问题相关的一个刷新所有核心缓存(指令、数据、uop、分页单元),可能是通过在进入空闲状态时执行微代码例程。也就是说,所有脏行都被写回内存层次结构中最接近的共享级别(L2 或 L3),并且所有有效的干净行都无效。这就是保持高速缓存一致性的方式。保留核心状态的其余部分。
- Pentium II、Pentium III、Pentium 4 和 Pentium M:在这些处理器中,硬件状态称为睡眠。在睡眠状态下,处理器是完全时钟门控的并且不响应侦听(除其他外)。片上缓存不会被刷新,硬件也不会提供替代机制来防止有效行变得不连贯。因此,系统软件负责确保缓存的一致性。否则,Intel 指定如果处理器正在进入或退出睡眠状态或已经处于睡眠状态时发生窥探请求,则所产生的行为是不可预测的。
- 所有其他不支持 ACPI C3。
请注意,时钟门控通过以下方式节省电量:
- 关闭时钟生成逻辑,它本身会耗电。
- 关闭在每个时钟周期执行某些操作的任何逻辑。
有了时钟门控,动态功耗基本上降低到零。但是仍然消耗静态功率来维持易失性存储器结构中的状态。
许多处理器至少包含一级片上高速缓存,可在多个内核之间共享。 Core Solo 和 Core Duo 处理器(无论是基于 Enhanced Pentium M 还是 Core 微架构)引入了一种空闲状态,在封装级别实现 ACPI C3,共享缓存可能会逐渐断电和恢复(英特尔的封装级别状态对应于 ACPI 规范中的系统级状态)。这种硬件状态称为 PC7、增强型深度睡眠状态、深度 C4 或其他名称,具体取决于处理器。共享缓存比私有缓存大得多,因此完全刷新需要更多时间。这会降低 PC7 的有效性。因此,它是逐渐刷新的(进入CC7的包的最后一个核心执行此操作)。另外,当包退出PC7时,共享缓存也会逐渐开启,这样可以降低下次进入PC7的成本。这是基本思路,但细节取决于处理器。在 PC7 中,封装的重要部分是电源门控的。