PCOMMIT 指令有什么作用?

What does the PCOMMIT instruction do?

在英特尔 ISA 扩展手册中,pcommit 的描述有点含糊:

The PCOMMIT instruction causes certain store-to-memory operations to persistent memory ranges to become persistent (power failure protected). Specifically, PCOMMIT applies to those stores that have been accepted to memory.
[...]
If PCOMMIT is executed after a store to a persistent memory range is accepted to memory, the store becomes persistent when the PCOMMIT becomes globally visible.
[...]
The data in a store to persistent memory becomes persistent (durable) only after it has either been written to the targeted non-volatile device, or to some intermediate power-fail protected storage/buffer.

它命名的概念如持久内存范围、存储被内存接受、存储成为持久 非易失性设备 1.

确切的上下文是什么?


1 这不能是经典的 NV 设备,如 NOR 闪存 ROM 或 NVMe 设备(读取:新的 SSD),因为它们位于可变数量的桥接器后面,包括减法解码那些,CPU 无法控制。

首先pcommithas been deprecated before even shipping to an actual CPU.
这个答案大部分是基于上面link的内容。


Intel 与 Micron 合作开发了一种新形式的 Non-volatile memory (NVM) called 3D XPoint(来自其内部结构)。
作为磁盘缓存的 actual implementation 已经可用,英特尔不久前就开始准备更广泛地采用其 NVM 技术。

特别是英特尔设想,某些 DIMM 可以包含使用 3D XPoint 技术制成的部分,从而构成 non-volatile 设备

这将使一个或多个内存范围持久,这些持久范围的集合称为持久域
持久域的主要特征之一是它能够 power-fail 安全。

商店建成后会经过:

  • 存储缓冲区.
    该商店在 completed/visible 本地,但不在全球范围内。
    可以使用不同的指令刷新存储缓冲区(例如 sfence)。
  • 缓存层次.
    商店是全局可见的(缓存一致性协议确保这一点)。
    可以使用不同的指令刷新缓存(例如 clflushclflushoptclwb 等)。
  • 内存控制器写入挂起队列 (WPQ)
    存储已接受内存,但尚未写入 DIMM。
    WPQ 可以通过内存控制器的特定 PCIe 配置寄存器或 pcommit.
  • 刷新
  • 记忆.
    商店在内存中committed/written。

store 上面的数据路径在哪个点处在持久域中,因此在断电的情况下不会丢失?
某些内存控制器具有称为异步 DRAM 刷新的功能,可确保即使在 power-loss 的情况下也能正确刷新 WPQ(例如,多亏了电池)。
对于这些平台,持久域从 WPQ 开始。

然而,英特尔担心并非所有平台都具有 ADR 功能并创建了 pcommit 指令作为确保存储进入持久域的一种方式(pcommit 是可执行的在用户模式下)。

这就是商店的持久化方式

mov [X], rax     ;Store

;Here the store has started moving to the store buffer

clwb [X]

;Here the store has moved to the cache (CLWB is ordered with previous stores) 
;and then starting moving to the memory controller WPQ 
;(the line containing X has been written back)

sfence           ;Wait for CLWB to become globally visible

;Here the store is in the WPQ

pcommit         

;The store is being committed

sfence          ;Wait for pcommit to become globally visible

;The store is committed

事实证明,每个计划支持新的英特尔 NVM 技术的平台也计划支持 ADR,因此英特尔弃用 pcommit 支持更简单的编程模型:

mov [X], rax
clwb [X]
sfence         

;Here the store is in the WPQ and that's enough