内存屏障和缓存刷新

时间:2012-07-01 14:47:06

标签: c caching memory-barriers

是否存在即使使用缓存刷新也会实现内存屏障的arch?我读到内存屏障只影响CPU重新排序,但我读取了与内存障碍相关的语句:确保所有cpu都会看到值... ,但对我来说这意味着缓存刷新/失效。 / p>

2 个答案:

答案 0 :(得分:6)

在几乎所有现代架构中,缓存(如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;通常会这样做。)

答案 1 :(得分:5)

内存屏障的确切影响取决于具体的架构

  

CPU采用性能优化,可能导致无序   执行。内存操作的重新排序(加载和存储)   通常在单个执行线程中不被注意,但是   在并发程序和设备中导致不可预测的行为   司机除非小心控制。订购的确切性质   约束是硬件相关的,由架构定义   记忆排序模型。一些架构提供了多个障碍   用于执行不同的排序约束。

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

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

  

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

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