PCOMMIT指令是用来做什么的?

9
在Intel ISA扩展手册中,pcommit的描述有些晦涩:

PCOMMIT指令会导致对持久内存范围的某些存储到内存操作变得持久(受电源故障保护)。具体来说,PCOMMIT适用于那些已经被接受到内存的存储。
[...]
如果在将存储到持久性内存范围的存储器接受到内存后执行PCOMMIT,则当PCOMMIT变为全局可见时,存储器变为持久性。
[...]
只有在数据被写入目标非易失性设备或一些中间的受电源故障保护的存储器/缓冲区之后,存储到持久性内存的数据才会变得持久性(耐用)。

它提到了像持久内存范围接受到内存变成持久性非易失性设备等概念1

这是什么背景下的呢?


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

1个回答

12
首先,pcommit在实际CPU上发布之前就已经被弃用
本回答的大部分内容基于上面链接中的内容。
Intel与Micron合作开发了一种新形式的非易失性存储器(NVM),称为3D XPoint(根据其内部结构)。
作为磁盘缓存的实际实现已经可用,Intel开始准备更广泛地采用其NVM技术。特别是,Intel想象一些DIMM可能包含由3D XPoint技术制成的一部分,从而构成一个非易失设备。这将使一个或多个内存范围持久存在,这些持久范围的集合称为持久域。
持久域的主要特点之一是其具有断电安全能力。
当进行存储时,它经历以下过程:
  • 存储缓冲区
    本地完成/可见的存储,但在全局范围内不可见。
    可以使用不同的指令(例如sfence)刷新存储缓冲区。
  • 高速缓存层次结构
    存储在全局范围内可见(高速缓存一致性协议确保此点)。
    可以使用不同的指令(例如clflushclflushoptclwb等)刷新高速缓存。
  • 内存控制器写挂起队列(WPQ)
    存储被接受到内存,但尚未写入DIMM中。
    可以通过内存控制器的特定PCIe配置寄存器或pcommit刷新WPQ。
  • 内存
    存储已提交/写入内存中。
在上述数据路径的哪个点上,存储处于持久域中,因此在断电情况下不会丢失?
一些内存控制器具有称为异步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,因此Intel已经弃用了pcommit,转而采用更简单的编程模型。
mov [X], rax
clwb [X]
sfence         

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

存储器是否总是放在WPQ中?通过查看硬件计数器,我观察到只有约六分之一的写操作被插入到WPQ中,但我不确定这是否有意义。 - Ana Khorguani
关于合并,我正在编写一个大小为64字节的对象,因此应该是整个缓存行,这就是为什么我认为它们不能再合并了。是的,我正在使用uncore计数器,例如skx_unc_imc0 :: UNC_M_WPQ_INSERTS:cpu = 0,根据我的阅读:计算将分配插入到待写队列中的次数。 - Ana Khorguani
此外,每6次写入WPQ时都是在写入DRAM时发生的,当我尝试在NVM中写入时计算此事件时,它并没有给我任何结果,尽管我应该将内存映射到正确的NUMA节点并检查正确的CPU,但这是另一个问题。首先,我试图理解为什么不是每个存储都进入WPQ。 - Ana Khorguani
关于测试,我并不是想太过打扰 :) 非常感谢您提出这个有趣的问题/答案。我正在寻找更多关于 WPQs 的信息,但是我没有找到太多,所以这已经很有帮助了。 - Ana Khorguani
@AnaKhorguani 这是一个非常有趣的主题,我想写一些相关的代码。不幸的是,我手头没有太多时间,所以我不确定我能否编写任何代码。Google专利是一个很有用的信息来源,你试过了吗?我找到了这个似乎与此相关,但我还没有阅读它。 - Margaret Bloom
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接