CN116775560B - 写分配方法、缓存***、片上***、电子组件及电子设备 - Google Patents

写分配方法、缓存***、片上***、电子组件及电子设备 Download PDF

Info

Publication number
CN116775560B
CN116775560B CN202311055542.4A CN202311055542A CN116775560B CN 116775560 B CN116775560 B CN 116775560B CN 202311055542 A CN202311055542 A CN 202311055542A CN 116775560 B CN116775560 B CN 116775560B
Authority
CN
China
Prior art keywords
cache line
cache
linked list
indicated
target
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202311055542.4A
Other languages
English (en)
Other versions
CN116775560A (zh
Inventor
李健
王克行
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Xiangdixian Computing Technology Co Ltd
Original Assignee
Beijing Xiangdixian Computing Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Xiangdixian Computing Technology Co Ltd filed Critical Beijing Xiangdixian Computing Technology Co Ltd
Priority to CN202311055542.4A priority Critical patent/CN116775560B/zh
Publication of CN116775560A publication Critical patent/CN116775560A/zh
Application granted granted Critical
Publication of CN116775560B publication Critical patent/CN116775560B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/78Architectures of general purpose stored program computers comprising a single central processing unit
    • G06F15/7807System on chip, i.e. computer system on a single chip; System in package, i.e. computer system on one or more chips in a single package
    • G06F15/781On-chip cache; Off-chip memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Microelectronics & Electronic Packaging (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本公开提供一种写分配方法、缓存***、片上***、电子组件及电子设备,该方法包括:对于未命中缓存行的写请求,判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;若是,从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求;否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行冲刷操作后分配给所述写请求。通过该方法,可提高缓存写分配的效率,进而提高缓存的使用效率,有利于提高整个芯片的性能。

Description

写分配方法、缓存***、片上***、电子组件及电子设备
技术领域
本公开涉及缓存(Cache)技术领域,尤其涉及一种写分配方法、缓存***、片上***、电子组件及电子设备。
背景技术
CPU(Central Processing Unit,中央处理器)或其它计算核心,例如GPU(Graphics Processing Unit,图形处理器)的处理速度明显快于作为主存的DDR(包括DDR、GDDR、LPDDR等)的处理速度。为了平衡速度差异,一般会在芯片内部使用一级或多级Cache(缓存)。其中,越靠近CPU或其它计算核心,Cache面积越小、速度越快;越远离CPU或其它计算核心,Cache面积越大、速度越慢。
基于上述缓存架构,一般在针对写操作执行Cache替换策略时,会先在Cache里进行检索,如果命中(hit)Cacheline(缓存行),则直接在该缓存行内进行写操作,即将写操作对应的数据写到命中的缓存行中;如果未命中(miss)缓存行,则基于LRU策略执行写分配,即使用LRU策略选择一个最近最少使用的缓存行,将其冲刷(flush)出去(即写到下一级Cache或DDR中),然后将flush后的缓存行的内容替换为要写的数据。
然而,下游总线也会不断地响应读写请求,且在响应过程中可能会间歇性地处于繁忙阶段。若在将选中的缓存行 flush出去的时机撞到下游总线处于繁忙的阶段,势必会增加这笔flush操作的耗时,导致写分配的效率受到影响,进而影响Cache的使用效率。
发明内容
本公开的目的是提供一种写分配方法、缓存***、片上***、电子组件及电子设备,可提高Cache写分配的效率,进而提高Cache的使用效率,有利于提高整个芯片的性能。
根据本公开的一个方面,提供一种写分配方法,包括:对于未命中缓存行的写请求,判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;若是,从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求;否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行冲刷flush操作后分配给所述写请求;
所述第一链表指示的第一缓存行表示:所述缓存组包括的所有缓存行中处于已使用且未被flush的缓存行;所述第二链表指示的第二缓存行表示:在下游总线处于空闲状态下,对所述第一缓存行执行flush操作且未执行分配操作后的缓存行。
本公开一种可行的实现方式中,所述第一链表与所述第二链表均包括多个条目entry,且每个链表的尾部entry指示的缓存行表示该链表所指示的所有缓存行中最近最少使用的缓存行;所述从所述第二链表指示的第二缓存行中选择目标缓存行,包括:选择所述第二链表的尾部entry保存的信息所指示的第二缓存行,所述选择的第二缓存行为所述目标缓存行;以及;
从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,包括:选择所述第一链表的尾部entry保存的信息所指示的第一缓存行,所述选择的第一缓存行为所述目标缓存行。
本公开一种可行的实现方式中,每个链表的头部entry指示的缓存行表示该链表所指示的所有缓存行中距当前最近时刻使用过的缓存行,在所述分配给所述写请求后,所述方法还包括:在确定所述目标缓存行内写入与所述写请求对应的数据后,将用于指示所述目标缓存行的信息***所述第一链表的头部entry。
本公开一种可行的实现方式中,所述方法还包括:在每个时钟周期监测下游总线的负载情况;在所述负载情况表示所述下游总线处于所述空闲状态时,对保存在所述第一链表的尾部entry内的信息所指示的第一缓存行执行所述flush操作;将执行完所述flush操作后的第一缓存行的信息从所述第一链表的尾部entry中删除,并将执行完所述flush操作后的第一缓存行的信息***所述第二链表的头部entry,指示新的第二缓存行。
本公开一种可行的实现方式中,每个缓存行存在对应的数据有效标识,所述数据有效标识使能时表示对应缓存行中保存的数据有效;对所述缓存行执行所述flush操作后,位于所述缓存行内的数据保持不变;所述方法还包括:将每个未被分配的所述第二缓存行的数据有效标识置为使能。
本公开一种可行的实现方式中,所述方法还包括:在确定读请求命中所述第二缓存行的情况下,将命中的第二缓存行中保存的数据返回给所述读请求的发起者,并将用于指示所述命中的第二缓存行的信息挪动到所述第二链表的头部entry。
本公开一种可行的实现方式中,所述监测下游总线的负载情况,包括:监测主存控制器内的命令队列内的命令个数;在所述命令个数小于命令个数阈值的情况下,确定所述下游总线处于所述空闲状态。
本公开一种可行的实现方式中,所述监测下游总线的负载情况,包括:监测AXI总线的有效信号;在所述有效信号在预设时间内持续为低的情况下,确定所述下游总线处于所述空闲状态。
根据本公开的另一方面,还提供一种缓存***,包括缓存控制器以及缓存,所述缓存包括多个缓存组,每个缓存组存在对应的第一链表以及第二链表,且每个缓存组包括多个缓存行;对于未命中缓存行的写请求,所述缓存控制器被配置为:对于未命中缓存行的写请求,判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;若是则从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求;否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行冲刷flush操作后分配给所述写请求;
所述第一链表指示的第一缓存行表示:所述缓存组包括的所有缓存行中处于已使用且未被flush的缓存行;所述第二链表指示的第二缓存行表示:在下游总线处于空闲状态下,对所述第一缓存行执行flush操作且未执行分配操作后的缓存行。
本公开一种可行的实现方式中,所述第一链表与所述第二链表均包括多个条目entry,且每个链表的尾部entry指示的缓存行表示该链表所指示的所有缓存行中最近最少使用的缓存行;所述缓存控制器从所述第二链表指示的第二缓存行中选择目标缓存行的情况下,具体被配置为:选择所述第二链表的尾部entry保存的信息所指示的第二缓存行,所述选择的第二缓存行为所述目标缓存行;以及;
所述缓存控制器从所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行的情况下,具体被配置为:选择所述第一链表的尾部entry保存的信息所指示的第一缓存行,所述选择的第一缓存行为所述目标缓存行。
本公开一种可行的实现方式中,每个链表的头部entry指示的缓存行表示该链表所指示的所有缓存行中距当前最近时刻使用过的缓存行,所述缓存控制器还被配置为:在确定所述目标缓存行内写入与所述写请求对应的数据后,将用于指示所述目标缓存行的信息***所述第一链表的头部entry。
本公开一种可行的实现方式中,所述缓存控制器还被配置为:在每个时钟周期监测下游总线的负载情况;在所述负载情况表示所述下游总线处于所述空闲状态时,对保存在所述第一链表的尾部entry内的信息所指示的第一缓存行执行所述flush操作;将执行完所述flush操作后的第一缓存行的信息从所述第一链表的尾部entry中删除,并将执行完所述flush操作后的第一缓存行的信息***所述第二链表的头部entry,指示新的第二缓存行。
本公开一种可行的实现方式中,每个缓存行存在对应的数据有效标识,所述数据有效标识使能时表示对应缓存行中保存的数据有效;对所述缓存行执行所述flush操作后,位于所述缓存行内的数据保持不变;所述缓存控制器还被配置为:将每个未被分配的所述第二缓存行的数据有效标识置为使能。
本公开一种可行的实现方式中,所述缓存控制器还被配置为:在确定读请求命中所述第二缓存行的情况下,将命中的第二缓存行中保存的数据返回给所述读请求的发起者,并将用于指示所述命中的第二缓存行的信息挪动到所述第二链表的头部entry。
本公开一种可行的实现方式中,在监测下游总线的负载情况的情况下,所述缓存控制器具体被配置为:监测主存控制器内的命令队列内的命令个数;在所述命令个数小于命令个数阈值的情况下,确定所述下游总线处于所述空闲状态。
本公开一种可行的实现方式中,在监测下游总线的负载情况的情况下,所述缓存控制器具体被配置为:监测AXI总线的有效信号;在所述有效信号在预设时间内持续为低的情况下,确定所述下游总线处于所述空闲状态。
根据本公开的另一方面,还提供一种片上***(System on Chip,SOC),该片上***包括上述缓存***。在一些使用场景下,该SOC的产品形式体现为GPU(GraphicsProcessing Unit,图形处理器) SOC;在另一些使用场景下,该SOC的产品形式体现为CPU(Central Processing Unit,中央处理器) SOC。
根据本公开的另一方面,还提供一种电子组件,该电子组件包括上述任一实施例中所述的片上***SOC。在一些使用场景下,该电子组件的产品形式体现为显卡;在另一些使用场景下,该电子组件的产品形式体现为CPU主板。
根据本公开的另一方面,还提供一种电子设备,包括上述的电子组件。在一些使用场景下,该电子设备的产品形式是便携式电子设备,例如智能手机、平板电脑、VR设备等;在一些使用场景下,该电子设备的产品形式是个人电脑、游戏主机等。
附图说明
图1是本公开一个实施例的缓存***的结构示意图;
图2A是本公开一个实施例的链表操作示意图之一;
图2B是本公开一个实施例的链表操作示意图之二;
图2C是本公开一个实施例的链表操作示意图之三;
图2D是本公开一个实施例的链表操作示意图之四;
图2E是本公开一个实施例的链表操作示意图之五;
图3为本公开一个实施例的写分配方法的流程示意图。
具体实施方式
在介绍本公开实施例之前,应当说明的是:
本公开部分实施例被描述为处理流程,虽然流程的各个操作步骤可能被冠以顺序的步骤编号,但是其中的操作步骤可以被并行地、并发地或者同时实施。
本公开实施例中可能使用了术语“第一”、“第二”等等来描述各个特征,但是这些特征不应当受这些术语限制。使用这些术语仅仅是为了将一个特征与另一个特征进行区分。
本公开实施例中可能使用了术语“和/或”,“和/或”包括其中一个或更多所列出的相关联特征的任一和所有组合。
应当理解的是,当描述两个部件的连接关系或通信关系时,除非明确指明两个部件之间直接连接或直接通信,否则,两个部件的连接或通信可以理解为直接连接或通信,也可以理解为通过中间部件间接连接或通信。
为了使本公开实施例中的技术方案及优点更加清楚明白,以下结合附图对本公开的示例性实施例进行进一步详细的说明,显然,所描述的实施例仅是本公开的一部分实施例,而不是所有实施例的穷举。需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。
在设置有缓存的芯片中,一般在针对写操作执行Cache替换策略时,会先在Cache里检索,如果命中缓存行,则直接在该命中的缓存行内进行写操作;如果未命中缓存行,则基于LRU策略执行写分配,即使用LRU策略选择一个最近最少使用的缓存行,将其被动flush出去(即写到下一级Cache或DDR中),然后将被动flush后的缓存行的内容替换为要写的数据。上述将缓存行 flush出去的动作总是被动的,即确实需要执行flush操作时,才会将缓存行 flush出去。
然而,下游总线也会不断地响应读写请求,且在响应过程中可能会间歇性地处于繁忙阶段。若执行被动flush操作的时机撞到下游总线处于繁忙的阶段,那么会等待下游总线空闲后才执行这笔flush操作,势必会增加这笔flush操作的耗时,影响写分配的效率,进而影响Cache的使用效率。
基于此,本公开的目的是提供一种写分配方案,可提高Cache写分配的效率,进而提高Cache的使用效率,有利于提高整个芯片的性能。
具体的,请参照图1,本公开一个实施例提出一种缓存***,该缓存***包括缓存控制器(Cache Controller)、Cache以及其他组件(如果必要)。该缓存***与上游设备(例如GPU Core、CPU Core等主设备Master)连接,且通过AXI总线与下游主存(例如DDR、GDDR、LPDDR)连接。
其中,Cache被分成多个Cache组,且在每个Cache组内包括多个缓存行(缓存行)。此外,在本申请实施例中,针对每个Cache组,设置对应的第一链表以及第二链表。
当然,值得指出的是,本公开实施例中所提及到的Cache,可以是一级缓存,也可以是多级缓存。
在本公开实施例中,当上游设备有针对下游主存的读/写数据需求时,会发起携带地址信息的读/写请求。
与现有技术类似的,Cache Controller基于地址信息中的预设低位信息(对应Cache寻址中的索引index),确定出与该笔读/写请求对应的缓存组,然后再基于地址信息中的预设高位信息(对应Cache寻址中的tag)在缓存组所包括的缓存行里进行检索,如果两者的tag一致则命中缓存行,可直接在该缓存行内进行读/写操作,否则表示该笔读/写请求未命中缓存行。
对于未命中缓存行的写请求,Cache Controller会对其执行写分配操作,即从与写请求携带的地址信息确定出的缓存组中,选择该缓存组所包括的一个缓存行分配给该写请求,以便后续可往该分配的缓存行内执行写操作,写入该笔写请求所要写入的数据。
当然,上述对于缓存组以及缓存行的寻址均是较为常规的技术且仅作示例性说明,其具体寻址过程,此处不再赘述。此外,现有技术中的其他分组方式和/或对其的寻址方式,也适用于本公开。
对于每个缓存行来说,存在对应的数据有效标识(valid)以及数据一致性标识(dirty)。
其中,数据有效标识valid用于表示对应缓存行内的数据是否有效,且当valid使能(例如为1)时表示数据有效,当valid未使能(例如为0)时表示数据无效。
数据一致性标识dirty用于表示对应缓存行内的数据是否与下一级存储结构内的某个数据一致,且当dirty=0时表示一致,当dirty=1时表示不一致。
对于多级缓存,该下一级存储结构为当前cache的下一级cache,且多级缓存的最后一级缓存的下一级存储结构为主存;对于一级缓存,该下一级存储结构为主存,例如GDDR。
基于上述设置,在本公开实施例中,只要某个缓存行被使用,即默认其内数据有效,那么在Cache内可能存在如下三种缓存行:0)未使用的缓存行,其valid =0, dirty =0;1)已使用并且没有flush的缓存行,其valid = 1, dirty = 1;2)已使用并且已经flush出去的缓存行,其valid = 1,dirty = 0。
其中,在Cache刚上电处于初始状态时,其内的缓存行均未被使用。但随着时间推移,其内的缓存行被逐渐使用,那么未使用的缓存行会逐渐减少乃至消失,最后剩下类型1)以及类型2)两种缓存行。
为方便描述,下文将与类型1)对应的缓存行,即已使用并且没有flush的缓存行称为第一缓存行;将与类型2)对应的缓存行(已使用并且已经flush出去的缓存行)中,属于主动flush出去的缓存行称为第二缓存行。
前文提及,本公开实施例针对每个Cache组,设置对应的第一链表以及第二链表。其中,第一链表用于存储对应缓存组中与第一缓存行对应的信息,例如索引index,相应的,第二链表用于存储对应缓存组中与第二缓存行对应的信息。
第二链表中的信息所指示的第二缓存行均是由第一链表中的信息指示的第一缓存行转移而来。也就是说,第一链表所指示的第一缓存行经过主动flush操作后,若未被立即分配给写请求,则该第一缓存行将会转移成第二缓存行,并将其信息保存在第二链表中。
区别于现有技术中的在出现了未命中缓存行的写请求的情况下,CacheController才会被动地从缓存组中选择出一个目标缓存行进行flush后分配给该未命中缓存行的写请求,在本公开实施例中,Cache Controller可持续性地监测下游总线的负载情况,且在下游总线处于空闲状态下时,即使当前不存在未命中缓存行的写请求,CacheController也会从任一缓存组A对应的第一链表所指示的第一缓存行中选择一个缓存行,并对其主动执行flush操作,然后将执行完flush操作且未执行分配操作后得到的缓存行的信息保存到该任一缓存组A对应的第二链表中,进而指示一个新的第二缓存行。
上述主动对第一缓存行执行flush操作,是指将该被选中的第一缓存行内所保存的dirty = 1的内容主动复制到下一级存储结构,且并未对该第一缓存行内所保存的内容进行实质性改变。此时该第一缓存行和下一级存储结构的数据满足一致性要求,因此,需要将该第一缓存行的dirty修改为0。
经过多轮上述主动将第一缓存行 flush出去且未对主动flush出去的第一缓存行执行分配操作后,即可得到多个第二缓存行,且其信息存储在第二链表内。
基于上述配置,在本公开实施例中,对于未命中缓存行的写请求,CacheController被配置为:判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;若是,从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求;否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行flush操作后分配给所述写请求。
也就是说,在写请求未命中缓存行的情况下,Cache Controller先通过判断第二链表是否为空来确定当前是否存在既往已主动flush出去的第二缓存行。若有,那么CacheController可直接从第二缓存行中选择出一个目标缓存行分配给当前未命中缓存行的写请求;若没有,那么Cache Controller则需要从第一链表所指示的第一缓存行(由于写请求未命中缓存行,所以当前理应存在第一缓存行)中选择出目标缓存行,并对该目标缓存行执行flush操作(被动flush)后再分配给该写请求。
在一些实施方式中,可能存在Cache Controller同时接收到主动flush操作请求以及被动flush操作请求的情况,此时,被动flush操作请求的优先级高于主动flush操作请求的优先级。
在上述过程中,除了执行被动flush操作外,还会在监测到下游总线处于空闲状态时执行主动flush操作,那么可以降低被动flush操作的次数,进而可以降低或减少被动flush操作撞到下游总线繁忙的概率,进而降低或减少这笔被动flush操作的耗时,有利于提高写分配效率。此外,当出现未命中缓存行的写请求且存在第二缓存行时,由于是直接用提前已经主动flush出去的第二缓存行来满足这笔写请求的写分配(已经被主动flush出去的缓存行已处于可用状态,可以直接写入新的数据),而不必先被动flush再分配,也可提高写分配效率,进而提高Cache的使用效率。
至于本公开采用第一链表来指示第一缓存行以及采用第二链表来指示第二缓存行,且基于第一链表或第二链表来选择目标缓存行,则有利于减少硬件使用的复杂度。
下面将对Cache Controller针对未命中缓存行的写请求进行写分配的过程进行详细介绍。值得指出的是,下文中所提及到的第一链表均是指代由写请求所确定出的缓存组所对应的第一链表,下文中所提及到的第二链表均是指代由写请求所确定出的缓存组所对应的第二链表,第一缓存行均是指代对应的第一链表所指示的第一缓存行,第二缓存行均是指代对应的第二链表所指示的第二缓存行。
前文提及,在写请求确定出的缓存组对应的第二链表指示有第二缓存行的前提下,Cache Controller可从第二缓存行中选择出目标缓存行。
其中,若当前只存在一个第二缓存行,则直接选择该唯一的第二缓存行为目标缓存行。
若当前存在多个第二缓存行,在一些实施方式中,Cache Controller可从中随机选择一个第二缓存行作为目标缓存行。
在另一些实施方式中,Cache Controller可基于LRU策略,从中选择出一个最近最少使用的第二缓存行作为目标缓存行。当然,LRU策略仅作示例性说明,可以理解,本公开还可以采用其他未提及缓存行替换策略选择目标缓存行。
与从第二缓存行中选择目标缓存行类似的,当不存在对应的第二缓存行,需要从第一缓存行中选择目标缓存行时,可以是随机选择,也可以是基于LRU策略或者其他策略从中选择出一个最近最少使用的第一缓存行作为目标缓存行。
可选的,在基于LRU策略从第二缓存行选择目标缓存行的前提下,或者在不存在第二缓存行的情况下基于LRU策略从第一缓存行选择目标缓存行的前提下,本公开实施例中的每个链表(包括第一链表以及第二链表)均包括对应的多个条目(entry),且在多个entry中包括head entry(头部条目)以及tail entry(尾部条目)。对于每个链表来说,位于其链表头的entry为head entry,位于其链表尾的entry为tail entry。此外,对于每个链表来说,其尾部entry指示的缓存行表示该链表所指示的所有缓存行中最近最少使用的缓存行,其头部entry指示的缓存行表示该链表所指示的所有缓存行中最近使用的缓存行。此外,位于该链表的head entry内的信息所指示的缓存行以及位于该链表的tail entry内的信息所指示的缓存行,均随着该链表中各个缓存行的使用情况的变化而对应变化,即headentry始终指示距当前最近时刻所使用的缓存行,tail entry始终指示当前最近最少使用的缓存行。
其中,第一链表的head entry内所保存的信息指示的第一缓存行表示第一链表最近刚使用的第一缓存行,第一链表的tail entry内所保存的信息指示的第一缓存行表示第一链表最近最少使用的第一缓存行。第二链表的head entry内所保存的信息指示的第二缓存行表示第二链表最近刚使用的第二缓存行,第二链表的tail entry内所保存的信息指示的第二缓存行表示第二链表最近最少使用的第二缓存行。
基于此,Cache Controller在从第二缓存行中选择目标缓存行时,具体可被配置为:选择第二链表的tail entry保存的信息所指示的第二缓存行为目标缓存行。
Cache Controller在第一缓存行中选择目标缓存行时,具体可被配置为:选择第一链表的tail entry保存的信息所指示的第一缓存行为目标缓存行。
当然,当某个第二缓存行被选为目标缓存行,且将其分配给写请求,若CacheController确定已针对该目标缓存行执行完写操作,即该目标缓存行内被写入了与写请求对应的数据后,该目标缓存行内所保存的数据对于下一级存储结构来说,是全新且有效的数据,无法满足一致性要求,因此,Cache Controller需要将该目标缓存行的valid设置为1且dirty设置为1,此外,Cache Controller还需要将该目标缓存行的信息从第二链表的tail entry中删除,以及将用于指示该目标缓存行的信息重新***到第一链表的headentry。
相应的,Cache Controller可被配置为:在确定目标缓存行内写入与写请求对应的数据(例如在dirty从0变为1)后,将用于指示所述目标缓存行的信息***第一链表的head entry。当然,在将指示目标缓存行的信息***第一链表后,意味着该目标缓存行重新成为第一缓存行,所以Cache Controller还需要删除位于第二链表的tail entry中的与该目标缓存行对应的信息。
在一些实施方式下,Cache Controller还被配置为:在每个时钟周期监测下游总线的负载情况;在所述负载情况表示所述下游总线处于所述空闲状态时,对保存在所述第一链表的tail entry内的信息所指示的第一缓存行主动执行flush操作;将执行完flush操作后的第一缓存行的信息从第一链表的tail entry中删除,并将执行完flush操作后的第一缓存行的信息***到第二链表的head entry,该信息用于指示新的第二缓存行。
在现有技术中,当针对某个缓存行执行flush操作后,会将其valid置为无效,以方便后续为其进行写分配。
而在本公开实施例中,由于在对从第一缓存行中选出的目标缓存行主动执行完flush操作后,该目标缓存行不一定会立即分配给写请求,所以位于该目标缓存行内的数据还未被替换,依旧处于有效状态且可被直接访问,所以在本公开实施例中,在每指示一个新的第二缓存行之后,Cache Controller还被配置为:将该新指示的第二缓存行的valid置为使能,例如将valid置为1,以方便后续有读请求命中该第二缓存行时可直接访问该第二缓存行中的有效数据。
相应的,在本公开另一些实施方式中,Cache Controller还被配置为:在确定读请求命中任一第二链表保存信息所指示的第二缓存行的情况下,将命中的第二缓存行中保存的数据返回给所述读请求的发起者,例如GPU Core。
当然,由于该被读请求命中的第二缓存行属于Cache内近期被使用过的缓存行,所以为了保证后续从第二链表的tail entry保存的信息所指示的第二缓存行满足LRU策略,还应该将用于指示该被读请求命中的第二缓存行的信息挪动到第二链表的head entry。
下面将针对监测下游总线的负载情况进行介绍。
对于下游主存,例如DDR,其主存控制器(DDR Controller)内设置有命令队列(Command FIFO)。
对于DDR,如果Command FIFO为空,则此时发给Controller的传输请求会被立即接收并快速发给DDR颗粒,如果Command FIFO为满,则此时发给Controller的传输请求无法被接收,会出现等待。如果Command FIFO在空满之间,则这笔传输会被DDR控制器接收,但需要等待一定时长才会发给DDR颗粒。
基于此,在一些实施方式中,下游主存的主存控制器,可在每个时钟周期内检测主存控制器内的命令队列的命令个数(size)或者剩余可容纳命令个数(remain_size),并将其上报给Cache Controller。
相应的,Cache Controller被配置为:在监测到命令个数小于命令个数阈值,或者在remain_size大于零的情况下,确定下游总线处于空闲状态。
在另一些实施方式中,DDR Controller可将用于表示Command FIFO的空满信号(empty/full)以及Command FIFO的remain_size定期上报给Cache Controller。而CacheController则根据这些信息确定下游总线是否处于空闲状态,以及在下游总线处于空闲状态下,再结合第一链表中的第一缓存行的数量确定是否执行主动flush操作。
例如,如果command FIFO为空,则只要第一链表中有第一缓存行,则执行主动flush操作;如果command FIFO非空,但有剩余空间(remain_size>0),则第一链表中第一缓存行的数量大于一定阈值(例如4,可由寄存器配置)时开始主动执行flush操作。
此外,由于AXI总线的有效号为高,表示有数据在传输,AXI总线的有效号为低则表示没有数据在传输。基于此,在另一些实施方式中,Cache Controller还可以被配置为:监测AXI总线的有效信号;在所述有效信号在预设时间内持续为低的情况下,确定下游总线处于空闲状态。该预设时间可由寄存器进行配置。
传统的链表一般基于计数器或者查表手段来实现,存在硬件代价较大的问题。
为了降低硬件代价,在本公开实施例中,基于寄存器来实现上述针对链表(包括第一链表以及第二链表)的***、命中以及删除操作。可以理解,针对同一cache,不同的链表(包括不同的第一链表、不同的第二链表以及第一链表与第二链表)只是内部所存储的信息存在区别,其实现方法基本相同,因此,下面将以第一链表为例,对各个第一链表以及第二链表的实现过程进行介绍,若是未提及到第二链表之处,均可参照第一链表的实现方式进行实现。
可选的,在本公开实施例中,针对每个链表,使用多个bit(位)来表示其所能表示的缓存行的个数,且该多个bit所表示的数值范围需要覆盖该链表所能表示的每个缓存行的编号。
例如针对组相连cache(16路/64组),表示将同一块cache分成64个组,以及在每个组中包括16个缓存行。那么针对该cache,存在与每个组一一对应的第一链表以及与每个组一一对应的第二链表。在每个第一链表以及第二链表中最多可存储16个缓存行的信息,所以每个第一链表以及第二链表均存在16个entry。
在这种具体的实施方式下,针对每个第一链表,使用4bit(24=16)来表示其所能表示的缓存行的编号,分别为cacheline0~cacheline15。
针对同一个第一链表,定义好第一链表所能表示的缓存行的编号后,设置对应的第一寄存器来表示head entry(头部条目)所指向的cacheline的编号,设置对应的第二寄存器来表示tail entry(尾部条目)所指向的cacheline的编号,以及设置对应的第三寄存器(list_num)来记录对应第一链表中当前所保存的有效编号的数量。
如果第三寄存器的值=0表示该第一链表为空,针对16路/64组的cache,如果第三寄存器的值=16,则表示该第一链表cache full,需要先flush一个cacheline出去后再做分配。
当然,上述第一寄存器、第一寄存器以及第三寄存器的位数所能表示的数值范围,同样需要覆盖对应第一链表所能表示的每个缓存行的编号。例如针对16路/64组的cache,第一寄存器与第二寄存器可采用4bit寄存器,第三寄存器可采用5bit寄存器。
在完成上述配置后,针对该第一链表,还需要设置一个有N个寄存器的二维数组(list_array),N等于该二维数组所能包括的最多元素的个数,即N个寄存器中的每个寄存器用于表示一个元素,但在不同时刻,同一寄存器所表示的元素可能不同。
值得指出的是,该二维数组所能包括的最多元素的个数等于对应第一链表所能表示的最多缓存行的个数。例如针对16路/64组的cache,对应第一链表最多能保存16个缓存行的信息(在本公开实施例中,该信息一般指的是cacheline的编号,即索引index),即所能表示的最多缓存行的个数为16,那么N=16。
与二维坐标类似的,该二维数组中的每个元素包括两部分,表示为(x,y)。x表示该元素所表示的缓存行的编号,y表示当前缓存行的编号指向的前一个缓存行的编号(以下某些位置简称为当前编号指向的前一个编号)以及当前缓存行的编号指向的后一个缓存行的编号(以下某些位置简称为当前编号指向的后一个编号)。
为了实现y的多向指代,在一些实施方式中,y一般占2M bit(M为正偶数,且2M=N),其中高M bit表示当前编号指向的前一个编号,低M bit表示当前编号指向的后一个编号;或者高M bit表示当前编号指向的后一个编号,低M bit表示当前编号指向的前一个编号。
以N=16,高M bit表示当前编号指向的前一个编号,低M bit表示当前编号指向的后一个编号为例,M=4,y占8bit,高4bit([7:4])表示当前编号指向的前一个编号,低4bit([3:0])表示当前编号指向的后一个编号。
下面将以N=16,M=4为例,对后续实施例进行介绍。可以理解,M与N为其他数值时,其实现方式可参照本实施例进行适应调整。
对于第一链表以及第二链表,主要的操作包括***(insert),命中(hit)和删除(delete)。
其中,***(insert)主要包括两种情况,分别为:1)写请求miss后,从第二链表指示的第二缓存行中分配一个目标缓存行给该写请求,并往该目标缓存行内写入数据,此时需要将该目标缓存行的编号***到第一链表的head entry;2)主动针对第一链表指示的第一缓存行执行完flush操作后,将主动flush后的第一缓存行的编号***到第二链表的headentry,指示新的第二缓存行。
命中(hit)是在cacheline hit的情况下,将命中的cacheline的编号挪到链表的head entry,同时将该cacheline的编号与当前head entry前后的entry所保存的cacheline的编号连起来。此处的命中,包括:读请求命中第一链表指示的第一缓存行(valid = 1,dirty = 0)或第二链表指示的第二缓存行(valid = 1,dirty = 0),此时需要将命中的缓存行的编号挪动至该缓存行当前所对应的链表的head entry。
删除(delete)是指在主动或被动flush后,将对应链表的tail entry内的编号删除的操作,或者在将第二链表指示的目标缓存行分配后写请求,并往该目标缓存行内写入数据后,将位于该第二链表的tail entry内指示的该目标缓存行的编号删除。
***上电后或cache复位后,表示head entry所指向的cacheline的编号第一寄存器的值以及表示tail entry所指向的cacheline的编号第二寄存器的值都为0,第三寄存器list_count的值也为0,表示当前链表为空;对应list_array每个元素的值都为0。后续,每次有insert操作,则list_count加1;每次有delete操作,则list_count减1;针对读请求的hit操作不影响list_count,其值保持不变。
insert和hit操作将影响head entry,每次有insert或hit操作时,第一寄存器的值都指向对应的缓存行的index,即二维数组中第一个元素的x;两者区别是,insert是在原head entry位置***一个新的编号,而hit是将已有的编号从其它位置调整到head entry处。
delete只影响tail entry,将第二寄存器的值指向当前tail entry的缓存行的编号的前一个编号。
下面将举例说明insert/delete/hit的具体操作。
假设初始状态下,第一寄存器(head) = 4’h0,第二寄存器(tail) = 4’h0,list_count = 5’h0;前面的4或5表示寄存器的位宽,即多少位的二进制数据,“’h”表示十六进制。
在链表中,关注的信息一般是head和tail的值。而对于head来说,其对应的二维数组的高四位表示链表头的前一个缓存行,没有实际意义,因为对于第一个缓存行,hit/delete不需要任何操作,insert是在这个缓存行之前***,位于原来head的缓存行的二维数组会把高四位修改为***的index,而不会用原来head的高四位做寻址。同理,对于tail来说,其对应的二维数组的低四位是没有意义的。基于此,初始状态下,head = 4’h0以及tail = 4’h0也不会与index=0的 cacheline存在混淆。
情况1):假设当前来了一笔insert操作,对应的index=5,如图2A所示,则此时当前head = 4’h5且tail = 4’h5,表示当前链表的head entry和tail entry均指示index为5的缓存行。对于二维数组的第一个元素,x=5,y=8’h00,对应于y的高4bit=4’h0,y的低4bit=4’h0,指示当前index为5的缓存行的前一个缓存行为空,且后一个缓存行也为空,list_count= 5’h1,表示当前有1个有效的缓存行。
情况2):假设又来了一笔insert操作,对应的index=8,如图2B所示,则此时head =4’h8,tail = 4’h5,表示当前链表的head entry指示index为8的缓存行,当前链表的tailentry指示index为5的缓存行。对于二维数组的第一个元素,x=8,y=8’h05,对应于y的高4bit=4’h0,y的低4bit=4’h5,指示当前index为8的缓存行的前一个缓存行为空,且后一个缓存行的index为5;对于二维数组的第二个元素,x=5,y=8’h80,对应于y的高4bit=4’h8,y的低4bit=4’h0,指示当前index为5的缓存行的前一个缓存行的index为8,且后一个缓存行为空。此时list_count = 5’h2,表示当前有2个有效的缓存行。
这里涉及如下几个操作:a)head的值变为4’h8;tail的值不变;b)二维数组x=index 8的值从默认的8’h00变为8’h05,因为是insert操作,所以只需要改变y的低四位指向的后面编号的值,即把原head的值放到y的低4位即可;c)二维数组x=index 5的值变为8’h80,因为是在index 5前面***,所以需要改变index 5的y的高四位指向的前面编号的值,即将insert指定的值放到y的高4位即可。
情况3):假设再来一笔insert操作,对应的index = 12,如图2C所示,则此时head的值为12,即head=4’hc,tail =4’h5,表示当前链表的head entry指示index为12的缓存行,当前链表的tail entry指示index为5的缓存行。对于二维数组的第一个元素,x=12,y=8’h08,对应于y的高4bit=4’h0,y的低4bit=4’h8,指示当前index为12的缓存行的前一个缓存行为空,且后一个缓存行的index为8;对于二维数组的第二个元素,x=8,y=8’hc5,对应于y的高4bit=4’hc,y的低4bit=4’h5,指示当前index为8的缓存行的前一个缓存行的index为12,且后一个缓存行的index为5;对于二维数组的第三个元素,x=5,y=8’h80,对应于y的高4bit=4’h8,y的低4bit=4’h0,指示当前index为5的缓存行的前一个缓存行的index为8,且后一个缓存行的index为空。此时list_count =5’h 3,表示当前有3个有效的缓存行。情况3)的具体操作和情况2)类似,此处不再赘述。
情况4):再来一笔hit操作,对应的index = 5,如图2D所示,则此时head =4’h5,tail =4’h8,表示当前链表的head entry指示index为5的缓存行,当前链表的tail entry指示index为8的缓存行。对于二维数组的第一个元素,x=5,y=8’h0c,对应于y的高4bit=4’h0,y的低4bit=4’hc,指示当前index为5的缓存行的前一个缓存行为空,且后一个缓存行的index为12;对于二维数组的第二个元素,x=12,y=8’h58,对应于y的高4bit=4’h5,y的低4bit=4’h8,指示当前index为12的缓存行的前一个缓存行的index为5,且后一个缓存行的index为8;对于二维数组的第三个元素,x=8,y=8’hc0,对应于y的高4bit=4’hc,y的低4bit=4’h0,指示当前index为8的缓存行的前一个缓存行的index为12,且后一个缓存行的index为空。此时由于是hit操作,list_count保持不变,还是为5’h3,表示当前有3个有效的缓存行。
这里涉及如下几个操作:a)head的值变为4’h5;tail的值变为4’h8;b)二维数组x=index 5的值从情况3)的8’h80变为8’h0c,hit操作导致当前编号挪到head entry的位置,指向前面编号的高4位清0,指向下一个编号的低4位变为原head的值;c)二维数组x=index12的值从原来的8’h08变为8’h58,因为是在index 12之前***的,所以指向前面编号的高4位变为hit对应的index值;d)二维数组x=index 8的值从原来的8’hc5变为8’hc0,x=index8现在变为tail entry的值,表示指向下一个编号的低4位清0。
情况5):再来一笔delete操作,对应的index = 8,如图2E所示,则此时head =4’h5, tail =4’hc,表示当前链表的head entry指示index为5的缓存行,当前链表的tailentry指示index为12的缓存行。对于二维数组的第一个元素,x=5,y=8’h0c,对应于y的高4bit=4’h0,y的低4bit=4’hc,指示当前index为5的缓存行的前一个缓存行为空,且后一个缓存行的index为12;对于二维数组的第二个元素,x=12,y=8’h50,对应于y的高4bit=4’h5,y的低4bit=4’h0,指示当前index为12的缓存行的前一个缓存行的index为5,且后一个缓存行为空。其中,如果出现delete操作,则一定是删除链表的尾部的tail entry所保存的编号,删除操作完成后, list_count减1,变为2,表示当前有2个有效的缓存行。
上述用于实现链表操作的好处包括:1)每笔操作执行速度快,都在1个时钟周期内完成;2)接口友好,如果要主动或被动flush,根据tail的值即可知道要flush哪个cacheline。
当然,值得指出的是,对于同一个cacheline来说,索引是其物理属性,始终不会改变。
此外,基于类似的发明构思,本公开实施例还提供一种写分配方法,应用于缓存***中的缓存控制器。缓存***包括缓存控制器以及缓存,所述缓存包括多个缓存组,每个缓存组存在对应的第一链表以及第二链表,且每个缓存组包括多个缓存行。
请参照图3,该方法包括以下步骤。
步骤S110:对于未命中缓存行的写请求,判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;
步骤S120:若是,从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求。
步骤S130:否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行冲刷flush操作后分配给所述写请求。
所述第一链表指示的第一缓存行表示:所述缓存组包括的所有缓存行中处于已使用且未被flush的缓存行;所述第二链表指示的第二缓存行表示:在下游总线处于空闲状态下,对所述第一缓存行执行flush操作且未执行分配操作后对应的缓存行。
本公开一种可行的实现方式中,所述第一链表与所述第二链表均包括多个条目entry,且每个链表的尾部entry指示的缓存行表示该链表所指示的所有缓存行中最近最少使用的缓存行;所述从所述第二链表指示的第二缓存行中选择目标缓存行,包括:选择所述第二链表的尾部entry保存的信息所指示的第二缓存行,所述选择的第二缓存行为所述目标缓存行;以及;
从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,包括:选择所述第一链表的尾部entry保存的信息所指示的第一缓存行,所述选择的第一缓存行为所述目标缓存行。
本公开一种可行的实现方式中,在所述分配给所述写请求后,所述方法还包括:每个链表的头部entry指示的缓存行表示该链表所指示的所有缓存行中当前最近使用过的缓存行,在确定所述目标缓存行内写入与所述写请求对应的数据后,将用于指示所述目标缓存行的信息***所述第一链表的头部entry。
本公开一种可行的实现方式中,所述方法还包括:在每个时钟周期监测下游总线的负载情况;在所述负载情况表示所述下游总线处于所述空闲状态时,对保存在所述第一链表的尾部entry内的信息所指示的第一缓存行执行所述flush操作;将执行完所述flush操作后的第一缓存行的信息从所述第一链表的尾部entry中删除,并将执行完所述flush操作后的第一缓存行的信息***所述第二链表的头部entry,以指示新的第二缓存行。
本公开一种可行的实现方式中,每个缓存行存在对应的数据有效标识,所述数据有效标识使能时表示对应缓存行中保存的数据有效;对所述缓存行执行所述flush操作后,位于所述缓存行内的数据保持不变;所述方法还包括:将每个未被分配的所述第二缓存行的数据有效标识置为使能。
本公开一种可行的实现方式中,所述方法还包括:在确定读请求命中所述第二缓存行的情况下,将命中的第二缓存行中保存的数据返回给所述读请求的发起者,并将用于指示所述命中的第二缓存行的信息挪动到所述第二链表的头部entry。
本公开一种可行的实现方式中,所述监测下游总线的负载情况,包括:监测主存控制器内的命令队列内的命令个数;在所述命令个数小于命令个数阈值的情况下,确定所述下游总线处于所述空闲状态。
本公开一种可行的实现方式中,所述监测下游总线的负载情况,包括:监测AXI总线的有效信号;在所述有效信号在预设时间内持续为低的情况下,确定所述下游总线处于所述空闲状态。
此外,本公开实施例还提供一种SOC,该SOC包括上述任一实施例中的缓存***。在一些使用场景下,该SOC的产品形式体现为GPU(Graphics Processing Unit,图形处理器)SOC;在另一些使用场景下,该SOC的产品形式体现为CPU(Central Processing Unit,中央处理器) SOC。
此外,本公开实施例还提供一种电子组件,该电子组件包括上述任一实施例中所述的SOC。在一些使用场景下,该电子组件的产品形式体现为显卡;在另一些使用场景下,该电子组件的产品形式体现为CPU主板。
此外,本公开实施例还提供一种电子设备,该电子设备包括上述的电子组件。在一些使用场景下,该电子设备的产品形式是便携式电子设备,例如智能手机、平板电脑、VR设备等;在一些使用场景下,该电子设备的产品形式是个人电脑、游戏主机、工作站、服务器等。
尽管已描述了本公开的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本公开范围的所有变更和修改。
显然,本领域的技术人员可以对本公开进行各种改动和变型而不脱离本公开的精神和范围。这样,倘若本公开的这些修改和变型属于本公开权利要求及其等同技术的范围之内,则本公开也意图包含这些改动和变型在内。

