iMr*_*lix 5 architecture caching system memory-model
刚刚学完系统的编程讲座材料后,我偶然发现了内存模型以及缓存一致性协议的关键概念。尽管它们作为独立概念是有意义的,但尚不清楚它们如何结合在一起。具体来说,在查看 x86 时,我正在使用强制执行 TSO 内存模型的 ISA,以及使用 MESIF 缓存一致性协议的 CPU(对于 Intel)。
\n\n一开始,教授引入了缓存一致性协议,作为确保芯片中任何核心都访问一个大的单片内存块的手段。然后,在结束了缓存一致性之后,他继续研究内存模型,特别是 TSO(我们已经在并行编程课程中介绍了线性化/顺序一致性)。以下是直接引用有关 x86 内存模型的讲座材料:
\n\n\n\n\n\n
\n- 64 位 x86 处理器的标准\n \n
\n\n
- 有时称为总商店订购 (TSO)
\n- 早期的 32 位 x86 实现的 PRAM \xe2\x80\x93 较弱!
\n- 写入读取放宽:稍后的读取可以绕过早期的写入\n \n
\n\n
- 所有处理器都按照发出的顺序查看来自一个处理器的写入。
\n- 处理器可以看到来自不同处理器的不同写入交错。
\n
似乎我们通过在缓存层次结构中引入(又一个)层,即(有序的)存储缓冲区,“解决”了缓慢的顺序一致性问题。\n对我来说,TSO 似乎与缓存一致性的原则正交。我们非常努力地让我们的缓存匹配,只是在两者之间添加了未被缓存一致性覆盖的另一层。
\n\n问题:
\n\n提前非常感谢您的澄清!
\n\n最好,\n菲利克斯
\n顺序一致性模型是共享内存并行编程最常用的内存模型。包含多个任务或线程的并行程序,顺序一致性需要如下所述的两个条件。
每个程序员都假设这些条件来推理他们的并行程序。不幸的是,顺序一致性是一个没有想象中那么有用的模型。主要原因是这两个属性的实现成本。强制执行这些属性会禁止许多基本的编译器和硬件优化[1]。提出了其他弱/宽松内存模型来放松这些属性并允许编译器和硬件优化。这些弱内存模型以可编程性换取性能。
为什么存储缓冲区没有被缓存一致性协议覆盖?
这是 TSO 出于性能原因的设计选择。从存储缓冲区提供加载服务或在其先前存储(不同地址)仍在存储缓冲区中时提供加载服务,可以减少存储延迟。为了保持存储缓冲区的一致性,加载必须等待,直到所有其他处理器都确认收到存储生成的无效数据。而且,大多数时候,其他缓存中可能没有存储地址的任何副本(该变量是任务的本地变量),那么等待确认就是浪费时间。如果其他任务共享此变量,则可以使用原子或栅栏指令显式强制等待确认。
我应该如何看待缓存一致性和内存模型这两个概念?
缓存一致性协议涉及将存储序列化到同一内存位置,并确保加载将最新存储的值返回到同一内存位置。仅当存在缓存或同一内存位置的多个副本时才需要缓存一致性协议,其作用是保持所有副本的一致性。
内存一致性模型涉及(同一任务)到不同内存位置的加载和存储的相对顺序。任何涉及执行共享内存并行程序(通过共享内存进行通信的多个任务或线程)的系统都必须定义其内存一致性模型。
从广义上讲,缓存一致性协议实现了内存一致性模型的一部分。更准确地说,它是核心管道和缓存一致性协议(以及内存指令遍历的每个其他组件)必须遵守内存模型规范的组合。[1]:共享内存一致性模型:教程