CN117971719B - 一种提前传递数据的方法及其装置 - Google Patents
一种提前传递数据的方法及其装置Info
- Publication number
- CN117971719B CN117971719B CN202410365399.7A CN202410365399A CN117971719B CN 117971719 B CN117971719 B CN 117971719B CN 202410365399 A CN202410365399 A CN 202410365399A CN 117971719 B CN117971719 B CN 117971719B
- Authority
- CN
- China
- Prior art keywords
- instruction
- stock
- address
- fetch
- data
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 44
- 238000012546 transfer Methods 0.000 claims abstract description 70
- 230000004044 response Effects 0.000 claims abstract description 9
- 230000005540 biological transmission Effects 0.000 abstract description 6
- 238000010586 diagram Methods 0.000 description 17
- 230000008569 process Effects 0.000 description 5
- 238000004590 computer program Methods 0.000 description 4
- 230000007246 mechanism Effects 0.000 description 4
- 238000013461 design Methods 0.000 description 3
- 238000013519 translation Methods 0.000 description 3
- 230000001419 dependent effect Effects 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Abstract
本申请提出了一种提前传递数据的方法及其装置,涉及处理器技术领域。包括:获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区;响应于存数队列和/或存数指令缓冲区对虚拟读取地址进行比较并判断地址匹配时,获取存数队列和/或存数指令缓冲区中根据虚拟读取地址得到的传递数据,并获取一级数据高速缓存的命中结果;根据虚拟读取地址确定对应的物理读取地址,基于物理读取地址访问存数队列和/或存数指令缓冲区得到地址匹配结果;根据命中结果、地址匹配结果和传递数据确定取数指令的取数结果,并将取数结果写回。本申请降低了数据传递延迟,提高了处理器的主频和性能。
Description
技术领域
本申请涉及处理器技术领域,尤其涉及一种提前传递数据的方法及其装置。
背景技术
当处理器的一条取数指令(Load)被发射在流水线中执行时,需要查找所有的存数指令(Store),如果有程序执行序在取数指令之前的存数指令并且它们之间存在地址相关,则该取数指令所需要的值全部或者部分在执行序在其前面的存数指令中,此时需要将地址相关的存数指令对应的值传递给其后面的取数指令。
其中,存数指令传递数据给取数指令的相关是指物理地址相关,即存数指令和取数指令对同一物理地址做数据存取,才会发生数据传递。现有技术中,访存指令执行的过程中取数指令(Load)和存数指令(Store)地址相关的判断都是使用物理地址做判断,需要等待TLB(Translation Lookaside Buffer,转译后备缓冲器)访问结束,才能通过指令虚拟地址查询TLB获得指令的物理地址,再进行取数指令与存数指令的地址相关判断和数据传递,该过程进行地址比较和数据传递对流水线的延时影响很大,会成为处理器时序的关键路径,从而影响处理器的主频提升。
发明内容
本申请旨在至少在一定程度上解决相关技术中的技术问题之一。
为此,本申请提出一种提前传递数据的方法,以解决存数指令传递数据给取数指令的延时问题。
本申请的第二个目的在于提出一种提前传递数据的装置。
本申请的第三个目的在于提出一种电子设备。
本申请的第四个目的在于提出一种非瞬时计算机可读存储介质。
本申请的第五个目的在于提出一种计算机程序产品。
为达上述目的,本申请第一方面实施例提出了一种提前传递数据的方法,包括:获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于所述虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区,所述存数队列中包括存数指令提交之前暂存的需要存储的数据,所述存数指令缓冲区中包括已提交存数指令但未写入数据高速缓存(Data Cache,DCache,也称“一级数据高速缓存”)的需要存储的数据;响应于所述存数队列和/或存数指令缓冲区对所述虚拟读取地址进行比较并判断地址匹配时,获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,并获取所述一级数据高速缓存的命中结果;根据所述虚拟读取地址确定对应的物理读取地址,并基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区得到地址匹配结果;根据所述命中结果、所述地址匹配结果和所述传递数据确定所述取数指令的取数结果,并将所述取数结果写回。
根据本申请的一个实施例,所述获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,包括:获取所述存数队列和/或所述存数指令缓冲区使用所述虚拟读取地址查询得到所述虚拟读取地址的匹配命中向量,通过所述命中向量从所述存数队列和/或所述存数指令缓冲区中生成的各个字节的传递数据。
根据本申请的一个实施例,所述获取所述一级数据高速缓存的命中结果,包括:获取所述一级数据高速缓存通过一级数据高速缓存的标签进行多路标签比较,得到的命中路结果。
根据本申请的一个实施例,所述基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区得到地址匹配结果,包括:基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区后,所述存数队列和/或存数指令缓冲区将虚拟读取地址的匹配结果和物理读取地址的匹配结果进行比较;若所述虚拟读取地址的匹配结果和所述物理读取地址的匹配结果不一致,则得到地址匹配结果为不一致;若所述虚拟读取地址的匹配结果和所述物理读取地址匹配的结果一致,则得到地址匹配结果为一致。
根据本申请的一个实施例,所述根据所述命中结果、所述地址匹配结果和所述传递数据确定所述取数指令的取数结果,包括:若所述地址匹配结果为不一致,刷新所述存数队列和/或存数指令缓冲区,并将所述取数指令添加需要从取指重发的标签,在所述取数指令到达重定序队列的队尾时触发,从取指令阶段重新执行;若所述地址匹配结果为一致,所述命中结果为DCache访问命中,将所述传递数据和所述DCache访问命中的数据进行合并,生成所述取数指令的取数结果;若所述地址匹配结果为一致,所述命中结果为DCache访问失效,确定所述传递数据是否包括所述取数指令需要的数据的所有字节;若所述传递数据不包括所述取数指令需要的数据的所有字节,在取数队列中保存传递数据,并在DCache重填访问的数据时,所述取数队列将重填的数据和传递数据合并,生成所述取数指令的取数结果;若所述传递数据包括所述取数指令需要的数据的所有字节,利用所述传递数据生成所述取数指令的取数结果。
根据本申请的一个实施例,所述将所述取数结果写回包括:根据时序情况,将所述取数指令的取数结果写回。
根据本申请的一个实施例,所述根据时序情况,将所述取数指令的取数结果写回,包括:若时序能够实现将所述取数指令标记成命中状态,则从DCache将所述取数指令的取数结果写回;若时序不能实现将所述取数指令标记成命中状态,则将所述取数指令的取数结果写到取数队列,并从所述取数队列写回。
根据本申请的一个实施例,所述响应于所述存数队列和/或存数指令缓冲区对所述虚拟读取地址进行比较并判断地址匹配时,获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,并获取所述一级数据高速缓存的命中结果之前,所述方法还包括:获取所述存数队列发送的指示数据,将从取数指令保留站中重发所述取数指令并重新执行,其中,所述指示数据用于指示所述存数队列中所述虚拟读取地址对应的存数指令的地址有效且存储数据无效。
为达上述目的,本申请第二方面实施例提出了一种提前传递数据的装置,包括:第一访问模块,用于获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于所述虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区,所述存数队列中包括存数指令提交之前暂存需要存储的数据,所述存数指令缓冲区中包括已提交存数指令但未写入DCache的需要存储的数据;获取模块,用于响应于所述存数队列和/或存数指令缓冲区对所述虚拟读取地址进行比较并判断地址匹配时,获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,并获取所述一级数据高速缓存的命中结果;第二访问模块,用于根据所述虚拟读取地址确定对应的物理读取地址,并基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区得到地址匹配结果;确定模块,用于根据所述命中结果、所述地址匹配结果和所述传递数据确定所述取数指令的取数结果,并将所述取数结果写回。
为达上述目的,本申请第三方面实施例提出了一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以实现如本申请第一方面实施例所述的提前传递数据的方法。
为达上述目的,本申请第四方面实施例提出了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于实现如本申请第一方面实施例所述的提前传递数据的方法。
为达上述目的,本申请第五方面实施例提出了一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现如本申请第一方面实施例所述的提前传递数据的方法。
本申请至少实现以下有益效果:本申请提出的提前传递数据的方法通过虚拟读取地址匹配地址相关提前传递数据,再进行物理读取地址检查的方法,实现了存数指令提前传递数据给地址相关的取数指令的过程不依赖从DTLB中转换出来的物理读取地址,又保证了传递数据的正确性,从而达到降低数据传递延迟的目的,进而提高了处理器的主频和性能。
附图说明
本申请上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为一种处理器的访存系统架构图;
图2为一种指令格式对应的示意图;
图3为一种指令格式对应的示意图;
图4为另一种指令格式对应的示意图;
图5为另一种指令格式对应的示意图;
图6为另一种指令格式对应的示意图;
图7为另一种指令格式对应的示意图;
图8为另一种指令格式对应的示意图;
图9为另一种指令格式对应的示意图;
图10为另一种指令格式对应的示意图;
图11为另一种指令格式对应的示意图;
图12为另一种指令格式对应的示意图;
图13是本申请一个实施例示出的一种提前传递数据的方法的流程示意图;
图14是本申请一个实施例示出的一种提前传递数据的装置的结构示意图;
图15是本申请一个实施例示出的一种电子设备的示意图。
具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。
图1为一种处理器的访问系统架构图,如图1所示,处理器实现访存的乱序执行。其中,包含M条取数(Load)流水线,N条存数地址(Store Address)流水线和N条存数数据(Store Data)流水线。存数地址流水线和存数数据流水线可以是独立的流水线,也可以是合并的流水线。
其中,取数指令保留站(Load Reservation Station)发射取数指令地址,地址一般包括基地址和偏移量;存数指令地址保留站(Store Address Reservation Station)发射存数指令地址,一般包括基地址和偏移量;存数指令数据保留站(Store DataReservation Station)发射存数指令存储的数据;取数指令保留站(Load ReservationStation)、存数指令地址保留站(Store Address Reservation Station)和存数指令数据保留站(Store Data Reservation Station)前面连接指令分派队列(Dispatch Queue),指令分派队列是有序的,分派指令到各个保留站中等待发射;地址生成部件根据基地址和偏移量计算得到访存指令的虚拟地址;一级数据TLB(DTLB),负责将访存指令的虚拟地址翻译成物理地址;一级数据高速缓存标签(DCache TAG),保存一级数据Cache的TAG,并进行多路TAG比较(TAG Compare),得到命中路信息;一级数据高速缓存数据(DCache Data)保存一级数据Cache的Data;取数队列(Load Queue)和存数队列(Store Queue)分别保存和管理取数指令和存数指令,负责维护访存指令的顺序关系;取数队列会在Load指令在一级数据高速缓存访问失效(Cache miss)时负责侦听后续的DCache重填(Refill)结果并执行写回操作;存数队列负责在存数指令提交之前暂存Store的数据,并为Store指令向地址相关的Load指令的数据传递提供数据,在Store指令提交之后,存数队列会将其中的数据搬运到存数指令缓冲区(Store Buffer);存数指令缓冲区负责以缓存行(Cache Line)作为单位对提交的Store指令的写请求进行合并,在Store Buffer项合并满一整个Cache行或Store Buffer接近满的时候将合并后的多个Store写请求一并写入到一级数据高速缓存中。
为了清楚描述本发明实施例提供的方法,下面对访存指令进行介绍。访存指令分为取数指令和存数指令,都需要访问数据高速缓存。不同指令集的访存指令的格式不完全一样,通常的指令集取数指令都包括取字节(lb)、取半字(lh)、取字(lw)、取双字(ld)四种,存数指令都包括存字节(sb)、存半字(sh)、存字(sw)、存双字(sd)四种。下面以RISC-V(第五代精简指令集)为例,分别对取数指令和存数指令进行说明,但不限于下述指令。
lb rd, offset(rs1),x[rd] = sext(M[x[rs1]+ sext(offset)][7:0]),其对应的取数指令格式如图2所示。其中,rd、rs1为基地址寄存器的标识,offset为偏移量。该指令是指字节加载(Load Byte),即从地址x[rs1] + sign-extend(offset)读取一个字节,经符号位扩展后写入x[rd]。
lbu rd, offset(rs1),x[rd] = M[x[rs1]+ sext(offset)][7:0],其对应的取数指令格式如图3所示。该指令是指无符号字节加载(Load Byte, Unsigned),即从地址x[rs1] + sign-extend(offset)读取一个字节,经零扩展后写入x[rd]。
ld rd, offset(rs1),x[rd] = M[x[rs1]+ sext(offset)][63:0],其对应的取数指令格式如图4所示。该指令是指双字加载(Load Doubleword),即从地址x[rs1] + sign-extend(offset)读取八个字节,写入x[rd]。
lh rd, offset(rs1),x[rd] = sext(M[x[rs1]+ sext(offset)][15:0]),其对应的取数指令格式如图5所示。该指令是指半字加载(Load Halfword),即从地址x[rs1] +sign-extend(offset)读取两个字节,经符号位扩展后写入x[rd]。
lhu rd, offset(rs1),x[rd] = M[x[rs1]+ sext(offset)][15:0],其对应的取数指令格式如图6所示。该指令是指无符号半字加载(Load Halfword, Unsigned),即从地址x[rs1] + sign-extend(offset)读取两个字节,经零扩展后写入x[rd]。
lw rd, offset(rs1),x[rd] = sext(M[x[rs1]+ sext(offset)][31:0]),其对应的取数指令格式如图7所示。该指令是指字加载(Load Word),即从地址x[rs1] + sign-extend(offset)读取四个字节,写入x[rd]。
lwu rd, offset(rs1),x[rd] = M[x[rs1]+ sext(offset)][31:0],其对应的取数指令格式如图8所示。该指令是指无符号字加载(Load Word, Unsigned),即从地址x[rs1] + sign-extend(offset)读取四个字节,零扩展后写入x[rd]。
sb rs2, offset(rs1),M[x[rs1]+sext(offset)=x[rs2][7:0],其对应的存数指令格式如图9所示。该指令是指存字节(Store Byte),即将地址x[rs2]中的1个字节存入内存地址x[rs1]+sign-extend(offset)。
sd rs2, offset(rs1),M[x[rs1]+sext(offset)=x[rs2][63:0],其对应的存数指令格式如图10所示。该指令是指存双字(Store Doubleword),即将地址x[rs2]中的8字节存入内存地址x[rs1]+sign-extend(offset)。
sh rs2, offset(rs1),M[x[rs1]+sext(offset)=x[rs2][15:0],其对应的存数指令格式如图11所示。该指令是指存半字(Store Halfword),即将地址x[rs2]的低位2个字节存入内存地址x[rs1]+sign-extend(offset)。
sw rs2, offset(rs1),M[x[rs1]+sext(offset)=x[rs2][31:0],其对应的存数指令格式如图12所示。该指令是指存字(Store Word),即将地址x[rs2]的低位4个字节存入内存地址x[rs1]+sign-extend(offset)。
图13是本申请示出的一种提前传递数据的方法的示例性实施方式的示意图,如图13所示,该提前传递数据的方法,包括以下步骤:
S1301,获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区。
在一些实施例中,存数队列中包括存数指令提交之前暂存的需要存储的数据。以及,在一些实施例中,存数指令缓冲区中包括已提交存数指令但未写入DCache的需要存储的数据。
在一些实施例中,可以在取数流水线的第0拍中,从取数指令保留站读出取数指令和操作数,其中,操作数包括基地址和偏移量,偏移量为立即数,可以通过加法器将基地址与偏移量立即数相加计算得到取数指令对应的虚拟读取地址。
在一些实施例中,还可以在取数流水线的第0拍中,从取数指令保留站读出取数指令和操作数,生成数据传递所使用的掩码(mask),其中掩码标识上述取数指令具体取Cache行中的具体字节的数据。
在一些实施例中,可以在取数流水线的第1拍中,可以将上述虚拟读取地址/虚拟读取地址和mask送入到一级数据高速缓存、存数队列和存数指令缓冲区,以便一级数据高速缓存、存数队列和存数指令缓冲区对虚拟读取地址进行相关检查。其中,相关检查包括判断对应的存数的双字虚拟地址是否相同,及存数对应的字节是否相同。
S1302,响应于存数队列和/或存数指令缓冲区对虚拟读取地址进行比较并判断地址匹配时,获取存数队列和/或存数指令缓冲区中根据虚拟读取地址得到的传递数据,并获取一级数据高速缓存的命中结果。
在一些实施例中,存数队列的设计为存数队列是一个R项循环队列。其每周期至多:从指令分派队列(Dispatch Queue)接收S条指令;从Store Addr流水线接收N条存数指令的地址和控制信息;存数队列从Store Data流水线接收N条存数指令的数据;存数队列将T条指令的数据写入Store Buffer;为M条Load流水线提供Store到Load前递结果。
在一些实施例中,存数队列每项的内容包含以下的信息:物理地址;虚拟地址;数据;数据有效mask;状态位。其中,表1为状态位的具体说明。
表1
在一些实施例中,一条Store指令会在Store Address流水线的第1拍中更新地址和状态位,设置addrvalid。以及,在一些实施例中,在存数指令数据保留站发出的StoreData会被立即写入存数队列,写入的同时会设置datavalid。
在一些实施例中,处理器负责指令提交的部件即重定序队列(Reorder Buffer,ROB)在指令提交后,根据Store指令提交的数量通知存数队列该数量的Store指令已经成功提交。其中,存数队列会将已经提交的存数指令的committed域更新为已提交状态,以表示其已经提交,可以被写入存数指令缓冲区(Store Buffer)中。
在一些实施例中,已经被提交的Store指令不会被取消,并且会按顺序被从存数队列中读出,写入Store Buffer。在Store Data被写入Store Buffer之前,存数队列中的这一项一直会保持有效状态,保证Store指令给地址相关的Load指令进行提前的数据传递,能够让Load拿到Store的结果。
在一些实施例中,基于虚拟读取地址访问存数队列后,可以获取存数队列基于上述的设计对虚拟读取地址比较并判断地址相关匹配时,存数队列提供的在该条指令之前,但未写入Store Buffer的存储的数据(Data)。其中,在一些实施例中,可以获取存数队列使用虚拟读取地址查询得到虚拟读取地址的匹配命中向量,通过命中向量从存数队列中生成的各个字节的传递数据。
在一些实施例中,Store Buffer的设计为Store Buffer中最多可以存放P项以缓存行(Cache Line)为单位组织的数据。Store Buffer每周期至多接收T条Store Queue写入的Store指令;向数据高速缓存写一个Cache Line;Store Buffer以Cache Line为粒度合并Store的写请求。当容量超过设定的阈值时,Store Buffer会执行换出操作,采用替换算法,如先进先出(FIFO)、最近最少使用(LRU)、伪LRU(PLRU)等替换算法,选出要写入数据高速缓存的Cache Line,并将其写入数据高速缓存。
在一些实施例中,Store Buffer中每项的内容可以包括:状态位;虚拟地址;物理地址;数据;数据有效掩码。其中,表2为Store Buffer中状态位的具体说明。
表2
在一些实施例中,基于虚拟读取地址访问存数指令缓冲区后,可以获取存数指令缓冲区基于上述的设计对虚拟读取地址比较并判断地址相关匹配时,Store Buffer也会向取数指令提供已提交但未写入DCache的存储的Data。其中,在一些实施例中,可以获取存数队列使用虚拟读取地址查询得到虚拟读取地址的匹配命中向量,通过命中向量从存数队列中生成的各个字节的传递数据,传递数据将会在传递请求产生的下一拍被反馈到取数流水线中。
在一些实施例中,基于虚拟读取地址访问一级数据高速缓存后,可以获取一级数据高速缓存通过一级数据高速缓存的标签进行多路标签比较,得到的命中路结果。
需要说明的是,在一些实施例中,响应于存数队列和/或存数指令缓冲区对虚拟读取地址进行比较并判断地址匹配时,获取存数队列和/或存数指令缓冲区中根据虚拟读取地址得到的传递数据,并获取一级数据高速缓存的命中结果之前,上述方法还可以包括:获取存数队列发送的指示数据,将从取数指令保留站中重发取数指令并重新执行,其中,指示数据用于指示存数队列中虚拟读取地址对应的存数指令的地址有效且存储数据无效。
在一些实施例中,在传递逻辑执行将Store的数据传递到后续相关的取数指令中时,可能会出现存储指令的地址就绪但是数据未准备就绪,即存数队列该项的addrvalid有效而datavalid无效的情况。传递逻辑会在检查到这种情况时通知向Load流水线第1拍(stage1)反馈结果。示例的,可以发送指示数据,指示数据用于指示存数队列中虚拟读取地址对应的存数指令的地址有效且存储数据无效。
在一些实施例中,获取存数队列发送的指示数据后,采用取数指令从保留站重发(Replay)的机制。也即是,当传递时发现地址匹配但数据未就绪(Data invalid)发生时,将从保留站中重发取数指令。
其中,在一些实施例中,从保留站(Reservation Station,RS)重发机制的作用是让指令在保留站中稍作等待,在一定的周期之后重新执行。上述机制的实现如下:一条指令从访存RS中发射之后仍然需要保留在RS中,访存指令在离开流水线时向RS反馈是否需要从保留站重发,需要从保留站重发的指令会在RS中继续等待在一定时间间隔之后重新发射,且保留站通过项号索引定位要重发的指令在保留站中的位置。
S1303,根据虚拟读取地址确定对应的物理读取地址,并基于物理读取地址访问存数队列和/或存数指令缓冲区得到地址匹配结果。
在一些实施例中,在取数流水线的第0拍,将取数指令的虚拟读取地址送入DTLB进行虚拟读取地址到物理读取地址的转换。在取数流水线的第1拍,TLB通过虚拟读取地址查询返回取数指令的物理读取地址后,基于物理读取地址访问存数队列和/或存数指令缓冲区得到地址匹配结果。
具体地,在一些实施例中,基于物理读取地址访问存数队列和/或存数指令缓冲区后,存数队列和/或存数指令缓冲区将虚拟读取地址的匹配结果和物理读取地址的匹配结果进行比较;若虚拟读取地址的匹配结果和物理读取地址的匹配结果不一致,则得到地址匹配结果为不一致;若虚拟读取地址的匹配结果和物理读取地址匹配的结果一致,则得到地址匹配结果为一致。
在一些实施例中,基于物理读取地址访问存数队列后,存数队列会用物理读取地址匹配来进行虚拟读取地址匹配传递地址相关正确性的检查:一旦在传递时发现虚拟读取地址匹配和物理读取地址匹配的结果不一致,则将不一致信息反馈到取数流水线。
在一些实施例中,基于物理读取地址访问存数指令缓冲区后,存数指令缓冲区会进行虚拟地址传递相关的检查:一旦在传递时发现虚拟地址匹配和物理地址匹配的结果不同,则将不一致信息反馈到取数流水线。
S1304,根据命中结果、地址匹配结果和传递数据确定取数指令的取数结果,并将取数结果写回。
在一些实施例中,通过上述步骤得到命中结果、地址匹配结果和传递数据后,可以根据命中结果、地址匹配结果和传递数据确定取数指令的取数结果。
具体地,在一些实施例中,根据命中结果、地址匹配结果和传递数据确定取数指令的取数结果的方法可以包括以下步骤:
步骤1、若地址匹配结果为不一致,刷新存数队列和/或存数指令缓冲区,并将取数指令添加需要从取指重发的标签,在取数指令到达重定序队列的队尾时触发,从取指令阶段重新执行;
在一些实施例中,在取数流水线的第二拍(stage2),若地址匹配结果为不一致,则说明虚拟地址传递发生了错误,此时需要触发回滚(Rollback)并刷新Store Queue和StoreBuffer,以将引发错误的虚拟地址从Store Queue和Store Buffer中排除出去。
具体地,在一些实施例中,当存数队列和/或存数指令缓冲区反馈虚拟地址传递失败时,即虚拟地址匹配结果和物理地址匹配结果不一致时,取数流水线会在第二拍将该取数指令附加上需要从取指重发的标签。并在该条取数指令到达重定序队列(ReorderBuffer,ROB)的队尾时触发从取指令阶段重新执行。
在一些实施例中,在需要刷新(Flush,清空)存数队列时,存数指令缓冲区也会同时进入刷新状态。在刷新过程中,存数队列会不断将其中已经提交Store指令的数据写入到存数指令缓冲区中,存数指令缓冲区向DCache写入其中的所有数据,直到存数队列和存数指令缓冲区都不含有效数据为止。
在一些实施例中,在主动刷新(Flush,清空)存数指令缓冲区时,存数指令缓冲区会一并将存数队列中已经提交(Committed)的指令全部写入DCache。其中,存数指令缓冲区还会自行刷新以支持虚拟地址传递机制。在存数指令缓冲区发现虚物理地址传递的结果产生了冲突时,存数指令缓冲区也会进行自动刷新。
步骤2、若地址匹配结果为一致,命中结果为DCache访问命中,将传递数据和DCache访问命中的数据进行合并,生成取数指令的取数结果;
步骤3、若地址匹配结果为一致,命中结果为DCache访问失效,确定传递数据是否包括取数指令需要的数据的所有字节;
步骤4、若传递数据不包括取数指令需要的数据的所有字节,在取数队列中保存传递数据,并在DCache重填访问的数据时,取数队列将重填的数据和传递数据合并,生成取数指令的取数结果;
在一些实施例中,取数队列的设计为:取数队列是一个L项的循环队列。其每周期:从指令分派队列(Dispatch Queue)接收P条指令;从取数流水线接收M条指令的结果,以更新其内部的状态;从DCache接收失效数据填充(Refill)结果,更新取数队列中全部等待此次Refill的指令的状态;写回Q条数据高速缓存访问失效(Cache miss)的取数指令,取数指令已经取得了Refill的数据,会与正常的访存流水线争用写回端口。一级数据高速缓存Refill时,会将整个Cache Line的所有数据反馈给取数队列,所有在取数队列中等待这一Cache Line数据的指令都会得到数据。
在一些实施例中,取数队列每项包含以下的信息:物理地址;虚拟地址;数据;状态位。其中,表3为取数队列中状态位的具体说明。
表3
在一些实施例中,取数第二拍(Stage2)阶段,DCache和传递返回结果,并将物理地址和虚拟地址相关匹配的传递结果写入到取数队列中。
步骤5、若传递数据包括取数指令需要的数据的所有字节,利用传递数据生成取数指令的取数结果。
在一些实施例中,若传递数据包括取数指令需要的数据的所有字节,也即传递的数据可以覆盖该条取数指令需要的数据的所有字节,可以不等待DCache返回数据,利用传递数据生成取数指令的取数结果。
进一步地,在一些实施例中,通过上述步骤确定取数指令的取数结果后,需要将取数结果写回,其中将取数结果写回的方法可以包括根据时序情况,将取数指令的取数结果写回。
其中,在一些实施例中,根据时序情况,将取数指令的取数结果写回的方法可以包括:若时序能够实现将取数指令标记成命中状态,则从DCache将取数指令的取数结果写回;若时序不能实现将取数指令标记成命中状态,则将取数指令的取数结果写到取数队列,并从取数队列写回。
具体地,在一些实施例中,若时序不能实现将取数指令标记成命中状态,则该条取数指令在更新取数队列时会直接设置Load数据有效,不需要等待DCache 填充(Refill)的结果,可以被直接选取并写回。
本公开实施例中,获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区,存数队列中包括存数指令提交之前暂存的需要存储的数据,存数指令缓冲区中包括已提交存数指令但未写入DCache的需要存储的数据,响应于存数队列和/或存数指令缓冲区对虚拟读取地址进行比较并判断地址匹配时,获取存数队列和/或存数指令缓冲区中根据虚拟读取地址得到的传递数据,并获取一级数据高速缓存的命中结果,并根据虚拟读取地址确定对应的物理读取地址,并基于物理读取地址访问存数队列和/或存数指令缓冲区得到地址匹配结果,然后根据命中结果、地址匹配结果和传递数据确定所述取数指令的取数结果。由此,本申请通过虚拟读取地址匹配地址相关提前传递数据,再进行物理读取地址检查的方法,实现了存数指令提前传递数据给地址相关的取数指令的过程不依赖从DTLB中转换出来的物理读取地址,又保证了传递数据的正确性,从而达到降低数据传递延迟的目的,进而提高了处理器的主频和性能。
基于上述描述,本申请中Load指令执行流水线各级划分如下:
第0拍(Stage0)
指令和操作数被从保留站读出,操作数包括基地址和偏移量,偏移量为立即数
地址生成部件将基地址与偏移量立即数相加,计算得到虚拟地址
虚拟地址送入DTLB进行TLB查询
虚拟地址送入数据高速缓存进行TAG查询
虚拟地址送Store Queue和Store Buffer
第1拍(Stage1)
TLB产生物理地址
物理地址送进数据高速缓存进行Data查询
进行Store到Load的虚拟地址匹配传递操作
物理地址送Store Queue和Store Buffer
根据一级数据高速缓存返回的命中结果,产生提前唤醒信号送给保留站
第2拍(Stage2)
根据一级数据高速缓存及传递返回的结果选择数据
根据Load指令的要求,对返回的结果做合并操作
更新Load Queue中对应项的状态
结果写回
进行Store到Load的物理地址相关检查
第3拍(Stage3)
根据DCache的访问结果,更新Load Queue中对应项的状态
本申请中Store Address流水线的划分如下:
第0拍(Stage0)
地址生成部件将基地址与偏移量立即数相加,计算得到虚拟地址
虚拟地址送入DTLB
虚拟地址送入Store Queue
第1拍(Stage1)
TLB产生物理地址
开始进行访存依赖检查
物理地址送入Store Queue
第2拍(Stage2)
访存依赖检查
根据结果更新Store Queue
第3拍(Stage3)
完成访存依赖检查
通知重定序队列(Reorder Buffer,ROB)可以提交指令
本申请中Store Data流水线的划分如下:
第0拍(Stage0)
保留站给出Store Data
将Store Data写入Store Queue
图14为本申请示出的一种提前传递数据的装置的示意图,如图14所示,该提前传递数据的装置1400,包括:
第一访问模块1401,用于获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区,存数队列中包括存数指令提交之前暂存需要存储的数据,存数指令缓冲区中包括已提交存数指令但未写入DCache的需要存储的数据;
获取模块1402,用于响应于存数队列和/或存数指令缓冲区对虚拟读取地址进行比较并判断地址匹配时,获取存数队列和/或存数指令缓冲区中根据虚拟读取地址得到的传递数据,并获取一级数据高速缓存的命中结果;
第二访问模块1403,用于根据虚拟读取地址确定对应的物理读取地址,并基于物理读取地址访问存数队列和/或存数指令缓冲区得到地址匹配结果;
确定模块1404,用于根据命中结果、所述地址匹配结果和传递数据确定取数指令的取数结果,并将取数结果写回。
进一步地,获取模块1402,用于:获取存数队列和/或存数指令缓冲区使用虚拟读取地址查询得到虚拟读取地址的匹配命中向量,通过命中向量从存数队列和/或存数指令缓冲区中生成的各个字节的传递数据。
进一步地,获取模块1402,还用于:获取一级数据高速缓存通过一级数据高速缓存的标签进行多路标签比较,得到的命中路结果。
进一步地,第二访问模块1403,用于:基于物理读取地址访问存数队列和/或存数指令缓冲区后,存数队列和/或存数指令缓冲区将虚拟读取地址的匹配结果和物理读取地址的匹配结果进行比较;若虚拟读取地址的匹配结果和物理读取地址的匹配结果不一致,则得到地址匹配结果为不一致;若虚拟读取地址的匹配结果和物理读取地址匹配的结果一致,则得到地址匹配结果为一致。
进一步地,确定模块1404,用于若地址匹配结果为不一致,刷新存数队列和/或存数指令缓冲区,并将取数指令添加需要从取指重发的标签,在取数指令到达重定序队列的队尾时触发,从取指令阶段重新执行;若地址匹配结果为一致,命中结果为DCache访问命中,将传递数据和DCache访问命中的数据进行合并,生成取数指令的取数结果;若地址匹配结果为一致,命中结果为DCache访问失效,确定传递数据是否包括取数指令需要的数据的所有字节;若传递数据不包括取数指令需要的数据的所有字节,在取数队列中保存传递数据,并在DCache重填访问的数据时,取数队列将重填的数据和传递数据合并,生成取数指令的取数结果;若传递数据包括取数指令需要的数据的所有字节,利用传递数据生成取数指令的取数结果。
进一步地,上述装置还用于:获取存数队列发送的指示数据,将从取数指令保留站中重发取数指令并重新执行,其中,指示数据用于指示存数队列中虚拟读取地址对应的存数指令的地址有效且存储数据无效。
本公开实施例中,通过虚拟读取地址匹配地址相关提前传递数据,再进行物理读取地址检查的方法,实现了存数指令提前传递数据给地址相关的取数指令的过程不依赖从DTLB中转换出来的物理读取地址,又保证了传递数据的正确性,从而达到降低数据传递延迟的目的,进而提高了处理器的主频和性能。
为了实现上述实施例,本申请实施例还提出一种电子设备1500,如图15所示,该电子设备1500包括:处理器1501和处理器通信连接的存储器1502,存储器1502存储有可被至少一个处理器执行的指令,指令被至少一个处理器1501执行,以实现如上述实施例所示的提前传递数据的方法。
为了实现上述实施例,本申请实施例还提出一种存储有计算机指令的非瞬时计算机可读存储介质,其中,计算机指令用于使计算机实现如上述实施例所示的提前传递数据的方法。
为了实现上述实施例,本申请实施例还提出一种计算机程序产品,包括计算机程序,计算机程序在被处理器执行时实现如上述实施例所示的提前传递数据的方法。
在本申请的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”、“顺时针”、“逆时针”、“轴向”、“径向”、“周向”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本申请和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本申请的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。
Claims (11)
1.一种提前传递数据的方法,其特征在于,包括:
获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于所述虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区,所述存数队列中包括存数指令提交之前暂存的需要存储的数据,所述存数指令缓冲区中包括已提交存数指令但未写入一级数据高速缓存的需要存储的数据;
响应于所述存数队列和/或存数指令缓冲区对所述虚拟读取地址进行比较并判断地址匹配时,获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,并获取所述一级数据高速缓存的命中结果;
根据所述虚拟读取地址确定对应的物理读取地址,并基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区得到地址匹配结果;
根据所述命中结果、所述地址匹配结果和所述传递数据确定所述取数指令的取数结果,并将所述取数结果写回。
2.根据权利要求1所述的方法,其特征在于,所述获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,包括:
获取所述存数队列和/或所述存数指令缓冲区使用所述虚拟读取地址查询得到所述虚拟读取地址的匹配命中向量,通过所述命中向量从所述存数队列和/或所述存数指令缓冲区中生成的各个字节的传递数据。
3.根据权利要求1所述的方法,其特征在于,所述获取所述一级数据高速缓存的命中结果,包括:获取所述一级数据高速缓存通过一级数据高速缓存的标签进行多路标签比较,得到的命中路结果。
4.根据权利要求1所述的方法,其特征在于,所述基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区得到地址匹配结果,包括:
基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区后,所述存数队列和/或存数指令缓冲区将虚拟读取地址的匹配结果和物理读取地址的匹配结果进行比较;
若所述虚拟读取地址的匹配结果和所述物理读取地址的匹配结果不一致,则得到地址匹配结果为不一致;
若所述虚拟读取地址的匹配结果和所述物理读取地址匹配的结果一致,则得到地址匹配结果为一致。
5.根据权利要求1所述的方法,其特征在于,所述根据所述命中结果、所述地址匹配结果和所述传递数据确定所述取数指令的取数结果,包括:
若所述地址匹配结果为不一致,刷新所述存数队列和/或存数指令缓冲区,并将所述取数指令添加需要从取指重发的标签,在所述取数指令到达重定序队列的队尾时触发,从取指令阶段重新执行;
若所述地址匹配结果为一致,所述命中结果为一级数据高速缓存访问命中,将所述传递数据和所述一级数据高速缓存访问命中的数据进行合并,生成所述取数指令的取数结果;
若所述地址匹配结果为一致,所述命中结果为一级数据高速缓存访问失效,确定所述传递数据是否包括所述取数指令需要的数据的所有字节;
若所述传递数据不包括所述取数指令需要的数据的所有字节,在取数队列中保存传递数据,并在一级数据高速缓存重填访问的数据时,所述取数队列将重填的数据和传递数据合并,生成所述取数指令的取数结果;
若所述传递数据包括所述取数指令需要的数据的所有字节,利用所述传递数据生成所述取数指令的取数结果。
6.根据权利要求1所述的方法,其特征在于,所述将所述取数结果写回包括:根据时序情况,将所述取数指令的取数结果写回。
7.根据权利要求6所述的方法,其特征在于,所述根据时序情况,将所述取数指令的取数结果写回,包括:
若时序能够实现将所述取数指令标记成命中状态,则从一级数据高速缓存将所述取数指令的取数结果写回;
若时序不能实现将所述取数指令标记成命中状态,则将所述取数指令的取数结果写到取数队列,并从所述取数队列写回。
8.根据权利要求1所述的方法,其特征在于,所述响应于所述存数队列和/或存数指令缓冲区对所述虚拟读取地址进行比较并判断地址匹配时,获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,并获取所述一级数据高速缓存的命中结果之前,所述方法还包括:
获取所述存数队列发送的指示数据,将从取数指令保留站中重发所述取数指令并重新执行,其中,所述指示数据用于指示所述存数队列中所述虚拟读取地址对应的存数指令的地址有效且存储数据无效。
9.一种提前传递数据的装置,其特征在于,包括:
第一访问模块,用于获取已发射的取数指令中待读取数据对应的虚拟读取地址,并基于所述虚拟读取地址访问一级数据高速缓存、存数队列和存数指令缓冲区,所述存数队列中包括存数指令提交之前暂存需要存储的数据,所述存数指令缓冲区中包括已提交存数指令但未写入一级数据高速缓存的需要存储的数据;
获取模块,用于响应于所述存数队列和/或存数指令缓冲区对所述虚拟读取地址进行比较并判断地址匹配时,获取所述存数队列和/或存数指令缓冲区中根据所述虚拟读取地址得到的传递数据,并获取所述一级数据高速缓存的命中结果;
第二访问模块,用于根据所述虚拟读取地址确定对应的物理读取地址,并基于所述物理读取地址访问所述存数队列和/或存数指令缓冲区得到地址匹配结果;
确定模块,用于根据所述命中结果、所述地址匹配结果和所述传递数据确定所述取数指令的取数结果,并将所述取数结果写回。
10.一种电子设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-8中任一项所述的方法。
11.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1-8中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410365399.7A CN117971719B (zh) | 2024-03-28 | 一种提前传递数据的方法及其装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410365399.7A CN117971719B (zh) | 2024-03-28 | 一种提前传递数据的方法及其装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117971719A CN117971719A (zh) | 2024-05-03 |
CN117971719B true CN117971719B (zh) | 2024-06-28 |
Family
ID=
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102866957A (zh) * | 2012-07-31 | 2013-01-09 | 中国人民解放军国防科学技术大学 | 面向多核多线程微处理器的虚拟活跃页缓冲方法及装置 |
CN104424129A (zh) * | 2013-08-19 | 2015-03-18 | 上海芯豪微电子有限公司 | 基于指令读缓冲的缓存系统和方法 |
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102866957A (zh) * | 2012-07-31 | 2013-01-09 | 中国人民解放军国防科学技术大学 | 面向多核多线程微处理器的虚拟活跃页缓冲方法及装置 |
CN104424129A (zh) * | 2013-08-19 | 2015-03-18 | 上海芯豪微电子有限公司 | 基于指令读缓冲的缓存系统和方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100708010B1 (ko) | 인덱스와 선택적 경로 정합에 기반하여 데이터를 포워딩하는 저장 버퍼 | |
US7472260B2 (en) | Early retirement of store operation past exception reporting pipeline stage in strongly ordered processor with load/store queue entry retained until completion | |
US7213126B1 (en) | Method and processor including logic for storing traces within a trace cache | |
US6523109B1 (en) | Store queue multimatch detection | |
US7461239B2 (en) | Apparatus and method for handling data cache misses out-of-order for asynchronous pipelines | |
US7836262B2 (en) | Converting victim writeback to a fill | |
US6622237B1 (en) | Store to load forward predictor training using delta tag | |
US6651161B1 (en) | Store load forward predictor untraining | |
US9892051B1 (en) | Method and apparatus for use of a preload instruction to improve efficiency of cache | |
US6481251B1 (en) | Store queue number assignment and tracking | |
US6694424B1 (en) | Store load forward predictor training | |
JP2003514299A5 (zh) | ||
JP2007536626A (ja) | ロードオペレーションの投機的な結果をレジスタ値にリンクするメモリファイルを検証するためのシステムおよび方法 | |
US7600098B1 (en) | Method and system for efficient implementation of very large store buffer | |
US20170091097A1 (en) | Hazard checking | |
KR101093784B1 (ko) | 리플레이 메커니즘을 구비한 로드 저장 유닛 | |
US6704854B1 (en) | Determination of execution resource allocation based on concurrently executable misaligned memory operations | |
CN117971719B (zh) | 一种提前传递数据的方法及其装置 | |
US7043626B1 (en) | Retaining flag value associated with dead result data in freed rename physical register with an indicator to select set-aside register instead for renaming | |
US7321964B2 (en) | Store-to-load forwarding buffer using indexed lookup | |
CN114341820A (zh) | 响应于推测性数据请求而推迟基于处理器的系统中的非推测性高速缓存存储器中的高速缓存状态更新,直到推测性数据请求变为非推测性 | |
CN117971719A (zh) | 一种提前传递数据的方法及其装置 | |
US11481331B2 (en) | Promoting prefetched data from a cache memory to registers in a processor | |
CN117472444A (zh) | 一种利用缓存行空间记录访存缺失信息的缓存设计方法 | |
US9798670B1 (en) | System and method of determining memory ownership on cache line basis for detecting self-modifying code including modification of a cache line with an executing instruction |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant |