内存屏障和缓存刷新

12

是否有任何架构即使进行缓存刷新也实现了内存屏障?我阅读过内存屏障仅影响CPU重新排序的说法,但我读到了与内存屏障相关的陈述:确保所有CPU都会看到该值...,但对我来说,这意味着进行缓存刷新/失效。

2个回答

7
在几乎所有现代架构上,缓存(如L1和L2缓存)都由硬件确保一致性。没有必要清除任何缓存以使内存对其他CPU可见。
可以想象理论上存在一种不具备硬件缓存一致性的系统,但它看起来与运行Windows和Linux等操作系统的当前系统完全不同。
在这些架构上需要使用内存屏障来完成三件事:
1. CPU可能会预取一个被另一个核心写入无效的读取。这必须被防止。(虽然在x86上,这是通过硬件来实现的。预取被锁定到L1缓存线,因此如果另一个CPU使缓存线无效,则预取也会被使无效);
2. CPU可能会“发布”写入而尚未将其放入其L1缓存中。这些写入必须至少完成到L1缓存;
3. CPU可能会在内存屏障的一侧重新排序读取和写入,并与另一侧的读取和写入进行重新排序。根据内存屏障的类型,必须禁止其中的一些重新排序。(例如,read x; read y;不能保证读取按照这个顺序发生,但read x; memory_barrier(); read y;通常会这样做。)

3
我并不是指我必须显式地使缓存无效,而是在某些架构上的硬件内存屏障意味着即使缓存已失效。我现在从这里http://www.linuxjournal.com/article/8212 读到,对于 ALPHA(一种非常古老的架构),smp_wmb() 意味着隐式进行缓存失效。 - Mark
我猜您错过了存储缓冲区和失效队列的概念,这会削弱缓存一致性保证。 - Yarl
1
@Ucho,楼主已经明白了。“我读到内存屏障只影响CPU重排序”。存储缓冲区和失效队列是CPU中的重排序机制,对缓存一致性保证没有影响。这些是CPU重新排序的方式,也是内存屏障所影响的内容。 - David Schwartz
@DavidSchwartz 如果 OP 理解这些概念,就没有问题。在缓冲区或输入队列满足之前,缓存是不一致的,因此如果没有刷新,就不能依赖一致性。 - Yarl
@Ucho我不明白为什么。如果CPU重新排序读取或写入,清除缓存如何有帮助呢? - David Schwartz
如果线程(CPU)即将读取共享内存,并且此时更新其缓存,则无法获取尚未编写的值。因此它无法帮助。 - Yarl

6

内存屏障的确切影响取决于特定的架构。

CPU采用性能优化,可能会导致乱序执行。内存操作(加载和存储)的重新排序通常在单个执行线程内不会被注意到,但是在并发程序和设备驱动程序中会导致不可预测的行为,除非进行仔细控制。排序约束的确切性质因硬件而异,并由架构的内存排序模型定义。一些架构提供多个屏障以强制执行不同的排序约束。

http://en.wikipedia.org/wiki/Memory_barrier

当前的英特尔架构可以自动保持所有CPU的缓存一致性,无需显式使用内存屏障或缓存刷新指令。

在对称多处理器(SMP)系统中,每个处理器都有一个本地缓存。内存系统必须保证缓存一致性。当不同处理器上的线程修改存储在同一缓存行上的变量时,会发生伪共享。这会使缓存行失效并强制进行更新,从而影响性能。

http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/


您对缓存一致性保证确定吗?我猜想虚假共享主题不是询问这个的正确位置。我相信存在必须处理的存储缓冲区和失效队列,以允许执行依赖于缓存状态。 - Yarl
1
在这种情况下,你是错的。除非存储缓冲区中的值被写入高速缓存,否则高速缓存一致性协议不会生效。同样,如果项目在失效队列中挂起,则高速缓存状态不一致。 - Yarl
从那个参考中,大多数普通硬件使用一种嗅探协议来确保多级缓存的一致性。一旦一个核心写入一个内存位置,其他核心就知道它们相应的缓存行的副本现在已经过时,因此无效。 - Eric J.
当然可以,但这些信号不需要立即处理。缓存不会立即响应总线事件。 - Yarl
你写道:当前英特尔架构可确保在没有显式使用内存屏障或缓存刷新指令的情况下,在所有CPU之间自动保持高速缓存一致性。 但是,如果没有 存储缓冲区 的写入,缓存一致性将不会发生转变。这是CPU处理 storeload 的过程,因此即使是 Intel 所选择的缓存一致性协议也不能神奇地同步缓存。这将由CPU在选择或被指示时完成。这不是每个 store 操作都会自动调用的过程。更重要的是,当值驻留在某个CPU存储缓冲区中时,没有其他CPU(无效队列)会被告知新值。 - Yarl
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接