沽虚誉于小人,不若听之于天。
遗货财于子孙,不若周人之急。
-- 曾国藩
这周继续ACE话题。
Read事务通过读地址通道(AR channel)发出,数据和响应从读数据通道(R channel)返回,并由主机端置位RACK标志结束,read事务包括以下几种:
• ReadNoSnoop
• ReadOnce
• ReadClean
• ReadNotSharedDirty
• ReadShared
• ReadUnique
Clean事务通过读地址通道(AR channel)发出,不需要返回数据,响应从读数据通道(R channel)返回,并由主机端置位RACK标志结束,clean事务包括以下几种:
• CleanUnique
• CleanShared
• CleanInvalid
Make事务通过读地址通道(AR channel)发出,不需要返回数据,响应从读数据通道(R channel)返回,并由主机端置位RACK标志结束,make事务包括以下几种:
• MakeUnique
• MakeInvalid,
Write事务通过写地址通道(AW channel)发出,数据通过写数据通道(W channel)传输,响应通过响应通道(B channel)返回,并由主机端置位WACK标志结束,write事务包括以下几种:
• WriteNoSnoop
• WriteUnique
• WriteLineUnique
• WriteBack
• WriteClean
• WriteEvict
Evict事务通过写地址通道(AW channel)发出,不需要传输数据,响应通过响应通道(B channel)返回,并由主机端置位WACK标志结束。
Read barrier通过读地址通道(AR channel)发出,不需要返回数据,响应从读数据通道(R channel)返回,并由主机端置位RACK标志结束。Write barrier通过读地址通道(AR channel)发出,不需要返回数据,响应从读数据通道(R channel)返回,并由主机端置位WACK标志结束。对于barrier事务,简单了解一下就可以了,毕竟到了ACE5已经取消了,不支持了。
DVM(distributed virtual memory)事务通过读地址通道(AR channel)发出,不需要返回数据,响应从读数据通道(R channel)返回,并由主机端置位RACK标志结束。
具体的每个事务对于缓存行状态的影响,请参考spec,这里就不列出了,因为实在太繁琐了,不具体做的话估计不会感兴趣。
比较有意思的是spec中对重叠写事务(overlapping write transaction)的描述。如果两个主机端同时发起对shareable存储空间的同一缓存行的store操作,必须在一个节点,比如互连,对这两个请求排序。排在第一的主机可以正常发起事务操作,而排在后面的主机要窥探(snoop)前面的事务类型。下面为了解释清楚,我们把排在前面的主机叫master1,排在后面的叫master2。分为下面几种情况:
如果master2发出一个ReadUnique用以得到缓存行,那么:
Master2发出ReadUnique
Master2窥探到master1有如下的的事务:ReadUnique,CleanInvalid,MakeInvalid。如果master2有相同缓存行,那么必须无效掉(invalidate)该缓存行。如果master2没有该缓存行的拷贝,则无需操作
当ReadUnique完成后,master2得到更新后的缓存行
Master2执行store操作
如果master2发出MakeUnique用以完成整条缓存行的写操作,那么:
master2发出MakeUnique
Master2窥探到master1有如下的的事务:ReadUnique,CleanInvalid,MakeInvalid。如果master2有相同缓存行,那么必须无效掉(invalidate)该缓存行。如果master2没有该缓存行的拷贝,则无需操作
当MakeUnique完成,master2继续完成整条缓存行的写操作
如果master2发出CleanUnique,用以对已经拥有的缓存行本地副本完成部分缓存行的写,那么:
Master2发出CleanUnique
Master2窥探到master1有如下的的事务:ReadUnique,CleanInvalid,MakeInvalid。Master2必须响应master1的事务,并无效本地副本
当Cleanunique完成,master2并不能对该缓存行进行操作
Master2要发出一个新的ReadUnique,来获得新的缓存行数据
Master2继续完成store
当一个发起主机(initiating master)发起一个事务,互连部分要负责根据这些事务,分发相应的snoop事务给其他的主机端。ARM的spec里面给出的映射表如下图:
在cached主机的snoop地址通道(AC)上,可以看见的事务如下:
• ReadOnce
• ReadClean
• ReadNotSharedDirty
• ReadShared
• ReadUnique
• CleanInvalid
• MakeInvalid
• CleanShared
不允许看见的事务包括:
• ReadNoSnoop
• CleanUnique
• MakeUnique
• WriteNoSnoop
• WriteUnique
• WriteLineUnique
• WriteBack
• WriteClean
• WriteEvict
• Evict
当这些snooped主机接收到snoop事务,要相应调整本地缓存行副本的状态。协议中规定了具体的行为,见下表:
允许的缓存行状态变化如下:
对于一些snoop事务,cached主机需要在snoop数据通道(CD)上提供相应的数据传输。
先这样吧,下周接着整~~~
祝大家周末快乐!
领取专属 10元无门槛券
私享最新 技术干货