X86 要写入和读取的持久内存缓存策略

X86 要写入和读取的持久内存缓存策略,x86,intel,cpu-cache,persistent-storage,persistent-memory,X86,Intel,Cpu Cache,Persistent Storage,Persistent Memory,是否有人知道尝试使用(DCPMM)应用程序内直接模式(即非易失性内存)使用直写(WT)或不可缓存(UC)内存策略对其进行写入或读取时存在任何缺陷?其想法是将常规内存用作非易失性内存(数据在发生故障时不会丢失),因为缓存线是易失性的,所以使用脏缓存线并不理想。有多个链接显示了使用回写(WB)或写组合(WC)与非时态访问(NTA)指令的示例,以及使用WB和CLFLUSHOPT或CLWB写指令的示例。与WB/WC相比,使用WT/UC时没有将整个缓存线写入内存,除了带宽之外,还有什么重要的缺点吗 (这主

是否有人知道尝试使用(DCPMM)应用程序内直接模式(即非易失性内存)使用直写(WT)或不可缓存(UC)内存策略对其进行写入或读取时存在任何缺陷?其想法是将常规内存用作非易失性内存(数据在发生故障时不会丢失),因为缓存线是易失性的,所以使用脏缓存线并不理想。有多个链接显示了使用回写(WB)或写组合(WC)与非时态访问(NTA)指令的示例,以及使用WB和CLFLUSHOPT或CLWB写指令的示例。与WB/WC相比,使用WT/UC时没有将整个缓存线写入内存,除了带宽之外,还有什么重要的缺点吗

(这主要是猜测,我没有使用Optane DC PM进行任何性能测试,只是偶尔阅读有关UC或WT for DRAM的文章。但我认为,关于它们的一般工作原理,已经有足够多的了解,可以说这对于许多工作负载来说可能是个坏主意。)

进一步阅读Optane DC PM DIMM:-它们包括一个磨损均衡重映射层,如SSD

同样相关:在英特尔论坛上。这表明重复写入同一缓存线可能比您预期的更糟。


UC还意味着强排序,我认为这会伤害OoO执行官。我认为UC也阻止你使用NT存储进行全行写入。它还会完全破坏读取性能,所以我认为不值得考虑

WT可能值得考虑作为
clwb
的替代品(假设它实际上可以与NV内存一起工作),但在编译时对存储进行重新排序时,您仍然需要小心<代码>\u mm\u clwb可能是一个编译器内存屏障,可以防止出现此类问题

不过,在存储区工作负载繁重的情况下,您可能会看到写入速度严重放缓。每核内存带宽在很大程度上受到未完成请求数量的限制。使每个请求变小(只有8个字节或其他东西,而不是一整行)并不会使其速度明显加快。绝大多数时间是通过内存层次结构获取请求,并等待地址行选择正确的位置,而不是通过内存总线进行实际的突发传输。(这是流水线式的,因此对于同一DRAM页面的多个完整行请求,内存控制器可以花费大部分时间传输数据,而不是等待。我认为Optane/3DXPoint不如DRAM快,因此可能会有更多的等待。)

因此,例如,存储连续的
int64\t
double
将在每个64字节缓存线中占用8个单独的存储,除非您(或编译器)进行矢量化。使用WT而不是WB+
clwb
,我猜速度会慢8倍左右。
这不是基于Optane DC PM的任何实际性能细节;我没有看到内存延迟/带宽的数字,也没有看到WT性能。不过,我偶尔会看到一些文章将合成工作负载与常规DDR DRAM上真正Intel硬件上的WT和WB缓存进行比较。我认为如果对同一缓存线的多次写入不是代码的典型情况,那么它是可用的。(但通常情况下,这是您想要做和优化的事情,因为WB缓存使其非常便宜。)


如果您有AVX512,则可以执行完整的64字节行存储,前提是确保它们对齐。(不管怎样,这通常是为了提高512位向量的性能)。

我似乎记得Optane认为MCE是向客户端提供状态信息的好方法。是的,如果您碰巧为一个单一用途的嵌入式系统编写机器代码,但除此之外,不精确的异常有点难以处理。在支持/模拟此功能的内核和虚拟机监控程序中,它们设置一个已知的良好状态(比喻为setjmp),执行一系列事务,采取措施确保提交所有事务;另外,MCE上的longjmp。谢谢@Peter Cordes,AVX512指令听起来是测试性能的好方法,不必像WB那样浪费将缓存线刷新到内存的周期。可能是测量带宽和延迟的好例子(不使用英特尔PMU计数器时)。@PeterCordes Yep。“所有DCPMM磨损均衡都在DCPMM内部,由DCPMM控制器控制。从主机上看不到任何与磨损级别相关的内容。”(另请参阅:@PeterCordes DIMM(据我收集)大大降低了读取开销(写入更面向吞吐量)。DIMM接口也倾向于提供更高的带宽(我怀疑)和更低的延迟。@PaulA.Clayton:感谢此答案中包含的链接。尤其是重复写入同一行比分散写入更糟糕的事实,使得WT对于某些工作负载可能是一个不好的选择。