对TSO加载值规则的疑问及TSO与TSO-x64差异的问询
关于TSO形式化定义的困惑及TSO与TSO-x64的差异疑问
我正在阅读Vijay Nagarajan等人所著的《Memory Consistency and Cache Coherence, Second Edition》,对其中TSO的形式化定义存在困惑。该定义分为三部分:
- 第一部分:内存顺序遵循程序顺序,但存储后跟随加载的情况除外;
- 第三部分:栅栏为操作无法跨其重排序的指令;
- 第二部分(关于加载获取的值)原文表述如下:
每个加载从对同一地址的最后一次存储获取值:
• Value of L(a) = Value of MAX<m{ S(a) | S(a) <m L(a) or S(a) <p L(a) }
该公式表明,加载的值是对同一地址的最后一次存储的值,该存储要么(a)在内存顺序中早于加载,要么(b)在程序顺序中早于加载(但可能在内存顺序中晚于加载),且选项(b)优先(即写缓冲区绕过覆盖其余内存系统)。
我似乎误解了这一表述,它看起来暗示同一核心的存储无论与后续(程序顺序中的)加载在时间上相隔多久,都始终优先于其他核心的存储。但我的理解是,只有当存储仍在写缓冲区中时,(b)才会优先于(a)。即从TSO内存一致性契约的程序员视角来看,只能说加载将从同一位置的、在程序顺序或内存顺序中直接前置的存储获取值,且必须考虑这两种可能性。请问我的理解是否正确?
另外,TSO与TSO-x64是否相同?二者大多被互换使用,但有时其用法似乎暗示存在未说明的差异?
内容的提问来源于stack exchange,提问作者MagicRacoon
相关产品推荐
相关产品推荐

