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



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

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

有关傲腾直流 PM DIMM 的更多信息:https://thememoryguy.com/whats-inside-an-optane-dimm/- 它们包括一个磨损均衡重映射层,如 SSD。

另外相关:当我测试 AEP 内存时,我发现重复刷新缓存行比刷新不同的缓存行具有更高的延迟。我想知道是什么导致了这种现象。是磨损均衡机制吗?在英特尔论坛上。 这表明对同一缓存行的重复写入可能比您预期的还要糟糕。


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

WT可能值得考虑作为clwb的替代方案(假设它实际上适用于NV内存),但您仍然必须小心存储的编译时重新排序。_mm_clwb大概是一个编译器内存屏障,可以防止此类问题。

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

例如,存储连续的int64_tdouble每 64 字节缓存行需要 8 个单独的存储,除非您(或编译器)进行矢量化。 使用 WT 而不是 WB +clwb,我猜这会慢大约 8 倍。这不是基于有关傲腾直流PM的任何实际性能细节;我没有看到内存延迟/带宽数字,也没有看过WT性能。 不过,我偶尔看到一些论文将合成工作负载与WT与常规DDR DRAM上真实英特尔硬件上的WB缓存进行比较。 我认为如果您的代码对同一缓存行的多次写入不是典型的,它是可用的。 (但通常情况下,这是您想要执行和优化的事情,因为WB缓存使其非常便宜。

如果您有 AVX512,则可以执行全行 64 字节存储,前提是确保它们对齐。 (无论如何,您通常希望获得 512 位矢量的性能)。

最新更新