多处理机系统——存储一致性模型(consistency)

存储一致性是指读操作应返回对该存储单元最近一次写操作的值。随着技术的进步和发展,CPU进入多核时代。不同Core需要同时访问共享的存储器区间,对共享的数据区间进行读写。由于不同core在执行程序时存在着很多随机性和不确定性,因此,他们访问memory的顺序也存在着随机性和不确定性,从而造成多核程序执行的不确定性。

                                                     

为了给上层软件明确规定多核程序访问共享数据的结果,在指令集架构中引入了存储器模型的概念。存储器模型又称为存储一致性模型。用于定义系统中对存储器访问需要遵守的原则,只要软件和硬件都遵循该原则,就能保证多核程序能运行得到确切的结果。也可以把存储一致性模型看成是多处理器系统设计者与应用程序之间的一种约定,它给出了正确编写程序的标准,是程序员无需考虑具体的访存次序就能编写正确程序,而系统设计者则可以根据这个约定来优化设计提高性能。
    通常来说,存储一致性模型对访存事件次序施加的限制越弱,越有利于提高性能,但增加了编程难度。且限制越强的存储器模型程序可以在限制较弱的存储器模型上运行,很少会导致错误。

该模型同样适用于单核多线程结构,以下可以多核代替多线程理解。
下文中提到的原子指令参见:
计算机体系结构——指令系统——原子指令-CSDN博客
提到的屏障指令参见:计算机体系结构——指令系统——屏障指令_fence指令-CSDN博客

几种典型的存储器模型,下文将根据限制强弱程度从强到弱排序总结:

1. 顺序一致性模型(SC)

也称为强定序模型,从施加的限制来看,该模型下load/store是顺序的访问存储器。

  • 施加的限制
  1. 每个core都按照程序顺序来执行程序,即便访问的是不同存储器地址,也不能改变访问顺序
  2. 从全局看,每个存储器写操作都需要能被系统中所有的core同时观测到,同一时刻只有core和存储系统相连,因此对memory的访问时原子化的,串行化的。
  • 举例说明

若一个典型的需同步的双核场景:core0要写入一片数据到某一段地址区间中,然后通知core1将此片数据读走。如果处理器的指令集架构符合顺序一致性模型,那么在多个core上执行的程序就好像在一个单core上顺序执行一样。例如某双核结构core1,core2。分别执行A,B,C,D和a,b,c,d各四条存储器访问指令。访问结果无论是ABCDabcd还是ABabcCdD,只要符合任意一核的访问顺序,都是合法的。
顺序一致性模型简单直观,但限制了CPU硬件和编译器的优化,影响了整个系统的性能。

2. 完全存储定序模型(TSO)

由于CPU主频和存储器频率相差较大,系统设计人员通常会在CPU中增加存储缓冲区(store buffer),它的作用是为store指令提供缓冲,使得CPU不用等待存储器的响应。但是由于store缓冲的存在,一些在store之后的load指令可能会越过该指令提前执行,那一个core的store-load操作通常会被其他core看成乱序执行了,变成load-store了。因此在在该模型下,访存操作的四种组合store-store,store-load,load-store,load-load中,只有store-load存在乱序。

  • 施加的限制
  1. store操作在store_buffer中顺序执行
  2. load同样按顺序执行,但可穿插到多个store执行过程中
  3. stores can be reordered after loads

  4. 若存在一组store->load操作,如果由同一core执行且地址相关,则TSO允许该load操作在store操作完成之前就执行;但如果由多个core执行且地址相关,那TSO要求load指令在store执行完成后才能执行。
  • 优化方法

事实上,虽然存储模型规定了存储器访存操作的执行顺序,但是仍然存在一些难以协调的地方。例如在TSO模型中,store->load会存在load结果不确定的情况,此时需要采用同步机制,例如原子指令操作以及屏障操作。

  1. 需要硬件支持来实现同步操作:原子指令,存储器屏障
  2. 阻塞流水线,疏通store buffer

参考链接:
内存一致性模型-TSO - 知乎
CPU发展史解密-内存一致性模型-内存一致性问题

3. 部分存储定序模型(PSO)

