【发布时间】: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