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

标签 x86 intel cpu-cache persistent-storage persistent-memory

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

最佳答案

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

有关 Optane DC PM DIMM 的进一步阅读:https://thememoryguy.com/whats-inside-an-optane-dimm/ - 它们包括一个磨损均衡重映射层,如 SSD。

还相关:When I test AEP memory, I found that flushing a cacheline repeatedly has a higher latency than flushing different cachelines. I want to know what caused this phenomenon. Is it wear leveling mechanism ?在英特尔论坛上。这表明重复写入同一缓存行可能比您预期的更糟糕。


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

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

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

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

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

关于x86 - 写入和读取的持久内存缓存策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59572320/

相关文章:

Swift 损坏的函数名称映射

c++ - 从 32 位进程调用 64 位 dll 上的 LoadLibrary

c# - 如何使用 C# 确定运行我的程序的计算机的芯片组

c++ - Visual Studio 调试器 - 可视化英特尔四倍精度 (_Quad)

x86 - x86机器上的不同CPU可以具有不同的本地APIC寄存器MMIO基址吗?

java - 分析 Java 应用程序的 CPU 缓存性能的工具?

assembly - aarch64 是否有不可缓存(=缓存旁路)加载或存储指令?

c++ - 编写程序获取 CPU 缓存大小和级别

assembly - 错误 a2070 指令操作数无效

assembly - MOV EAX, DWORD PTR DS :[ESI] mean and what does it do? 是什么意思