一种缓存数字电路处理请求冲突的方法与流程

文档序号:25480581发布日期:2021-06-15 21:39阅读:161来源:国知局
一种缓存数字电路处理请求冲突的方法与流程

本发明涉及计算机科学领域,具体为一种缓存数字电路处理请求冲突的方法。



背景技术:

缓存控制器数字电路的一般流程包括以下几个步骤:

首先,新的缓存请求通过读取缓存查找表(tlb)来判断当前请求的地址是否命中缓存,以及该请求地址的缓存状态(无效invalid,干净clean,脏dirty)等,并且判断是否与先前还未完成的缓存请求存在请求冲突,冲突若发生则需要做冲突处理。

主要的冲突可以分为几类,包括数据冲突、硬件资源冲突、结构冲突等等,其中:

数据冲突指的是当前请求想要访问的地址数据正在被先前的请求操作,比如先前的请求正在对该地址数据做一个因为未命中而引发的下一级存储器读操作还未完成,或者对该地址数据做一个踢出到下一级存储器的写操作等;

硬件资源冲突指的是当前请求想要占用的缓存地址空间(记为{set*,way*})也正在被先前的请求操作,比如先前的请求正在对同一个缓存地址空间{set*,way*}进行无效操作等;

缓存的结构冲突指的是硬件设计造成的冲突,比如背靠背的请求要访问同一查找表的同一行内容,数字设计导致了读取查找表到完成更新查找表需要多个时钟周期才能完成,而背靠背的下一个时钟周期的请求无法立刻得到同一行最终的更新内容,即与前面的访问请求发生了结构冲突。

当各类冲突发生后,常用的处理方法包括请求阻塞,创建重试请求队列等。然后,当请求没有冲突时,则可以继续进行后续操作,比如没有命中的读缓存请求需要从下级存储器中读取对应地址的数据,写到缓存中,并将该数据返回给上游。对于命中的读写缓存请求则直接对缓存进行读写操作,在操作完成后,发送对应的响应给到上游等。

最后缓存查找表要根据最新的情况进行状态更新,比如一个未命中的读请求从下级存储器中读取数据并已经缓存在了某缓存地址中,则需要在查找表对应行更新该地址的标签,并把查找表该标签的状态更新成clean;比如一个命中标签,且状态是clean的写请求,已经覆盖了缓存原来的数据,则需要把查找表该标签的状态更新成dirty等。

现有的缓存数字电路处理请求冲突的方式在冲突处理效率方面还有待提高。



技术实现要素:

本发明的技术目的是对现有技术做出改进,提供了一种新型的缓存数字电路处理请求冲突的方法,以满足缓存高效访问的需求。

本发明实现上述技术目的的方案为:

一种缓存数字电路处理请求冲突的方法,其特征在于,包括:

建立操作队列机制,在新的请求完成对缓存查找表信息的读取后,使该请求进入操作队列,并为其分配一个操作队列条目,无论该请求的目标访问地址是否与在先请求发生冲突,在该请求进入到操作队列中之后,直接将所述缓存查找表的信息更新为该请求完成的状态。

在上述方案的基础上,进一步改进或优选的方式还包括:

进一步的,在所述新的请求读取缓存查找表信息的同时,和之前已经分配的,处于有效状态的所有操作队列条目的信息进行比较,以确认当前请求是否和在先请求发生访问冲突,并在给当前请求分配操作队列条目时,将当前请求的所有冲突状态记录在该条目的冲突信息中;

在先的冲突请求的操作队列条目为冲突条目,每一个操作队列条目都有一个状态机与之对应,状态机负责完成请求的操作,条目被分配后,与该条目对应的状态机从不工作状态进入等待状态,该条目同时监听所有冲突条目信息,当监听到任一冲突条目被释放后,更新自身的冲突条目信息,当所有冲突条目均被释放时,其对应的状态机跳出等待状态开始后续操作。

进一步的,所述操作队列条目记录的信息包括:请求的访问地址,请求的类型,请求的缓存策略,请求的访问查找表结果,以及所述冲突条目信息。

进一步的,所有操作队列条目的状态机并行运行,条目被分配后,所有状态机的操作请求按照所需的硬件资源类型分开进行仲裁。

进一步的,所述冲突信息通过十六进制编号的形式呈现,记为pending_opqid;

在当前请求无在先的冲突请求时,将其pending_opqid记为0x0;

在当前请求的在先冲突请求为n个时,n≥1,则利用one-hot编码的n位状态寄存器对该请求的n个冲突状态进行编码,冲突发生记为1,否则记为0,得到一个二进制向量,之后将所述二进制向量转换为十六进制的字符,作为当前请求的pending_opqid编号。

进一步的,在监听的任一冲突条目被释放时,pending_opqid将与所述冲突条目对应的状态寄存器编码由1更新为0,基于进制转换得到编号则发生对应的变化,在所述编号归零后,表示当前请求的冲突条目全部被释放。

有益效果:

1)本发明方法,相比一般含有重发请求的缓存设计,任何请求无论是否冲突都只访问一次查找表,提高了请求的吞吐率,提高了请求访问的效率。

2)在进一步的技术方案中,本发明该方法,相比一般读取查找表内容来判断冲突是否解除的缓存设计,发生冲突的请求在冲突解除后,立刻就可以重新启动,减少了平均访问完成时间,提高了请求访问的效率。

3)在进一步的技术方案中,本发明方法,采用独立状态机,并对各类硬件资源独立仲裁,请求可并行操作各种硬件资源,降低了冲突释放后重新启动的请求与其他请求发生硬件访问仲裁的可能性,如重试请求要读取缓存,而新请求是要写下一级存储空间,则可以并行进行,提高了请求访问效率。

附图说明

图1为一般缓存数字电路处理请求冲突方法的流程图;

图2为本发明缓存数字电路处理请求冲突方法的流程图;

图3为本发明一具体实施例的框架示意图;

图4为请求a和请求b进入操作队列后的情况示意图;

图5为初始状态下,各请求在电路中的情况示意图;

图6为各请求的pending关系示意图;

图7为操作执行过程中,请求d/e/f的pending关系示意图;

图8为请求g来了之后的执行流程示意图。

具体实施方式

图2所示为本发明缓存数字电路处理请求冲突方法的一流程示例。

本发明方法的核心特点在于,建立操作队列机制,在新的请求完成对缓存查找表信息的读取后,使该请求进入操作队列,并为其分配一个操作队列条目,无论该请求的目标访问地址与在先请求是否发生冲突,在该请求进入到操作队列中之后,直接将所述缓存查找表的信息更新为该请求完成的状态。

比如一个读请求没有命中缓存,需要从查找表原来状态是“dirty”的缓存行中踢出,并且因未命中而需要从下一层存储读取数据,这些操作信息都被记录在了操作队列对应条目中,在这些操作都没有完成前,直接将原本的查找表信息,更新为这个读请求完成的状态,即缓存行标签更新为读请求的地址,把缓存行状态更新为“clean”。无论请求是否冲突需要等待,直接更新缓存查找表为请求执行完成的最终状态,使得所有请求只需访问一次查找表。

在所述新的请求读取缓存查找表信息的同时,和之前已经分配的,处于有效状态的所有操作队列条目的信息进行比较,以确认当前请求是否和在先请求发生访问冲突。并在给当前请求分配操作队列条目时,将当前请求的所有冲突状态记录在该条目的冲突信息中。

所述操作队列条目记录的信息包括:请求的访问地址,请求的类型(读、写等),请求的缓存策略(是否不需要缓存,是否写穿等),请求的访问查找表结果是否命中,命中的状态,若未命中,分配的缓存地址是什么,是否需要evcit,需要evict的地址等,以及所述冲突条目信息。

每一个操作队列条目都有一个状态机与之对应,条目被分配后,与该条目对应的状态机从不工作状态进入等待状态,该条目同时监听所有冲突条目的信息,当监听到任一冲突条目被释放(冲突解除)后,更新自身条目的冲突条目信息,当自身的冲突条目全部被释放时,其对应的状态机跳出等待状态开始后续操作。

状态机负责完成请求接下去所有的操作,如读写缓存,读写下级存储器等。有操作队列条目的状态机并行运行,条目被分配后,所有状态机的操作请求按照所需的硬件资源类型分开进行仲裁。比如状态机要读下一级存储空间的请求一起进行仲裁,要写缓存的请求一起进行仲裁等等。状态机完成所有操作则回到不工作状态表示请求已经完成,该状态视作状态机释放,也会被其他条目监听到。如此,请求队列采用多路并行仲裁的方式,对执行操作需要的每一种硬件资源,所有条目状态机都可以同时进行仲裁,避免了非冲突请求被阻塞的情况。对于冲突解除的请求,若需要的硬件资源不同也可以和其他条目请求同时进行操作。

下面结合附图对本发明的技术方案做进一步的详细说明:

