【发布时间】:2021-12-31 01:24:29
【问题描述】:
多处理器系统内置了某种缓存一致性协议,例如MSI、MESI 等。缓存一致性很重要的唯一情况是当在两个不同处理器中执行的指令尝试写入/读取共享数据时。为了使共享数据实际上有效,程序员无论如何都必须引入内存屏障。如果没有内存屏障,那么无论底层处理器是否实现缓存一致性,共享数据都将是“错误的”。那么为什么需要硬件级别的缓存一致性机制呢?
【问题讨论】:
-
如果没有缓存一致性,内存排序障碍将不足以使数据在内核之间可见。同样,需要障碍也是不正确的。原子计数器可以用于
std::memory_order_relaxed的某些目的,即只是原子性,没有顺序。 其他操作。也许您误解了障碍的确切作用:Does a memory barrier ensure that the cache coherence has been completed?。 When to use volatile with multi threading? 还讨论了使手动 C 原子工作的一致性 -
不仅是共享数据,还有同一缓存行中的相邻数据。
-
我的意思是,当处理器仅在遇到内存障碍时运行缓存一致性时,保证如何削弱(或程序执行错误)?并且直到下一个内存屏障指令才运行缓存一致性协议。
-
重新尝试回答:缓存一致性始终保持不变,不会在写入后损坏和恢复。因此,即使在之前写入对其他内核可见,在具有 RFO(读取所有权)的 MESI 样式系统中,写入内核需要独占缓存线的所有权。这发生在存储 执行 并将数据放入(每核专用)存储缓冲区之后,但必须在存储可以从 SB 提交到 L1d 缓存之前完成。 Can a speculatively executed CPU branch contain opcodes that access RAM?
标签: multithreading caching cpu-architecture cpu-cache mesi