内存屏障和缓存刷新

是否有任何拱门,即使缓存刷新,也会实现内存屏障? 我读到内存屏障仅影响CPU重新排序,但我读取了与内存屏障相关的语句: 确保所有cpu都会看到值… ,但对我来说,这意味着缓存刷新/失效。

内存屏障的确切影响取决于特定的体系结构

CPU采用性能优化,可能导致无序执行。 内存操作(加载和存储)的重新排序通常在单个执行线程中被忽视,但在并发程序和设备驱动程序中会导致不可预测的行为,除非仔细控制。 排序约束的确切性质取决于硬件,并由体系结构的内存排序模型定义。 某些体系结构为执行不同的排序约束提供了多个障碍。

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

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

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

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

在几乎所有现代架构中,高速缓存(如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;顺序发生。但是read x; memory_barrier(); read y;通常是。)