是否存在即使使用缓存刷新也会实现内存屏障的arch?我读到内存屏障只影响CPU重新排序,但我读取了与内存障碍相关的语句:确保所有cpu都会看到值... ,但对我来说这意味着缓存刷新/失效。 / p>
答案 0 :(得分:6)
在几乎所有现代架构中,缓存(如L1和L2缓存)都通过硬件保证连贯。无需刷新任何缓存以使其他CPU可以看到内存。
可以想象一个系统在硬件中没有缓存一致性,但它看起来不像运行Windows和Linux等操作系统的当前系统。
这些架构需要内存障碍来做三件事:
CPU可以预取另一个内核写入无效的读取。必须防止这种情况。 (虽然在x86上,这在硬件中被阻止。预取被锁定到L1高速缓存行,因此如果另一个CPU使高速缓存行无效,则预取也会失效。)
CPU可以“发布”写入,而不是将它们放入其L1高速缓存中。这些写入必须至少完成到L1缓存。
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/