很多问题SO和文章/书籍如https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.2018.12.08a.pdf,Preshing的文章如https:// /preshing.com/20120710/memory-barriers-are-like-source-control-operations/和他的整个系列文章,就不同障碍类型提供的排序和可见性保证而言,抽象地讨论了内存排序。我的问题是这些障碍和内存排序语义是如何在 x86 和 ARM 微架构上实现的?
对于存储-存储屏障,似乎在 x86 上,存储缓冲区维护存储的程序顺序并将它们提交到 L1D(从而使它们以相同的顺序全局可见)。如果存储缓冲区未排序,即不按程序顺序维护它们,存储存储屏障是如何实现的?它只是以这样一种方式“标记”存储缓冲区,即在屏障提交之前存储到缓存相干域之前存储之后?还是内存屏障实际上会刷新存储缓冲区并停止所有指令,直到刷新完成?可以双向实施吗?
对于加载-加载障碍,如何防止加载-加载重新排序?很难相信 x86 会按顺序执行所有加载!我假设负载可以无序执行,但按顺序提交/退出。如果是这样,如果一个 cpu 对 2 个不同的位置执行 2 次加载,那么一次加载如何确保它从 T100 获得一个值,而下一次加载是在 T100 上或之后获得的?如果第一次加载在缓存中未命中并正在等待数据,而第二次加载命中并获取其值怎么办?当 load 1 获得它的值时,它如何确保它获得的值不是来自加载 2 的 value 的新商店?如果负载可以乱序执行,如何检测到违反内存顺序的情况?
类似地,加载存储屏障(隐含在 x86 的所有加载中)是如何实现的,以及存储加载屏障(例如 mfence)是如何实现的?即 dmb ld/st 和 just dmb 指令在 ARM 上做了什么微架构,每次加载和每次存储都做了什么,mfence 指令在 x86 上做微架构以确保内存排序?