【问题标题】:how do processor knows about the latest copy of cache line in multiprocessor system处理器如何知道多处理器系统中缓存行的最新副本
【发布时间】:2013-09-11 07:57:23
【问题描述】:

在每个处理器都有自己的缓存副本的多处理器系统中,处理器如何知道从哪里获取数据副本。 因为它将存在于自己的缓存中,也存在于其他各自处理器或主内存的缓存中,即它将如何知道哪个副本是最新的

【问题讨论】:

    标签: caching computer-architecture multiprocessor


    【解决方案1】:

    在典型的现代缓存一致性系统中,如果内存地址的内容存在于多个缓存中,则它们的内容将相同。使用典型的基于失效的一致性机制,为了让处理器更改内容,它必须获得该内存块的独占所有权。这是通过使任何副本无效来完成的。来自先前已缓存该块的处理器的任何后续请求都将导致未命中(该块已失效),并且一致性操作将在写入处理器的缓存中找到更新的内容。

    (在使用直写缓存实现缓存一致性的早期实现中,可以窥探到内存的公共总线以获取任何内容更改。类似地,更改内容的处理器可以将更改广播或多播给任何共享者。这些方法将保持缓存内容相同。)

    这个过程的一个更微妙的方面是内存一致性——不同的处理器如何看待对不同地址的内存访问顺序。通过顺序一致性,所有处理器都可以看到系统中每次读取和写入的单一顺序。这是最容易理解的一致性模型,但为了支持更大的并行操作硬件复杂性增加(例如,不是等待确认不存在排序冲突,处理器可以推测性地继续执行并回滚到先前已知正确的状态,如果发生了排序冲突)。

    宽松的一致性模型允许读取和写入在不同处理器之间具有不一致的顺序。为了提供更强的排序保证,提供了内存屏障操作。这些操作保证在执行屏障操作的处理器的程序顺序后面的某些类型的内存访问将被所有其他处理器观察为在屏障之后发生,并且某些类型的内存访问(对于该处理器较早)将被所有处理器观察到在障碍之前。

    使用宽松一致性模型的系统可以通过在每次内存访问后使用内存屏障来提供与顺序一致性模型系统相同的行为。然而,使用宽松模型的系统通常不能很好地处理这种过度使用障碍,因为它们旨在利用对内存排序的宽松需求。

    【讨论】:

    • 不错的答案,但有一个更正 - 副本不一定相同 - 一行可以在多个缓存级别中处于修改状态。在这种情况下,最接近核心的级别优先,因为它是最新的修改(L1 > L2 等)。但是,一条线不能在同一级别的多个缓存中处于 M 状态(例如,多核上的 L1)。此外 - 在多插槽系统中,您可能会遇到更多复杂情况。
    【解决方案2】:

    大多数处理器(尤其是我们的笔记本电脑、台式机、服务器中的 x86)都提供了一些硬件cache coherence

    通常,存在一些同步memory barrier instructions

    有传言说一些同步机指令可能会很慢。

    实际上,最近的C++2011C2011 标准都有专门的措辞和atomic 数据类型来处理这些,比如C++11 std::atomic

    在实践中,您应该使用一些完善的标准库,如 pthreads(或 C++11 std::thread 等......)

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 2015-01-17
      • 2018-01-19
      • 1970-01-01
      • 2010-09-09
      • 2012-08-26
      • 2013-09-15
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多