11

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

4

2 回答 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;通常会。)

于 2012-07-01T15:30:31.163 回答
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/

于 2012-07-01T14:53:01.053 回答