【发布时间】:2012-07-02 05:33:13
【问题描述】:
是否存在即使使用缓存刷新也实现了内存屏障的拱门?我读到内存屏障仅影响 CPU 重新排序,但我阅读了与内存屏障相关的语句:确保所有 cpu 都能看到该值...,但对我来说,这意味着缓存刷新/失效。
【问题讨论】:
标签: c caching memory-barriers
是否存在即使使用缓存刷新也实现了内存屏障的拱门?我读到内存屏障仅影响 CPU 重新排序,但我阅读了与内存屏障相关的语句:确保所有 cpu 都能看到该值...,但对我来说,这意味着缓存刷新/失效。
【问题讨论】:
标签: c caching memory-barriers
内存屏障的确切影响取决于具体的架构
CPU 采用了可能导致乱序的性能优化 执行。内存操作(加载和存储)的重新排序 通常在单个执行线程中不会被注意到,但是 在并发程序和设备中导致不可预测的行为 司机除非小心控制。订购的确切性质 约束取决于硬件,并由架构的定义 内存排序模型。一些架构提供了多重障碍 用于执行不同的排序约束。
http://en.wikipedia.org/wiki/Memory_barrier
当前的 Intel 架构确保所有 CPU 的自动缓存一致性,无需显式使用内存屏障或缓存刷新指令。
在对称多处理器 (SMP) 系统中,每个处理器都有一个本地 缓存。内存系统必须保证高速缓存的一致性。虚假分享 当不同处理器上的线程修改变量时发生 驻留在同一缓存行上。这会使缓存行无效,并且 强制更新,这会损害性能。
http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/
【讨论】:
As soon as one core writes to a memory location, the other cores know that their copies of the corresponding cache line are now stale and hence invalid.
在几乎所有现代架构中,缓存(如 L1 和 L2 缓存)都由硬件确保一致。无需刷新任何缓存即可使内存对其他 CPU 可见。
可以假设一个系统在硬件中缓存不一致,但它看起来与当前运行 Windows 和 Linux 等操作系统的系统完全不同。
这些架构需要内存屏障来做三件事:
CPU 可能会预取因在另一个内核上的写入而无效的读取。必须防止这种情况。 (虽然在 x86 上,这在硬件中是被阻止的。预取被锁定到 L1 缓存行,所以如果另一个 CPU 使缓存行无效,预取也会失效。)
CPU 可能会“发布”写入,但尚未将它们放入其 L1 缓存中。这些写入必须至少完成到 L1 缓存。
CPU 可能会在内存屏障的一侧重新排序读取和写入,而在另一侧进行读取和写入。根据内存屏障的类型,必须禁止其中一些重新排序。 (例如,read x; read y; 不能确保读取按此顺序进行。但 read x; memory_barrier(); read y; 通常会这样做。)
【讨论】: