Caching 内存模型/缓存一致性协议:TSO如何与MESIF结合

Caching 内存模型/缓存一致性协议:TSO如何与MESIF结合,caching,architecture,system,memory-model,Caching,Architecture,System,Memory Model,刚读完我的系统编程课程材料,我偶然发现了内存模型以及缓存一致性协议的关键概念。虽然它们作为独立的概念是有意义的,但它们是如何结合在一起的还不是很清楚。具体地说,在研究x86时,我使用的是一个强制执行TSO内存模型的ISA,以及一个使用MESIF缓存一致性协议的CPU(在Intel的情况下) 一开始,教授介绍了缓存一致性协议,以确保芯片中的任何核心都可以访问一个大的单片内存块。然后,在结束缓存一致性之后,他继续使用内存模型,特别是TSO(我们已经在并行编程类中介绍了线性化/顺序一致性)。以下是有关

刚读完我的系统编程课程材料,我偶然发现了内存模型以及缓存一致性协议的关键概念。虽然它们作为独立的概念是有意义的,但它们是如何结合在一起的还不是很清楚。具体地说,在研究x86时,我使用的是一个强制执行TSO内存模型的ISA,以及一个使用MESIF缓存一致性协议的CPU(在Intel的情况下)

一开始,教授介绍了缓存一致性协议,以确保芯片中的任何核心都可以访问一个大的单片内存块。然后,在结束缓存一致性之后,他继续使用内存模型,特别是TSO(我们已经在并行编程类中介绍了线性化/顺序一致性)。以下是有关x86内存模型的讲座材料的直接引用:

  • 64位x86处理器的标准配置
    • 有时称为总门店订购(TSO)
    • 早期32位x86实现的PRAM–较弱
  • 写到读放松:以后的读取可以绕过以前的写入
    • 所有处理器都会按照发出的顺序查看来自一个处理器的写入
    • 处理器可以看到来自不同处理器的写入的不同交错
似乎我们通过引入缓存层次结构中的另一层,即(有序的)存储缓冲区,来“解决”缓慢的顺序一致性问题。 在我看来,TSO似乎与缓存一致性的原则是正交的。我们非常努力地使缓存匹配,结果却在缓存一致性未覆盖的中间添加了另一层

问题:

  • 为什么缓存一致性协议不包括存储缓冲区?是否假定从存储缓冲区回写到L1的速度如此之快,以至于在大多数情况下,由于中间回写而导致的不一致不会成为问题?(也就是说,我估计store buffer->L1传输只需要几个周期,所以一旦L1接收到数据,它就会通过总线发送一个事务,通知其他内核使其副本无效)
  • 我应该如何看待缓存一致性和内存模型这两个概念?按照我的理解,内存模型是我们想要的理论概念,而缓存一致性是实现上述模型的实际实现的一部分
  • 提前非常感谢您的澄清

    最好的,
    Felix

    顺序一致性模型是共享内存并行编程最常用的内存模型。一个包含多个任务或线程的并行程序,顺序一致性需要两个条件,如下所述

  • 程序顺序执行:每个任务中的所有内存操作都以该任务的程序顺序执行
  • 内存访问原子性:内存操作(在并行程序的所有任务中)似乎一次执行一个
  • 每个程序员都假设这些条件来推理他们的并行程序。 不幸的是,顺序一致性是一个没有想象中那么有用的模型。主要原因是这两个属性的实现成本。执行这些 属性禁止许多基本的编译器和硬件优化[1]。 还提出了其他弱/松弛内存模型来松弛这些属性,并允许编译器和硬件优化。这些弱内存模型可以交易 性能的可编程性

    为什么缓存一致性协议不包括存储缓冲区?

    出于性能原因,这是TSO的设计选择。从存储缓冲区提供负载或在负载的前一个存储(不同地址)仍在存储缓冲区中时提供负载,可以减少存储延迟。为了保持存储缓冲区的一致性,负载必须等待所有其他处理器确认接收到存储区生成的无效数据。此外,在大多数情况下,其他缓存中可能没有存储地址的任何副本(变量是任务的本地变量),因此等待确认是浪费时间。如果其他任务共享此变量,则可以使用原子或围栏指令显式强制等待确认

    我应该如何看待缓存一致性和内存模型这两个概念?

    缓存一致性协议涉及将存储序列化到同一内存位置,并确保加载将最近存储的值返回到同一内存位置。只有当同一内存位置存在缓存或多个副本时,才需要缓存一致性协议,其任务是保持所有副本的一致性

    内存一致性模型涉及(同一任务的)加载和存储到不同内存位置的相对顺序。任何涉及执行共享内存并行程序(通过共享内存进行通信的多个任务或线程)的系统都必须定义其内存一致性模型

    一般来说,缓存一致性协议实现了内存一致性模型的一部分。更准确地说,它是核心管道和缓存一致性协议(以及内存指令遍历的所有其他组件)的组合,必须遵守内存模型规范。 [1] :