Claims (17)

1.一种写分配方法,包括:
对于未命中缓存行的写请求,判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;
若是,从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求;否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行冲刷flush操作后分配给所述写请求;
所述第一链表指示的第一缓存行表示:所述缓存组包括的所有缓存行中处于已使用且未被flush的缓存行;所述第二链表指示的第二缓存行表示:在下游总线处于空闲状态下,对所述第一缓存行执行flush操作且未执行分配操作后的缓存行。
2.根据权利要求1所述的写分配方法,所述第一链表与所述第二链表均包括多个条目entry,且每个链表的尾部entry指示的缓存行表示该链表所指示的所有缓存行中最近最少使用的缓存行;
所述从所述第二链表指示的第二缓存行中选择目标缓存行,包括:选择所述第二链表的尾部entry保存的信息所指示的第二缓存行,所述选择的第二缓存行为所述目标缓存行;以及;
从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,包括:选择所述第一链表的尾部entry保存的信息所指示的第一缓存行,所述选择的第一缓存行为所述目标缓存行。
3.根据权利要求2所述的写分配方法,每个链表的头部entry指示的缓存行表示该链表所指示的所有缓存行中距当前最近时刻使用过的缓存行,在所述分配给所述写请求后,所述方法还包括:
在确定所述目标缓存行内写入与所述写请求对应的数据后,将用于指示所述目标缓存行的信息***所述第一链表的头部entry。
4.根据权利要求2所述的写分配方法,所述方法还包括:
在每个时钟周期监测下游总线的负载情况;
在所述负载情况表示所述下游总线处于所述空闲状态时,对保存在所述第一链表的尾部entry内的信息所指示的第一缓存行执行所述flush操作;
将执行完所述flush操作后的第一缓存行的信息从所述第一链表的尾部entry中删除,并将执行完所述flush操作后的第一缓存行的信息***所述第二链表的头部entry,指示新的第二缓存行。
5.根据权利要求1-4任一所述的写分配方法,每个缓存行存在对应的数据有效标识,所述数据有效标识使能时表示对应缓存行中保存的数据有效;对所述缓存行执行所述flush操作后,位于所述缓存行内的数据保持不变;所述方法还包括:
将每个未被分配的所述第二缓存行的数据有效标识置为使能。
6.根据权利要求5所述的写分配方法,所述方法还包括:
在确定读请求命中所述第二缓存行的情况下,将命中的第二缓存行中保存的数据返回给所述读请求的发起者,并将用于指示所述命中的第二缓存行的信息挪动到所述第二链表的头部entry。
7.根据权利要求4所述的写分配方法,所述监测下游总线的负载情况,包括:
监测主存控制器内的命令队列内的命令个数;
在所述命令个数小于命令个数阈值的情况下,确定所述下游总线处于所述空闲状态。
8.根据权利要求4所述的写分配方法,所述监测下游总线的负载情况,包括:
监测AXI总线的有效信号;
在所述有效信号在预设时间内持续为低的情况下,确定所述下游总线处于所述空闲状态。
9.一种缓存***,包括缓存控制器以及缓存,所述缓存包括多个缓存组,每个缓存组存在对应的第一链表以及第二链表,且每个缓存组包括多个缓存行;
对于未命中缓存行的写请求,所述缓存控制器被配置为:对于未命中缓存行的写请求,判断由所述写请求确定出的缓存组对应的第二链表是否指示有第二缓存行;若是则从所述第二链表指示的第二缓存行中选择目标缓存行分配给所述写请求;否则从与所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行,并对所述目标缓存行执行冲刷flush操作后分配给所述写请求;
所述第一链表指示的第一缓存行表示:所述缓存组包括的所有缓存行中处于已使用且未被flush的缓存行;所述第二链表指示的第二缓存行表示:在下游总线处于空闲状态下,对所述第一缓存行执行flush操作且未执行分配操作后的缓存行。
10.根据权利要求9所述的缓存***,所述第一链表与所述第二链表均包括多个条目entry,且每个链表的尾部entry指示的缓存行表示该链表所指示的所有缓存行中最近最少使用的缓存行;所述缓存控制器从所述第二链表指示的第二缓存行中选择目标缓存行的情况下,具体被配置为:选择所述第二链表的尾部entry保存的信息所指示的第二缓存行,所述选择的第二缓存行为所述目标缓存行;
以及所述缓存控制器从所述缓存组对应的第一链表指示的第一缓存行中选择目标缓存行的情况下,具体被配置为:选择所述第一链表的尾部entry保存的信息所指示的第一缓存行,所述选择的第一缓存行为所述目标缓存行。
11.根据权利要求10所述的缓存***,每个链表的头部entry指示的缓存行表示该链表所指示的所有缓存行中距当前最近时刻使用过的缓存行,所述缓存控制器还被配置为:在确定所述目标缓存行内写入与所述写请求对应的数据后,将用于指示所述目标缓存行的信息***所述第一链表的头部entry。
12.根据权利要求10所述的缓存***,所述缓存控制器还被配置为:在每个时钟周期监测下游总线的负载情况;在所述负载情况表示所述下游总线处于所述空闲状态时,对保存在所述第一链表的尾部entry内的信息所指示的第一缓存行执行所述flush操作;将执行完所述flush操作后的第一缓存行的信息从所述第一链表的尾部entry中删除,并将执行完所述flush操作后的第一缓存行的信息***所述第二链表的头部entry,指示新的第二缓存行。
13.根据权利要求9-12任一所述的缓存***,每个缓存行存在对应的数据有效标识,所述数据有效标识使能时表示对应缓存行中保存的数据有效;对所述缓存行执行所述flush操作后,位于所述缓存行内的数据保持不变;所述缓存控制器还被配置为:将每个未被分配的所述第二缓存行的数据有效标识置为使能。
14.根据权利要求13所述的缓存***,所述缓存控制器还被配置为:在确定读请求命中所述第二缓存行的情况下,将命中的第二缓存行中保存的数据返回给所述读请求的发起者,并将用于指示所述命中的第二缓存行的信息挪动到所述第二链表的头部entry。
15.一种片上***,包括权利要求9-14任一所述的缓存***。
16.一种电子组件,包括权利要求15所述的片上***。
17.一种电子设备,包括权利要求16所述的电子组件。
CN202311055542.4A 2023-08-22 2023-08-22 写分配方法、缓存***、片上***、电子组件及电子设备 Active CN116775560B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311055542.4A CN116775560B (zh) 2023-08-22 2023-08-22 写分配方法、缓存***、片上***、电子组件及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311055542.4A CN116775560B (zh) 2023-08-22 2023-08-22 写分配方法、缓存***、片上***、电子组件及电子设备

