【问题标题】:If we marked memory as WC(Write Combined), then do we have any consistency automatically?如果我们将内存标记为 WC(Write Combined),那么我们会自动保持一致性吗?
【发布时间】:2024-11-10 16:10:01
【问题描述】:

正如我们在 x86 架构上所知道的那样,自动提供的获取-发布一致性 - 即所有操作自动排序,没有任何栅栏,不包括第一次存储和下一次加载操作。 (正如第 34 页 Herb Sutter 所说:https://onedrive.live.com/view.aspx?resid=4E86B0CF20EF15AD!24884&app=WordPdf&authkey=!AMtj_EflYn2507c

如果我们把 MFENCE(LFENCE+SFENCE) 放在它们之间,那么 store 就不能重新排序,load 也不能重新排序 - 即 我们提供了顺序一致性 .

但是如果我们将内存标记为WC(Write Combined),那么我们是否有任何没有任何栅栏的自动一致性,可能是acquire-release?

或者如果我们对 WC-memory 使用 SSE 指令,那么我们没有任何一致性,如果我们对 WC-memory 使用简单的 MOV 指令,那么我们有获取-发布一致性,不是吗?

【问题讨论】:

    标签: multithreading concurrency x86 x86-64 memory-fences


    【解决方案1】:

    如此处所述:How MTRR registers implemented?

    存储到 WC 内存:WC 内存类型非常适合具有以下特性的内存区域(例如,视频帧缓冲区): 1.处理器没有从WC内存缓存。 2. 允许从 WC 内存中推测性地执行加载。 3. 对 WC 内存的存储存放在处理器的写入组合缓冲区 (WCB) 中。 4. 每个 WCB 可容纳 1 行(64 字节数据)。 5. 当对一行 WC 内存空间执行存储时,字节在 WCB 中累积,用于记录对该行内存空间的写入。 6. 对 WCB 中某个位置的后续存储可以覆盖由先前存储在该位置存储到该位置的字节。换句话说,对同一位置的多次写入将被折叠,以便该位置反映写入该位置的最后一个数据字节。 7. 当 WCB 最终通过 FSB 转储到外部存储器时,数据不一定以与执​​行早期程序存储的顺序相同的顺序写入内存。被写入的设备必须容忍这种类型的行为(即,它必须正常运行)。有关详细信息,请参阅第 1080 页的“WCB FSB 事务”。

    我相信 WC 内存不存在“自动一致性”,因为最终写入内存“不一定以与执​​行早期程序存储相同的顺序写入内存”。

    【讨论】:

    • 谢谢。关于您的报价“当WCBs最终转储到外部存储器通过FSB,数据不一定以相同的顺序写入内存执行了早期的程序化商店。”从第 1080 页“WCB FSB 事务”开始 - 对于 DDR-link 和 PCI-Express 上的任何 WCB-sotres 是否如此,还是仅适用于 FSB?
    【解决方案2】:

    这是一个坏主意,WC 内存读取速度非常慢(慢 20 倍)并且需要使用特殊的 SSE/AVX2 指令来加快速度。使用 MFENCE 明显更快。

    也不保证一致性。

    【讨论】:

    • 我只将 WC-memory 用于内存映射区域 (PCIe-BAR),这是绝对必要的。 IE。我没有疑问:我是否必须使用 WC。但我有一个问题:我们是否通过使用 MOV 和使用 SSE/AVX 在 WC 内存上自动保持一致性?
    最近更新 更多