目录
一、Read操作概览
二、DMT(Direct Memory Transfer)
三、DCT (Direct Cache Transfer)
四、without Direct Data Transfer
五、ReadNoSnp and ReadOnce* structure with DMT
本篇我们来介绍一下CHI传输类型中的Read
一、Read操作概览
read操作有以下几种:
名称 | 描述 |
ReadNoSnp, ReadNoSnpSep | 对不可监听的(non-snoopable)地址区域的读取请求。(其余都是对可监听snoopable)地址区域的读取请求。 ReadNoSnp支持RN-ICN或ICN-SN的通信 ReadNoSnpSep 仅支持ICN-SN的通信 |
ReadOnce | 只是读取一次数据临时用一下,无需保存到本地的cache中。 |
ReadOnceCleanInvalid | ReadOnce后,期望是将所有的cacheline无效掉(不强制),状态变为invalid,如果cacheline是dirty,则需要将dirty数据写回内存。 |
ReadOnceMakeInvalid | ReadOnce后,期望是将所有的cacheline无效掉,状态变为invalid,如果cacheline是dirty,直接丢弃。 |
ReadClean | 返回的数据必须是clean的(UC、SC) |
ReadNotSharedDirty | 返回的数据不能是SharedDirty的状态,可以是UC、UD、SC |
ReadShared | 返回的数据可以是UC、UD、SC、SD |
ReadUnique | 返回的数据可以是UC、UD |
ReadPreferUnique | 返回的数据最好是unique,但是shared也行 |
MakeReadUnique | 返回的数据是unique, 典型的用法是,Requester拥有cacheline,并希望获得写cache line的权限。 |
其中ReadNoSnp, ReadNoSnpSep用于对不可监听区域的访问 ,例如访问main memory
ReadNoSnp和ReadOnce可以将读到的数据保留在local cache,但该份数据不再保持一致性
ReadOnceCleanInvalid相对ReadOnce的优点是如果cacheline的数据在近期不会使用,该命令可以将cacheline数据刷到memory去,从而提高cache利用率;
ReadOnceMakeInvalid相对ReadOnce的优点是如果cacheline的数据以后都不会使用,该命令可以将cacheline的数据失效掉,从而提高cache利用率且减少不必须要的WriteBack到memory操作。
对于可监听(snoopable)的读操作,可以由DMT和DCT两种方式完成
二、DMT(Direct Memory Transfer)
是指,SN直接将数据返回给Requester
它支持的操作有:
• ReadClean.
• ReadNotSharedDirty.
• ReadShared.
• ReadUnique.
• ReadPreferUnique.
• MakeReadUnique.
步骤如下:
1、Requester通过REQ通道发送一个snoopableread request;
2、ICN通过REQ通道发送一个ReadNoSnp给相应的SN;
3、SN,作为completer,在RDAT通道上,使用CompData将读取的数据和任何关联的事务响应直接转发给的请求者,协议规定,completer必须在接收request之后才能发送CompData
4、Requester通过SRSP通道使用CompAck返回一个响应给ICN,表示交易完成。协议规定requester至少需要接收到一个CompData包以后才能发送CompAck。
以ReadShare操作为例,我们来看一下具体的流程
1、RN-F0 sends a Read request to HN-F
2、HN-F sends a Snoop request to RN-F1.
3、HN-F sends a Read request to SN-F after receiving the Snoop response from RN-F1, which guarantees that RN-F1 has not responded with data.
4、SN-F sends a Data response directly to RN-F0.
5、RN-F0 sends CompAck to HN-F as the Request is ReadShared and requires CompAck to complete the transaction.
RN-F0在向HN发送读请求后,HN向其他的RN发送snoop,查询该cache line在其他RN中的状态
RN-F1返回的response是SnpResp_I,对Snoop的Response,其结果是I,即RN-F1中存在需查询的cache line,但是该cache line中的数据是无效的。
因此,HN需要去main memory(SN)中去读
读到的数据直接返回给RN-F0,不必经过HN
由于数据返回后,只有RN-F0会保存,因此该数据的状态是UC(Compdata_UC)
三、DCT (Direct Cache Transfer)
与DMT向对立的是DCT,区别在于,DCT是其它RN-F直接返回数据给原始Requester
它与DMT支持的操作相同:
• ReadClean.
• ReadNotSharedDirty.
• ReadShared.
• ReadUnique.
• ReadPreferUnique.
• MakeReadUnique.
两者的区别再有,DMT从其他RN中读取数据失败,从而从SN中读取数据返回给RN;而DCT操作,在其他RN中成功读取到了有效数据
步骤如下:
1、Requester过REQ通道发送一个snoopableread request;
2、ICN通过SNP通道发送一个Snp[*]Fwdrequest给RN-F
3、该RN-F作为completer,在RDAT通道上,使用CompData将读取的数据和任何关联的事务响应直接转发给的请求者;
4、该RN-F通过SRSP通道,返回一个SnpRespFwded给ICN,表示已经把读数据发给了requester。协议规定,completer必须在接收snoop之后才能发送CompData;
5、Requester通过SRSP通道使用CompAck返回一个响应给ICN,表示交易完成。协议规定,一旦接收到读取数据的第一个数据包,就可以发送CompAck。
还是以ReadShare操作为例,我们来看一下具体的流程
1、RN-F0 sends a Read request to HN-F
2、HN-F sends a SnpSharedFwd, a Forwarding Snoop request to RN-F1.
3、RN-F1 cache line state transitions from UC to SC.
4、RN-F1 forwards CompData_SC response to RN-F0.
5、RN-F1 also sends a SnpResp_SC_Fwded_SC Snoop response to HN-F that indicates:
(1)The data was forwarded to the Requester.
(2)The final state of the cache line in the snooped cache is SC.
6、After receiving the CompData response RN-F0 sends a CompAck response to HN-F to conclude the transaction.
我们可以看到,HN在snoop RN-F1后,RN-F1表示它有想要访问的数据,此时RN-F1中相应的cache line状态是UC;
那么当它把该数据传输给RN-F0后,该数据就不唯一了,cache line状态需要从UC转变为SC;
同时,RN-F1要告诉HN,它已经将数据发送给RN-F0了,如果是snoop directory的话,HN还要将directory进行更新
RN-F0接收到的数据,也是它和RN-F1同时保存的,因此cache line状态是SC
在上图中,我们看到“SnpResp_SC_Fwded_SC”,它是什么意思呢?
这是一种response,若Snoopee发送数据给Requester,但不需要发送数据给Home,则发送该类型的snoop response给Home,指明被snoop后的状态和forward给Requester的数据状态。
同类型的还有:
不同的response由不同的Opcode来表示,例如:
我们看到,DCT和DMT在HNsnoop RN时,分别用了两种操作:SnpSharedFwd, SnpShared
这两种名称的操作执行的内容是一致的:Snoop request to obtain a copy of the cache line in Shared state while leaving any cached copy in Shared state,and must not leave the cache line in Unique state.
区别在于SnpSharedFwd is permitted to be only sent to one RN-F.
四、without Direct Data Transfer
Requester所得到的数据可以由HN提供
它与DMT、DCT支持的操作相同:
• ReadClean.
• ReadNotSharedDirty.
• ReadShared.
• ReadUnique.
• ReadPreferUnique.
• MakeReadUnique.
步骤如下:
1、The Requester sends a Snoopable Read request on the REQ channel
2、The Completer returns the read data and any associated transaction response with the CompData opcode on the RDAT channel
3、Requester must return an acknowledgement, using the CompAck opcode on the SRSP channel to indicate that the transaction has completed.
以ReadClean操作为例,我们来看一下具体的流程
1、RN-F1 has the cache line in UDP state. RN-F1 responds to the snoop with a snoop response with partial cache line data and passes responsibility for updating memory.
2、HN-F waits for the data response from memory, merges the partial snoop response data with the data response from memory, and sends the resultant data to the Requester.
3、HN-F updates memory as the responsibility for updating memory is not passed on to the Requester.
readclean、readshared区别:readclean返回的数据,必须是clean的,例如:UC、SC
Readshared返回的数据,可以是dirty的,例如:UC、UD、SC,不能是SD
五、ReadNoSnp and ReadOnce* structure with DMT
ReadNoSnp,ReadOnce*,它们的共同点是非snoopable,但是ReadOnce*可以snooping其他master
ReadOnce* 有 DCT ,但是ReadNoSnp没有
支持的操作:
• ReadNoSnp,
• ReadOnce,
• ReadOnceCleanInvalid,
• ReadOnceMakeInvalid
步骤如下:
1、Requester 发送request
2、如果request的Order字段表示需要ordering,则当order建立时,需要返回ReadReceipt (什么是order建立时?这里买个管关子,后面的文章会解释)
3、ICN向SN发送ReadNoSnp请求
4、如果ReadNoSnp 的 request的Order[1:0]==0b01,则SN返回ReadReceipt
5、作为Completer的SN,在RDAT channel上将opcode 为CompDate的读数据、response返回给requester
6、如果ExpCompAck==1,则Requester必须返回CompAck,表示传输完成(当接收到读数据的第一个数据包时,就可以返回CompAck)