在英特尔ISA扩展手册中,pcommit
的描述有点晦涩:
它命名了一些概念,例如持久性内存范围,被存储器接受的存储,成为持久性和非 volatile 设备的存储1。
确切的背景是什么?
1这不能是经典的NV设备,例如NOR Flash ROM或NVMe设备(读取:新的SSD),因为它们位于可变数量的网桥(包括减法解码桥)后面,而CPU无法控制这些网桥。
最佳答案
首先pcommit
has been deprecated before even shipping to an actual CPU。
这个答案大部分是基于上面链接的内容。
英特尔与美光一起开发了一种新的Non-volatile memory (NVM)形式(称为3D XPoint)(从其内部结构开始)。
作为磁盘缓存的actual implementation已经面世了,不久前英特尔开始为更广泛地采用其NVM技术做准备。
尤其是Intel认为某些DIMM可能包含使用3D XPoint技术制成的一部分,因此构成了非 volatile 设备。
这将使一个或多个内存范围具有持久性,这些持久性范围的集合称为持久性域。
持久域的主要特征之一是它具有断电安全功能。
制作商店时,它会经历:
商店在本地已完成/可见,但不在全局范围内可见。
可以使用不同的指令(例如
sfence
)清除存储缓冲区。 该存储是全局可见的(缓存一致性协议(protocol)确保了这一点)。
可以使用不同的指令(例如
clflush
,clflushopt
,clwb
等)刷新缓存。 存储已接受到内存,但尚未写入DIMM。
可以通过内存 Controller 的特定PCIe配置寄存器或
pcommit
刷新WPQ。 存储已提交/写入存储器。
存储上方的数据路径的哪个点位于持久域中,因此在电源故障的情况下不会丢失?
某些内存 Controller 具有称为“异步DRAM刷新”的功能,该功能可确保即使在掉电的情况下,也可以正确冲洗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
事实证明,每个计划支持新的Intel NVM技术的平台也都计划支持ADR,因此,英特尔不赞成使用
pcommit
,而希望使用更简单的编程模型:mov [X], rax
clwb [X]
sfence
;Here the store is in the WPQ and that's enough
关于memory - PCOMMIT指令有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41878147/