如图3所示,是本发明设计的一个更具体的示例,下面描述该示例处理发生连续请求冲突的过程:

请求a在完成缓存查找表的读取后,得到其当前请求地址在缓存中不存在,缓存访问未命中(cachemiss),为该请求分配一个缓存地址{set0,way0},并直接更新该缓存地址在查找表中对应的标签状态为“clean”,同时为请求a分配一个空闲的操作队列条目,该条目的opqid(操作队列条目的编号)为0x0,它的状态机启动,由于请求a无冲突请求,将请求a的pending_opqid记为0x0,它可以直接开始后续操作,去下一级存储空间读取未命中的数据(missload)。

请求b是一个与请求a涉及相同地址的写请求,请求b在完成缓存查找表的读取和对其他操作队列条目的查询后,得知其请求的当前地址{set0,way0}在缓存中存在,即缓存命中(cachehit),状态为“clean”。由于opqid为0x0的条目正处于相同地址的未命中读取状态,即b请求与a请求存在冲突,得到b请求的pending_opqid为0x1。直接更新地址{set0,way0}在查找表中对应的标签状态为“dirty”,并为请求b分配一个空闲的操作队列条目,该条目的opqid为0x1,它的状态机启动,由于请求b的pending_opqid为0x1,它的状态机启动处于等待状态。请求a和请求b进入操作队列后的情况如图4所示。

请求c恰好是一个对请求a和b正在使用的缓存地址{set0,way0}的无效请求,请求c在完成查找表的读取和对其他操作队列条目的查询后,得知当前缓存地址{set0,way0}为“dirty”状态,由于opqid为0x0的条目和opqid为0x1的条目都正在对该缓存地址进行操作,则请求c与它们都存在冲突,所以得到请求c的pending_opqid为0x3。直接更新该缓存地址{set0,way0}状态为“invalid”,并为请求c分配一个空闲的操作队列条目,该条目的opqid为0x2,它的状态机启动,由于请求c的pending_opqid为0x2,它的状态机处于等待状态。

请求d是一个和请求a/b相同地址的读请求,请求d在完成查找表读取和对其他操作队列条目的查询后,得知当前的缓存地址不存在(被请求c更新成无效),缓存访问未命中。由于opqid为0x0和0x1的请求正在对该地址进行读写还未完成,opqid0x2的请求正在等待踢出opqid0x1这个地址,所以得到请求d的pending_opqid为0x7。直接为请求d分配新的缓存存储地址{set0,way1},并更新该地址在查找表中对应的标签状态为“clean”,并为请求d分配一个空闲的操作队列条目0x3,即opqid为0x3,它的状态机启动,由于其pending_opqid为0x7,它的状态机处于等待状态。

请求e是一个和请求a/b/d涉及相同地址的读请求,请求e在完成查找表读取和对其他操作队列条目的查询后,得到当前地址状态为“clean”(请求d更新,目标缓存地址和请求d的缓存地址{set0,way1}一致)。由于opqid0x0/0x1/0x2/0x3都与该地址相关,所以得到请求e的pending_opqid为0xf。并为该地址e分配一个空闲的操作队列条目,其opqid为0x4,它的状态机启动,由于pening_opqid为0xf,它的状态机处于等待状态。

请求f是一个和a/b/d/e相同地址的读请求,请求f在完成查找表查询和和对其他操作队列条目的查询后,得到当前地址状态为clean(请求d更新,目标缓存地址和请求d的缓存地址{set0,way1}一致)。由于opqid0x1/0x2/0x3/0x4都与该地址相关,0x5虽然也与该地址相关,但并非是未命中状态,所以不冲突,并为该地址分配f分配一个空闲的操作条目0x5,opqid为0x5,它的状态机启动,由于pending_opqid为0xf,它的状态机处于等待状态。

到目前为止,各请求在电路中的情况如图5所示,他们的pending关系如图6所示。

上述过程中,所述pending_opqid是以十六进制编号呈现的冲突信息,获得所述pending_opqid编号的原理如下:

请求a无在先的冲突请求时,在其条目中直接将pending_opqid记为0x0;

请求b存在opqid为0x0的冲突条目(请求a),表示为one-hot编码1’b1,获得一个一位二进制向量,将其转换为十六进制字符,获得编号1,在其条目中将pending_opqid记为0x1;

请求c存在opqid为0x0、0x1的两个冲突条目,表示为one-hot编码2’b11,获得一个两位二进制向量,将其转换为十六进制字符,获得编号3,在其条目中将pending_opqid记为0x3;

以此类推:

请求d存在opqid为0x0、0x1、0x2的三个冲突条目,表示为one-hot编码3’b111,获得一个三位二进制向量,将其转换为十六进制字符,获得编号7,在其条目中将pending_opqid记为0x7;

请求e/f存在opqid为0x0、0x1、0x2、0x4的四个冲突条目,表示为one-hot编码4’b1111,获得一个四位二进制向量,将其转换为十六进制字符,获得编号f,在其条目中将pending_opqid记为0xf。

上述各请求被状态机操作执行的过程中:

请求a的未命中读取完成后,再完成后续操作后可以释放opqid为0x0的条目,即冲突解除,则处于监听的请求b的pending_opqid变为0x0,请求c的pending_opqid变为0x2(one-hot编码更新为2’b10),请求d的pending_opqid变为0x6(one-hot编码更新为3’b110),请求e的pending_opqid变成0xe(one-hot编码更新为4’b1110),请求f的pending_opqid也变为0xe(one-hot编码更新为4’b1110)。由于请求b的pending_opqid为0x0,所以可以跳出等待状态开始完成缓存写操作,并释放opqid为0x1的条目。

请求b的写请求完成后,释放opqid为0x1的条目,请求c的pending_opqid变为0x0,请求d的pending_opqid变为0x4(one-hot编码更新为3’b100),请求e/f的pending_opq变为0xb(4’b1100)。请求c的pending_opqid为0x0,可以开始跳出等待状态,开始完成对该{set0,way0}的无效操作,完成后,释放opqid为0x2的条目。

请求c的无效请求完成后,释放opqid为0x2的条目,请求d的pending_opqid变为0x0,请求e/f的pending_opq变为0x8(one-hot编码更新为4’b1000)。现在的pending关系如图7所示,请求d的pending_opqid为0x0,可以开始跳出等待状态,开始执行对该地址的missload等后续操作直到所有操作完成,并释放opqid为0x3的条目。

请求d的读请求完成后,释放opqid为0x3的条目,请求e/f的pending_opqid都变为0,同时可以跳出等待状态,开始执行对该地址的cacheload等操作。

这个时候如果来了请求g,且请求g为与e/f操作地址无关的请求,相互不冲突,又被分配到opqid为0x0的条目。由于请求g与e/f都没有冲突,则都可以直接跳出等待状态,开始并行执行他们各自的操作,如图8所示。

最终所有请求完成,所有操作队列条目都被释放。

本实施例方法相较于现有技术的优点是:

1)相比一般含有重发请求的缓存设计,任何请求无论是否冲突都只访问一次查找表,提高了请求的吞吐率,提高了请求访问的效率。

2)相比一般读取查找表内容来判断冲突是否解除的缓存设计,发生冲突的请求在冲突解除后,立刻就可以重新启动,减少了平均访问完成时间,提高了请求访问的效率。

3)采用独立状态机,并对各类硬件资源独立仲裁,请求可并行操作各种硬件资源,降低了冲突释放后重新启动的请求与其他请求发生硬件访问仲裁的可能性,如重试请求要读取缓存,而新请求是要写下一级存储空间,则可以并行进行,提高了请求访问效率。

本实施例方法的短板在于:

本实施例方法比起一般方法代价是消耗了更多的寄存器和组合逻辑用于构建操作队列,pending_opqid,操作条目状态机,访问仲裁等。除了面积增长以外,由于操作队列条目之间需要相互监听和操作仲裁,随着条目数增加,致使电路无法跑到很高时钟频率。另外由于本方法由条目状态机来执行操作,致使缓存能够向下一级存储器发出的独立请求个数收到了条目数的限制。

综合考虑上述优点和短板,本方法设计更适合用在频率较低的、有大容量需求的缓存电路中,如7ns制程的跑1ghz频率的gpu的最后一级缓存,这样的电路因为本身在tile内,存在大尺寸的sram需要摆放,对一般寄存器和组合逻辑的消耗不太敏感,gpu本身的时钟频率要求也低,针对此类电路,本实例方法能够扬长避短,产生更加显著的有益效果。

通过以上实例,可以发现通过本发明的数字电路设计,高效处理了所有冲突请求,无论是一个请求与多个请求有冲突,或者多个请求与一个请求有冲突,或者存在请求链式连续冲突,都可以靠本发明的机制高效记录并处理,且非冲突请求也可高效执行不会受到影响。

上面结合附图对本发明的实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1