我们在前文【CHI】CHI协议,transaction事务汇总已经总结了所有的事务类型,这篇开始讲述事务可以完成的方式。它显示了参与事务的各种组件可以使用的所有允许的选项。
注: 除了PCrdReturn 和PrefetchTgt之外,其他的事务在开始的时候都可以包含一个Retry的序列,也就是说可能会发生Retry。
一、Read transactions
Read事务分为Allocating Read和Non-allocating Read。
1.1 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,而不需要等到收到数据)**
1.2 Non-allocating Read transactions
Non-allocating Read transactions的顺序序列是:
一、事务从请求者向HNF发出读取请求开始。
Non-allocating Read事务包括:
—— ReadNoSnp
—— ReadOnce
—— ReadOnceCleanInvalid
—— ReadOnceMakeInvalid
这些请求如果包含了以下字段的话,会影响事务的传输flow:
—— Order(order要求通过ReadReceipt保序)
—— ExpCompAck(必须回复CompAck)
二、可选的Alt 1-6 显示了HNF可以处理事务的不同方式。
1.Combined response from Home
——(可选的)当原始请求有order保序要求时,HNF向请求者返回一个ReadReceipt。
——HNF向请求者返回一个组合响应和读取数据,CompData。
2.Separate data and response from Home
——Home向请求者返回一个单独的响应,RespSepData;以及一个单独的读数据,DataSepResp。如果请求有order要求,且不需要完成确认,则不能使用此替代方案。
3.Combined response from Subordinate
——(可选的)当原始请求有order保序要求时,HNF向请求者返回一个ReadReceipt。
——HNF向SN发送读请求ReadNoSnp。
——(可选的)当HNF请求读接收响应时,SN将返回ReadReceip给HNF。当不需要完成确认时,HNF必须这样做。
——SN向请求者返回一个组合响应和读取数据,CompData。
注:如果请求需要order要求,且没有要求完成确认时,不能使用这种处理方式。
4.Response from Home, data from Subordinate
——HNF向请求者返回一个单独的响应RespSepData,并向SN发ReadNoSnpSep。
——(可选的)当HNF请求读接收响应时,SN将返回ReadReceipt给HNF。HNF必须要求ReadReceipt,除非原始要求表明order要求和(completion acknowledge)完成确认响应。
允许(但不要求),HNF等待ReadReceipt,然后返回RespSepData给请求者。
——SN将读取数据DataSepResp返回给请求者。
5.Forwarding snoop
又有4个可选处理方式: (同allocating-read)
Alt 5a. With response to Home
——Snoopee向请求者返回一个组合的响应和读取数据,CompData。
——Snoopee向HNF返回一个snoop响应,SnpRespFwded。
Alt 5b. With data to Home
——Snoopee向请求者返回一个组合的响应和读取数据,CompData。
——Snoopee向HNF返回一个带数据的snoop响应,SnpRespDataFwded。
Alt 5c. Failed, must use alternative
——snoopee返回了一个SnpResp给HNF。
——HNF必须使用前面描述的其他替代方案来完成对请求者的事务。
Alt 5d. Failed, must use alternative
——Snoopee返回了一个带数据的snoop响应给HNF,SnpRespData或 SnpRespDataPtl。
——HNF必须使用前面描述的其他替代方案来完成对请求者的事务。
三、如果原始请求有ExpCompAck,请求者只能在以下情况之后提供CompAck响应:
——至少接收到一个CompData的packet。
——如果请求没有order要求,收到RespSepData即可。在这种情况下,允许但不要求等待DataSepResp。
——如果请求有order要求,收到RespSepData之后,还必须收到DataSepResp的一个packet之后,才能回复CompAck。
如果原始请求有order要求,则允许(但不要求)请求者在发送CompAck之前等待ReadReceipt。
下表列出了RN中ReadNoSnp和ReadOnce*允许的DMT和DCT事务:
(Y:允许
N:不允许
:不适用)
二、Write Transactions
写事务分为以下几种类型:
Immediate Write
Write Zero
CopyBack Write
Combined Immediate Write and CMO
Combined Immediate Write and Persist CMO
Combined CopyBack Write and CMO
2.1 Immediate Write
Immediate Write事务的顺序是:
一、Requester发送一个Immediate Write请求到HNF开始。
Immediate Write包括:
— WriteNoSnpPtl
— WriteNoSnpFull
— WriteNoSnpDef
— WriteUniquePtl
— WriteUniqueFull
— WriteUniquePtlStash
— WriteUniqueFullStash
注:为完成这些事务而生成的Snoop请求被视为来自Home的独立事务,并且不显示在此flow中。向下游SN而生成的非DWT流程的写入请求,被视为独立事务,不显示在该流程中。
这些请求如果包含了以下字段的话,会影响事务的传输flow:
—— TagOp(需要返回TagMatch响应)
—— ExpCompAck(必须回复CompAck)
三、Home可以选择使用DWT或无DWT来完成事务传输。事务流的其余部分还将取决于原始请求是否需要完成确认响应,这将由ExpCompAck字段来确定。在备选方案1-3中描述了这些组合:
1.HNF使用DWT。
——Home向SN发送下游写入请求,WriteNoSnpPtl, WriteNoSnpFull,
WriteNoSnpDef,使用DoDWT = 1。
——SN会向请求者返回一个数据请求,即DBIDResp。
——请求者向下级发送写入数据,NCBWrData或取消写入数据,WriteDataCancel。请求者必须仅在收到DBIDResp后才发送。
——SNF返回完成响应Comp给到HNF。
——HNF向请求者返回一个完成响应,Comp。允许(但不要求),HNF等待SNF返回的Comp,再给请求者发Comp。
——可选地,当请求需要TagMatch响应时,SNF将向请求者返回TagMatch响应。在返回TagMatch之前可以等待写数据,但不是必需的。
-----未完待续。