【问题标题】:Flushing writes in buffer of Memory Controller to DDR device将内存控制器缓冲区中的写入刷新到 DDR 设备
【发布时间】:2014-05-30 20:48:06
【问题描述】:

在我的代码中的某个时刻,我需要将代码中的写入一直推送到 DIMM 或 DDR 设备。我的要求是确保写入到达 DIMM 上 DDR 设备的行、禁令、列。我需要阅读我写入主存储器的内容。我不想通过缓存来获得价值。相反,在写完之后,我想从主内存(DIMM)中获取这个值。

到目前为止,我一直在使用 Intel 的 x86 指令 wbinvd(回写并使缓存无效)。然而,这意味着缓存和 TLB 被刷新。回写请求进入主存储器。 但是,这些数据可能会在一段合理的时间内驻留在内存控制器(英特尔称其为集成内存控制器或 IMC)的写入缓冲区中。内存控制器 可能需要更多时间,具体取决于内存控制器中运行以处理写入的算法。

有没有办法将内存控制器的写入缓冲区中的所有现有或待处理的写入强制写入 DRAM 设备?

我正在寻找的是比 wbinvd 更直接、更底层的东西。如果您能指出描述这一点的正确文档或规范,我将不胜感激。

一般来说,IMC 有几个可以写入或读取的寄存器。通过查看芯片组的规格,我找不到任何有用的东西。

感谢您花时间阅读本文。

【问题讨论】:

  • 注意:您可能需要与您的雇主核实,以确保询问有关此硬件的问题不会违反您的 NDA。
  • clflush 给你的写作怎么样?
  • Rohit,您也可以在 MTRR 中将内存范围标记为不可缓存 (UC)。你确定内存控制器中的写缓冲区是限制你的吗?它控制的是普通的DDR/DIMM设备吗?您的处理器/IMC 的确切型号是什么?我认为,在仍然将数据写入内存的情况下,应该几乎没有改变 IMC 算法的能力。
  • @clflush : 在这种情况下缓存行刷新不会削减它
  • Rohit,还有一些来自 IMC 的计数器,可通过 BAR“(在 PCI 配置空间中)在总线 0;设备 0;功能 0;偏移量 048H。”:software.intel.com/en-us/articles/… - 你可以使用它们来测量从 CPU 写入到写入 DDR 组的延迟。

标签: c memory x86 hardware intel


【解决方案1】:

这就是英特尔将 CLWB 指令添加到集合中的原因。在编写此答案时,没有现成的可用硬件来实现该指令(AFAIK)。出于类似的原因,ARMv8.2-A 添加了“DC CVAP”(Clean data cache by virtual address to Point of Persistence)指令。

不过,没有架构方法可以刷新 IMC 中的事务。 NVDIMM 规范关心这个问题并提供特定于 NVDIMM 的机制来确保写入已到达设备。请参阅最近的 ACPI 规范中的 NVDIMM 固件接口表中对 Flush Hint 地址结构的描述。

【讨论】:

  • 谢谢!您能否添加一些 NVDIMM 特定命令的示例?还有一些关于 CLWB/PCOMMIT 命令添加的参考,例如danluu.com/clwb-pcommit“为什么英特尔添加了 CLWB 和 PCOMMIT 指令”...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多