CHI trans简析--Non-Allocating Read

文章详细阐述了内存访问中的两种读操作类型——Non-Allocatingread,包括ReadNoSnp命令的不同流程,涉及到保序要求、数据返回方式以及对缓存状态的影响。ReadNoSnp命令在不同场景下有不同的数据传输策略,如数据合并或分开返回,以及对保序点的处理。此外,还提到了ReadOnce和ReadOnceCleanInvalid/ReadOnceMakeInvalid命令,它们用于优化缓存效率和减少写回主存的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        此处仅简单分析每个命令的含义,背景,以及可能的状态变化,对于每个trans具体包含的流程,将在下文描述;

    read类型的操作分为两类,allocating read和non-allocating read;

    Non-Allocating read

   ==============================================================

   ReadNoSnp

  • 用于RN访问no-snoopable空间,或者HN访问任意空间;
  • 此命令的flow, 受order/expcompack控制;
  • 发送端的状态可以如下:

    

  • 最终的状态如下:

    

  • 接收端状态如下:(因为是发送给HN或者SN,所以不涉及每个core的状态跳转)

     

  • expected snoop state

   

  • cache状态转换图如下:

     

  • 访问流程如下:

        a. 可以将comp和data合并返回;

            

        1. 当有保序要求(order != 0)时,HN需要返回readreceipt给RN, 表示该请求已经到达保序点

        2. (如果是SN返回readreceipt给HN,用来通知HN, SN已经收到该请求,且不会再发送retry ack)

         3. HN将comp响应和data同时返回给RN,即CompData;

        b. data和resp分开返回;

           当存在保序要求时,这种流程不能使用;

           

           此时HN只需要分别将respsepdata/datasepresp分别返回给RN即可;

        c. 数据在SN节点,combined resp;

            

            当存在保序需求且comp_ack==0时,此流程不适用;

          【opt】当有保序需求时,HN收到之后,必须要返回ReadReceipt;

            HN发送readnosnp给SN, 请求数据;

            SN将数据和响应,compdata, 一并返回给RN;(DMT)

        d. 数据在SN, 分开返回;

            

            当存在保序需求且comp_ack==0时,此流程不适用;

            HN返回respsepdata给RN, 发送readnosnpsep给SN,;

            -->readnosnpseq:

                     1. 用在HN发送给SN的请求,请求SN只返回数据;

                     2. 当comp响应和data需要分开返回时,使用该命令;

            --> HN返回给RN RespSepData的时机,可以等到SN返回readreceipt之后,这是可以的,

                 不强求;

         【opt】当compack==0时,HN发送的readnosnp必须要求SN返回readreceipt;

           SN直接将数据返回给RN;

        e. RN返回compack(如果expcompack==1), 返回时刻满足如下要求;

            1. 至少有一个compdata packed返回了;

            2. 在没有order需求时,收到respsepdata;

            3. 在有保序需求时,a, 至少要收到RespSepData和一个DataSepResp;(保证这比trans真的已经执行完了,才能释放所有权)

               ---应该对于seperate的都是这样的;

                                             b. 可以等待readreceipt之后,再发送compack;

           

   ==============================================================

   ReadOnce

  • 该命令访问的是snoopable空间,用以获取一份数据,但是该数据不会再当前的RN中缓存
  • 也就是说,只是用一下该地址的数据;无需allocate到本地私有cache;
  • 发起操作的初始状态和最终状态如下:

        

        

  • 接收命令的core,完成后的状态如下:

     

  • 示意流程图如下:

         

  • 该命令的完整流程如下;

         

        

          --failed的场景存疑;

   =======================================================================

   ReadOnceCleanInvalid

  • 访问的是snoopable的地址空间;获取该地址的数据;
  • 建议其他拥有该地址copy的RN,其状态变成invalid, 但是不是强制的;
  • 如果dirty的cacheline被invalid了,需要将数据写入主存
  • 当application想要该地址的数据仍然是有效的,但是近期又不使用的时候,可以使用该命令,而不是readonce/readoncemakeinvalid;
  • 应用程序用此命令可以提高cache效率,因为其可以减少cache的污染;(因为其主动将近期不使用的cacheline从cache中invalid掉?)
  • 此命令不能代替cmo操作,因为它不保证所有的cachline都变成了invalid;
  • 由于这个命令会导致cachline的invalid, 因此,当系统中有其他人在使用exclusive访问时,需要小心;
  • 发起方可以的状态:

      

  • 发起方最终的状态:

     

  • 其他core的完成状态:

    

  • 对应的snp状态:

    

   ==============================================================

   ReadOnceMakeInvalid

  • 访问的是snoopable的地址空间;获取该地址的数据;
  • 建议其他拥有该地址copy的RN,其状态变成invalid, 但是不是强制的;
  • 如果dirty的cacheline被invalid了,则直接丢弃数据
  • 当application知道后续这个地址的数据不再使用,即不再需要该最新数据之后,可以发送该命令;
  • 此种命令在上述场景下,减少了writeback数据到ddr的带宽和时间
  • 此命令的invalid功能可以理解为是一个补丁,不能代替cmo操作,因为当其对应的completion返回的时候,不保证所有的cachline都变成了invalid;
  • 由于这个命令会导致cachline的invalid, 因此,当系统中有其他人在使用exclusive访问时,需要小心;
  • 此命令必须保证,在返回响应之前,先将该cacheline invalid掉,并且在这个时刻点之后的所有写,都不受此次invalid的影响;
  • 发起方的状态/最终状态,完成方的最终状态,对应的snp请求,参考ReadOnceCleanInvalid;

   ==============================================================

   ReadOnce* 和ReadNoSnp可以和DMT/DCT配合使用;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值