Publications (2)

Publication Number Publication Date
CN116775560A CN116775560A (zh) 2023-09-19
CN116775560B true CN116775560B (zh) 2023-12-19

Family

ID=87986280

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311055542.4A Active CN116775560B (zh) 2023-08-22 2023-08-22 写分配方法、缓存***、片上***、电子组件及电子设备

Country Status (1)

Country Link
CN (1) CN116775560B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6467025B1 (en) * 1999-03-11 2002-10-15 International Business Machines Corporation Cache memory system and method utilizing doubly-linked loop of cache lines and a single pointer to address a cache line in the doubly-linked loop
CN115794673A (zh) * 2023-01-19 2023-03-14 北京象帝先计算技术有限公司 ***级芯片non-Cacheable数据的访问方法、装置及电子设备

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20160283379A1 (en) * 2015-03-27 2016-09-29 Avago Technologies General Ip (Singapore) Pte. Ltd. Cache flushing utilizing linked lists
US11556478B2 (en) * 2020-10-30 2023-01-17 Hewlett Packard Enterprise Development Lp Dirty cache line write-back tracking

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6467025B1 (en) * 1999-03-11 2002-10-15 International Business Machines Corporation Cache memory system and method utilizing doubly-linked loop of cache lines and a single pointer to address a cache line in the doubly-linked loop
CN115794673A (zh) * 2023-01-19 2023-03-14 北京象帝先计算技术有限公司 ***级芯片non-Cacheable数据的访问方法、装置及电子设备

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Efficient Cache Design for Solid-State Drives;Miaoqing Huang 等;Proceedings of the 7th ACM international conference on Computing frontiers;41-50 *
一种可动态配置的分布式内存池缓存一致性机制;段卓辉 等;计算机研究与发展;第60卷(第9期);1960−1972 *

