我们在前文【CHI】CHI协议,transaction事务汇总已经总结了事务类型,这篇开始讲述事务可以完成的方式。它显示了参与事务的各种组件可以使用的所有允许的选项。
注: 除了PCrdReturn 和PrefetchTgt之外,其他的事务在开始的时候都可以包含一个Retry的序列,也就是说可能会发生Retry。
Read事务分为Allocating Read和Non-allocating Read。
Allocating Read事务的顺序是:
一、该事务从请求者向Home发出Allocating Read请求开始。初始请求是以下请求之一:
—— ReadClean
—— ReadNotSharedDirty
—— ReadShared
—— ReadUnique
—— ReadPreferUnique
—— MakeReadUnique
二、可选方案(Alt) 1-6显示了Home处理事务的不同方式:
1.Combined response from Home
Home向请求者(一般为RNF)返回一个组合的数据和响应CompData(读取数据+响应)。通常,当Home可以同时返回数据和响应时,就会使用此选项。例如,数据在本地缓存。
2.Separate data and response from Home
Home向请求者返回一个单独的响应( RespSepData),和读取的数据(DataSepResp)。通常,当Home返回的响应比提供的数据更快时,就会使用此选项。
3. Combined response from Subordinate
——HNF向SNF发送读请求ReadNoSnp。
——可选地,当HNF请求 ReadReceipt响应时(即order !=0),SNF将返回一个ReadReceipt给HNF。
——SNF向RNF返回一个组合的响应和数据,CompData。
通常,HNF会使用此选项来减少消息计数或降低设计复杂性。
4. Response from Home, Data from Subordinate
——HNF向RNF返回一个单独的响应,RespSepData。
——HNF向SNF发送读数据请求ReadNoSnpSep。
——SNF返回一个ReadReceipt;注意HNF并不需要等待ReadReceipt才发RespSepData。
——SNF将读取数据DataSepResp返回给请求者。
通常,当HNF可以快速返回响应,但它没有可用的数据,并且需要下属返回数据时,它将使用此选项。
注:请求者在收到RespSepData即可返回CompAck,而不需要等到DataSepResp数据返回之后再发。
5. Forwarding snoop
Home请求Snoopee将读取数据Snp*Fwd转发给请求者。
snoopee:接收snoop请求的RNF。
也就是说,数据直接通过snoopee转发给请求者,而不需要再通过HNF转一道。
此处又有4个可选项:
Alt 5a.With response to Home
——Snoopee向请求者返回一个组合的响应和读取数据,CompData。
——Snoopee向HNF返回一个snoop响应,SnpRespFwded。
通常,当Snoopee可以将数据转发给请求者,并且不需要向HNF提供数据副本时,它就会使用此选项。
Alt 5b.With data to Home
——Snoopee向请求者返回一个组合的响应和读取数据,CompData。
——Snoopee向HNF返回一个带数据的snoop响应,SnpRespDataFwded。
注意:通常,当Snoopee可以将数据转发到请求者,但也必须向主页提供数据副本时,将使用此选项。例如,当Snoopee持有缓存行的dirty副本,但返回给请求者的数据必须是clean的时,就会发生这种情况。当HNF请求数据副本时,也会发生这种情况。
Alt 5c.Failed, must use alternative
snoopee返回了一个SnpResp给HNF。HNF必须使用前面描述的其他替代方案来完成对请求者的事务。
Alt 5d.Failed, must use alternative
Snoopee返回了一个带数据的snoop响应给HNF,SnpRespData或 SnpRespDataPtl。HNF必须使用前面描述的其他替代方案来完成对请求者的事务。
6. MakeReadUnique only
HNF返回给请求者的完成响应Comp。
此选项只适用于不需要读数据消息时的MakeReadUnique。
三、当请求者向HNF发送完成确认CompAck时,事务就结束了。
只能在接收到 CompData或者 RespSepData后发送。
允许在发送CompAck之前等待DataSepResp,但不是必需的。
(也就是说RNF必须在收到响应之后才能给HNF发送完成确认CompAck,而不需要等到收到数据)
十点了,睡觉睡觉,后面继续更新。。。