【问题标题】:What does the PCOMMIT instruction do?PCOMMIT 指令有什么作用?
【发布时间】:2017-01-26 16:22:30
【问题描述】:

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

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

它命名诸如持久内存范围、存储接受到内存、存储成为持久非易失性设备等概念em>1.

确切的上下文是什么?


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

【问题讨论】:

    标签: memory x86 non-volatile


    【解决方案1】:

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


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

    特别是英特尔设想,某些 DIMM 可能包含采用 3D XPoint 技术制成的部分,从而构成一个非易失性设备

    这将使一个或多个内存范围持久,这些持久范围的集合称为持久域
    持久域的主要特征之一是它具有断电安全的能力。

    当一个商店被创建时,它会经过:

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

    存储上方的数据路径的哪一点在持久域中,因此在断电的情况下不会丢失?
    一些内存控制器具有称为异步 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
    

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

    mov [X], rax
    clwb [X]
    sfence         
    
    ;Here the store is in the WPQ and that's enough
    

    【讨论】:

    • 确定商店总是放在WPQ中吗?查看硬件计数器,我观察到只有大约 6 个写入操作插入到 WPQ 中,但我不确定这是否有意义。
    • @AnaKhorguani AFAIK WPQ 是 (NV) 内存的唯一入口。但这并不意味着与存储之间存在 1-1 映射,因为存储可以合并到 SB 中,并将合并到缓存行中。我从来没有用计数器测试过它。您正在使用非核心计数器吗?具体是哪一个(我不记得它们了)?也许我可以安排一个测试
    • 关于合并,我正在写一个大小为 64 字节的对象,所以应该是整个缓存行,这就是为什么我认为它们不能合并更多。是的,我正在使用非核心计数器,例如 skx_unc_imc0::UNC_M_WPQ_INSERTS:cpu=0 这一个,正如我所读到的:计算写入挂起队列中的分配数。
    • 另外,每 6 次写入 WPQ 是在写入 DRAM 时,当我尝试在 NVM 中写入时计算此事件时,它没有得到任何东西,即使我应该将内存映射到正确的numa节点并检查正确的cpu,但这是另一个问题。首先,我试图了解为什么不是每家商店都去 WPQ
    • 关于测试,我并不想打扰那么多:) 已经感谢您提供有趣的问题/答案。我正在寻找有关 WPQ 的更多信息,但我发现的信息不多,所以这已经很有帮助了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多