Also Published As

Publication number Publication date
CN116775560A (zh) 2023-09-19

Similar Documents

Publication Publication Date Title
CN113424160B (zh) 一种处理方法、装置及相关设备
US8677071B2 (en) Control of processor cache memory occupancy
CN104346294B (zh) 基于多级缓存的数据读/写方法、装置和计算机***
CN107526546B (zh) 一种Spark分布式计算数据处理方法及***
CN102968386B (zh) 数据供给设备、缓存设备及数据供给方法
CN110297787B (zh) I/o设备访问内存的方法、装置及设备
CN104809076A (zh) Cache的管理方法及装置
CN113641596B (zh) 缓存管理方法、缓存管理装置、处理器
CN113039531B (zh) 用于分配缓存资源的方法、***和存储介质
WO2024045586A1 (zh) 支持simt架构的高速缓冲存储器及相应处理器
CN113760787A (zh) 多级高速缓存数据推送***、方法、设备和计算机介质
CN117389914B (zh) 缓存***、缓存写回方法、片上***及电子设备
CN115357196A (zh) 动态可扩展的组相联高速缓存方法、装置、设备及介质
CN117609314A (zh) 一种缓存数据处理方法、缓存控制器、芯片及电子设备
CN103885890B (zh) 高速缓冲存储器cache中cache块的替换处理方法和装置
US10042773B2 (en) Advance cache allocator
CN109478164A (zh) 用于存储用于高速缓存条目传输的高速缓存位置信息的***和方法
CN116257191B (zh) 存储器的控制器、组件、电子设备及命令调度方法
CN116775560B (zh) 写分配方法、缓存***、片上***、电子组件及电子设备
US20070101064A1 (en) Cache controller and method
CN115586943A (zh) 一种智能网卡虚拟机脏页的硬件标记实现方法
CN111694777B (zh) 基于PCIe接口的DMA传输方法
CN113093994A (zh) 一种数据处理方法及装置
US11520706B2 (en) Dram-aware caching
CN113918483B (zh) 一种多主设备缓存控制方法及***

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant