首页 > 解决方案 > 由于 cpu 乱序执行或缓存一致性问题,是否需要内存屏障?

问题描述

我想知道为什么需要内存屏障,我已经阅读了一些关于这个主题的文章。
有人说是因为 cpu 乱序执行,也有人说是因为缓存一致性问题导致存储缓冲区和队列无效。
那么,需要内存屏障的真正原因是什么?cpu乱序执行还是缓存一致性问题?或两者?cpu乱序执行和缓存一致性有关系吗?x86和arm有什么区别?

标签: x86armcpu-architecturecpu-cachememory-barriers

解决方案


当 ISA 的内存排序规则弱于您的算法所需的语义时,您需要障碍来排序此核心/线程对全局可见的一致缓存的访问。

缓存始终是一致的,但这与一致性(多个操作之间的排序)是分开的。

您可以在有序 CPU 上进行内存重新排序。更详细地说,如何使用按顺序提交进行加载->存储重新排序?展示了如何在开始按程序顺序执行指令的管道上进行内存重新排序,但使用允许未命中命中的缓存和/或允许 OoO 提交的存储缓冲区。

有关的:


另请参阅https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/https://preshing.com/20120930/weak-vs-strong-memory-models了解更多基础知识. x86 有一个“强”的内存排序模型:程序顺序加上一个带有存储转发的存储缓冲区。C++acquire并且release是“免费的”,只有原子 RMW 和 seq_cst 存储需要屏障。

ARM 有一个“弱”的内存排序模型:只有 C++ memory_order_consume(数据依赖排序)是“免费的”,获取和释放需要特殊指令(如ldar/ stlr)或屏障。


推荐阅读