几句话说清楚42:Xeon Scalable CPU Cache Coherence处理流程(2)

上一篇文章中我们介绍了在Non-inclusive缓存第一次读取的读取数据的过程。其中有几个关键点在于:

  • 数据不是首先进入L3缓存再进入L2缓存,而是直接进入L2缓存
  • 数据所在Cache Line的状态会被记录在它自己的Home节点的Snoop Filter中
  • 所有LLC中的数据和Snoop Filter中的数据可以涵盖此时CPU所有缓存中的数据,只是会有重复的
  • Snoop Filter和LLC是Exclusive关系,在Snoop Filter中的数据不会同时存在于LLC中,反之亦然

在这篇文章中介绍当数据进入缓存之后,有另外一个CPU核也想取得该数据时会发生什么。

大的思路要先明确:有另外一个核也需要获取该数据,说明该数据有在多核内共享的可能,为此需要将该数据保存在LLC中,以便未来有需要时可以快速获取。

初始状态:某一Cache Line保存在Core1的L2$中,其Home节点SF中有关于该Cache Line的记录,CV=Core1,status=M

此时有Core2也想获取该Cache Line中的数据,将会有如下步骤:

  • Core2查询自己的L2$, Miss
  • Core2发送Rd消息给自己的CHA,CHA通过CMS将消息送到MESH总线
  • Home节点的CMS接收到该消息,并交给自己的CHA
  • 自己的CHA并行查询自己的SF和LLC,其中SF返回Hit,并且获得其CV=Core1,则数据在Core1的L2$中
  • Home节点CHA给Core1发送SnpData消息,让它把数据给到Home节点的LLC
  • Core1收到信息,更改自己L2$中的Cache Line为S状态,同时返回RspMFwdS消息并把数据通过MESH给到Home节点
  • Core1发送数据到Home节点的LLC,状态M,CV=Core2,根据SF和LLC互相Exclusive的关系,Home节点的SF该Cache Line记为I状态
  • Home节点发送GO消息给Core2
  • Home节点发送数据至Core2 L2$,状态S

以上过程也可以理解为多核之间读取数据的过程。

但这里需要明确的就是,Core2发送的是Rd的消息,而不是RFO消息。对于RFO消息,Core2取得的数据不能存放在LLC中,因为这个数据是要被写入新数据的,最终只能进入到Core2的L2$中。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero