Cache Coherence on AMD HyperTransport

来源:互联网 发布:朴智妍网络剧重生 编辑:程序博客网 时间:2024/05/16 00:51

Cache Coherence on AMD HyperTransport

 
 
( 很多东西是我的推测,请带着的怀疑的眼光看这篇文章 )
这两天研究了一下AMD在hypertransport上实现cache coherence的方法,总结如下:

(1)
     Memory 1 = Processor 1 -------- Processor 2 = Memory 2
                             |                                  |
                             |                                  |
                             |                                  |
                             |                                  |
     Memory 3 = Processor 3 -------- Processor 4 = Memory 4

AMD 的hypertransport是一种基于package-switch的interconnection,不同于传统的bus,他是peer-2- peer的。每个socket有自己的local memory,如果要访问remote memory,要通过hypertransport。这种系统就叫NUMA,每个processor和属于它的memory叫做一个node。不过, AMD实现的这个NUMA,local memory和remote memory latency差距不大,和SMP很像。下文中HyperTransport简称为HT,cache coherence简称为cc。

(2) 一般在bus的系统上,cc是通过broadcast/snooping完成的;在interconnection的NUMA系统上,是通过 directory来实现的。但是,AMD的ccHT实现介于两者之间,它是interconnection/NUMA,但是没有使用 directory,而是使用broadcast来实现cc。这是因为AMD主要针对2,4,8个node的低端市场(实际上是需求最大的市场), scalability不是他们的目标,用broadcast可以简化实现。

(3)多个processor对同一个memory block(cache line)的操作需要serialization(比如两个几乎同时发生的write的操作,要保证所有的node上看到相同的更新顺序)。在bus上,所有的操作都会被bus自动的serialize。但是peer-2-peer上message的传递是没有这种全局同步的。如果想达到这种 serilization,就需要依赖一个共享资源。在AMD的ccHT中,所以的transaction都是先发送到相应memory block(cache line)的home node,然后由这个home node发出广播message,从而做到了对同一个memory block (cache line)操作的serilization。

(4)ccHT使用的不是经典的MESI协议,而是MOESI的协议,多了一个owner的状态。对于某个处于modified状态的cache line A,如果有其他的node发生了对它的数据的read miss,A可以把数据发送给发生read miss的node(假设写到cache line B上)。B的状态被设为shared,这个A的状态则被修改为owner。如果A自己发生了write hit,会通过home node来broadcast invalidate的message,这是owner状态和modified状态不同的地方:如果是modified状态,自己的write hit不产生任何message。传统MESI,对于处于modified状态的cache line,如果被其他processor读取,必须把它写回memory,并把自己改到shared状态。这个写回memory的操作有开销,而且即使这个modified cache line可以通过bus把值直接传给需要它的processor,也是很慢的,可能比从内存读值更慢。ccHT的MOESI则解决了这个问题。

(5) 如果有一个node(requesting node)发生了cache read miss,他会通过这个cache line的物理地址找到它的home node,然后向home node发送一个request。当home node收到这个request后,会将一个read request广播给系统里所有的node,包括他自己,然后home node自己会发出memory access的命令。所有的node在收到home node的broadcast之后,会给requesting node发送response:如果某个node有这个cache line的copy,response就包含该cache line的结果(如果该cache line的状态是exclusive则变为shared,modified则变为owner,如果是shared或是owner则不变),如果没有相应的 copy, response就标明没有。requesting node会收集好所有的response,如果其他的node传来了cache line的值,则写入cache(状态为shared),abort home node的memory access的请求;否则就等待memory access的结果(写入cache后,cache line的状态是exclusive)。最后requesting node向home node发送一个message,表明本次transaction结束。

 
(6) 如果有一个node(requesting node)发生了cache write miss,他会通过这个cache line的物理地址找到它的home node,然后向home node发送一个request。当home node收到这个request后,会将一个read/invalidate request广播给系统里所有的node,包括他自己,然后home node自己会发出memory access的命令。所有的node在收到home node的broadcast之后,会给requesting node发送response:如果某个node有这个cache line的copy,response就包含该cache line的结果并将其invalidate掉。如果没有相应的copy,response就标明没有。requesting node会收集好所有的response,如果其他的node传来了cache line的值,则和需要write的值一起写入cache(状态为modified),abort home node的memory access的请求;否则就等待memory access的结果。最后requesting node向homenode发送一个message,表明本次transaction结束。


(7) 如果有一个node发生了cache read hit,那么什么都不做。

(8) 如果有一个node发生了cache write hit,如果cache line本身是modified/exclusive,那么什么都不做,直接修改cache,如果cache本身是exclusive的,则改为 modified。如果cache line是shared或是owner,则与(6)做相同的处理。

(9)每个node在收到home node的broadcast之后,会通过crossbar发送给自己所有的core,然后把所有core的结果拼成一个response返回给requesting node.
原文地址:http://yuanbor.blog.163.com/blog/static/56674620200811993532387/
原创粉丝点击