系统设计人员并不满足TSO模型带来的性能提升,于是继续在TSO的基础上放松访问内存访问限制,允许CPU以非FIFO来处理store buffer缓冲区的指令,CPU只保证地址相关指令在store buffer中以FIFO的形式进行处理,而其他的则可以乱序处理。

  • 施加的限制
  1. 同一core中地址不相关的store->store指令可以互相穿插执行
  2. load按顺序执行,但可穿插到多个store执行过程中。
  • 优化方法——屏障指令
    屏障指令
  • 举例说明

如下图所示,S1和S2是地址不相关的指令,需要把NEW和SET值加载到寄存器r1,r2中。

core1中的store指令会被推到store buffer,如果此时flag在C1的cache中存在,那么CPU会优先将S2执行完成;然后等data缓存到C1的cache后,再执行S1指令。则总的执行顺序为S2 L1 L2 S2。此时执行的结果是r1=SET,r2=0。不是期望的结果。

从这里可以看出store-store乱序时会将多线程的代码执行击溃,因此在PSO模型上编程要十分注意

4. 处理器一致性模型(PC)

该模型比顺序一致性弱,故对于某些在顺序一致性条件下能正确执行的程序,在处理器一致性条件下执行时可能会导致错误

  • 施加的限制
  1. 在某取数操作load执行之前,所有在同一处理器中先于该条load指令的取数操作(load)都已完成。
  2. 在某存数操作store执行之前,所有在同一处理器中先于该条store的访存操作(load和store)都已完成。

上述条件允许store之后的load越过store而执行,实际上意义是:在cache命中的load指令写回之后但没有提交之前,如果收到其他core对load所访问cache行的无效请求,load指令可以不用取消,较大的简化流水线的设计

5. 弱一致性模型(WO)

该模型的主要思想是把同步操作普通访存操作区分开来,两个同步操作之间的访存操作的顺序不受影响,依然遵循指令程序顺序。

程序员必须用硬件可识别的同步操作把对可写共享单元的访问保护起来,以保证多个处理器对该共享单元的访问是互斥的。该模型增加了程序员的负担,但能有效提高性能。

  • 施加的限制
  1. 同步操作的执行满足顺序一致性条件
  2. 在任意普通访存操作执行之前,所有在同一core中先于该操作的同步操作都已执行完成。
  3. 在任一同步操作执行之前,所有在同一core中先于该操作的普通访存操作都已执行完成。

该限制允许在同步操作之间的普通访存操作执行时不用考虑进程之间的相关。

  • 优化方法
    参见原子指令

6. 释放一致性模型(RC)

该模型是对弱一致性模型的改进,它把同步操作进一步分成获取操作(acquire)和释放操作(release)。acquire用于获取对某些共享存储单元的独占性访问权;release用于释放该访问权。执行的顺序为:acquire-> load/store ->release

  • 施加的限制
  1. 同步操作的执行满足顺序一致性条件
  2. 在任意普通访存操作执行之前,所有在同一core中先于该操作的acquire操作都已完成。
  3. 在任意release操作执行之前,所有在同一core中先于该操作的普通访存操作都已完成。
  • 优化方法
    参见原子指令

7. 松散一致性模型(RMO)

系统开发人员为了榨取更多的性能,在PSO的基础上进一步放宽了访存指令的执行限制,不仅允许store-store,store-load乱序,还进一步允许load-load,load-store乱序,只要是地址无关的指令,在读写访存的时候都可以打乱访存顺序。

实际上,根据单核结构的流水线分析(链接计算机体系结构——中央处理器——流水线技术_取指译码执行访存写回-CSDN博客),单核中不同存储器的访问指令理论上是可以改变执行顺序的。类似的,松散一致性模型允许多核结构中的每个单核改变memory访问指令(不同访问地址)的执行顺序。

  • 优化方式——屏障指令
    屏障指令:

松散一致性模型和FENCE的结合可以达到性能和功能的平衡,可以在不关心访存顺序的情况下达到高性能,也可以在关心访存顺序的情况下使用FENCE指令约束指令执行顺序。


 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KGback

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值