CN115934170A - 预取方法及装置、预取训练方法及装置、存储介质 - Google Patents
预取方法及装置、预取训练方法及装置、存储介质 Download PDFInfo
- Publication number
- CN115934170A CN115934170A CN202211726101.8A CN202211726101A CN115934170A CN 115934170 A CN115934170 A CN 115934170A CN 202211726101 A CN202211726101 A CN 202211726101A CN 115934170 A CN115934170 A CN 115934170A
- Authority
- CN
- China
- Prior art keywords
- pointer
- data
- read
- instruction
- pointer value
- 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.)
- Pending
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本公开涉及一种指针数据的预取方法及装置、预取训练方法及装置、存储介质。该预取方法包括:在指针值读取指令缓存查询命中第一数据读取请求,其中,指针值读取指令缓存用于缓存至少一项备查指针值读取请求项,每个备查指针值读取请求项包括指针数据地址计算信息;执行第一数据读取请求以获取第一读取数据;使用指针值读取指令缓存中与第一数据读取请求对应的第一指针数据地址计算信息以及第一读取数据,计算得到第一指针数据预取地址;使用第一指针数据预取地址发出第一指针数据预取请求。该预取方法可以实现对于指针数据的预取。
Description
技术领域
本公开的实施例涉及一种指针数据的预取方法及装置、指针数据的预取训练方法及装置、存储介质。
背景技术
单核处理器或多核处理器的处理器核(例如CPU核)通过流水线技术提高指令间并行度(Instruction Level Parallelism)。图1示出了一种处理器核的流水线的示意图,图中的带箭头的虚线表示重新定向的指令流。如图1所示,处理器核内部包括多个流水阶段,比如,在流水线送入各种来源的程序计数器,通过多路选择器(Mux)选择出下一程序计数器(PC)之后,该程序计数器对应的指令要经过分支预测(Branch prediction)、指令提取(Instruction fetch)、指令译码(Decode)、指令分发与重命名(Dispatch and Rename)、指令执行(Execute)、指令结束(Retire)等。在各个流水级之间根据需要设置等待队列,这些队列通常是先入先出(FIFO)队列。例如,在分支预测单元之后,设置有分支预测(BP)FIFO队列,以存储分支预测结果;在指令提取单元之后,设置有指令缓存(Instruction Cache,IC)FIFO,以缓存所取得的指令;在指令译码单元之后,设置有译码(DE)FIFO,以缓存译码后的指令;在指令分发与重命名单元之后,设置有结束(RT)FIFO以缓存执行之后等待确认结束的指令。同时,处理器核的流水线还包括指令队列,以在指令分发与重命名之后缓存等待指令执行单元执行指令。为了支持高运行频率,每一个流水阶段又可能包含多个流水级(时钟周期)。虽然每个流水级执行有限的操作,但是这样每个时钟可以做到最短,通过提高CPU的运行频率来提高CPU核的性能。每个流水级也可以通过容纳更多条指令(即超标量(superscalar)技术)来进一步提高处理器核的性能。
发明内容
本公开的至少一个实施例提供了一种用于指针数据的预取方法,该预取方法包括:在指针值读取指令缓存(PLC)查询命中第一数据读取请求,其中,所述指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;执行所述第一数据读取请求以获取第一读取数据;使用所述指针值读取指令缓存(PLC)中与所述第一数据读取请求对应的第一指针数据地址计算信息以及所述第一读取数据,计算得到第一指针数据预取地址;使用所述第一指针数据预取地址发出第一指针数据预取请求。
本公开的至少一个实施例提供了一种用于指针数据的预取训练方法,包括:接收第一数据读取指令,其中,所述第一数据读取指令包括第一源寄存器;在读取架构寄存器表中查询命中所述第一源寄存器,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息(Opinfo);根据所述第一数据读取指令,获取基于所述第一源寄存器对应的指针值与目的指针数据地址的之间的第一指针数据地址计算信息;在指针值读取指令缓存(PLC)中,更新对应于所述第一源寄存器的过往指针值读取指令的第一备查指针值读取请求项,其中,所述指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;在所述第一备查指针值读取请求项写入所述第一指针数据地址计算信息,以用于产生指针数据预取请求。
本公开的至少一实施例提供了一种用于指针数据的预取训练方法,该预取训练方法包括:接收第一指令以及获取读取架构寄存器表,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息(Opinfo),且用于更新用于指针数据预取操作的指针值读取指令缓存(PLC);响应于所述第一指令为读取指令,在所述读取架构寄存器表中创建或更新对应于所述读取指令的目的寄存器中的第一备选架构寄存器项,在所述第一备选架构寄存器项中记载所述读取指令的信息,或者,响应于第一指令为计算指令,获取所述计算指令基于所述计算指令的源寄存器对应的指针值的第一指针数据地址计算信息(Opinfo),在所述读取架构寄存器表中对应于所述计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息(Opinfo),在所述读取架构寄存器表中创建或更新对应于所述计算指令的目的寄存器的第三备选架构寄存器项,且将所述第二备选架构寄存器项中记载的内容复制到所述第三备选架构寄存器项。
本公开的至少一实施例提供了一种用于指针数据的预取装置,该预取装置包括:
查询模块,配置为在指针值读取指令缓存(PLC)查询命中第一数据读取请求,其中,所述指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;
执行模块,配置为执行所述第一数据读取请求以获取第一读取数据;
地址计算模块,配置为使用所述指针值读取指令缓存(PLC)中与所述第一数据读取请求对应的第一指针数据地址计算信息以及所述第一读取数据,计算得到第一指针数据预取地址;
请求发出模块,配置为使用所述第一指针数据预取地址发出第一指针数据预取请求。
本公开的至少一实施例还提供了一种用于指针数据的预取训练装置,该预取训练装置包括:
接收模块,配置为接收第一数据读取指令,其中,所述第一数据读取指令包括第一源寄存器;
查询模块,配置为在读取架构寄存器表中查询命中所述第一源寄存器,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息(Opinfo);
获取模块,配置为根据所述第一数据读取指令,获取基于所述第一源寄存器对应的指针值与目的指针数据地址的之间的第一指针数据地址计算信息;
更新模块,配置为在指针值读取指令缓存(PLC)中,更新对应于所述第一源寄存器的过往指针值读取指令的第一备查指针值读取请求项,其中,所述指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;
写入模块,配置为在所述第一备查指针值读取请求项写入所述第一指针数据地址计算信息,以用于产生指针数据预取请求。
本公开的至少一实施例还提供了一种用于指针数据的预取训练装置,该预取训练装置包括:
接收模块,配置为接收第一指令以及获取读取架构寄存器表,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息(Opinfo),且用于更新用于指针数据预取操作的指针值读取指令缓存(PLC);
创建/更新模块,配置为响应于所述第一指令为读取指令,在所述读取架构寄存器表中创建或更新对应于所述读取指令的目的寄存器中的第一备选架构寄存器项,在所述第一备选架构寄存器项中记载所述读取指令的信息,或者,
响应于第一指令为计算指令,获取所述计算指令基于所述计算指令的源寄存器对应的指针值的第一指针数据地址计算信息(Opinfo),在所述读取架构寄存器表中对应于所述计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息(Opinfo),在所述读取架构寄存器表中创建或更新对应于所述计算指令的目的寄存器的第三备选架构寄存器项,且将所述第二备选架构寄存器项中记载的内容复制到所述第三备选架构寄存器项。
本公开的至少一实施例还提供了一种计算机程序的处理装置,包括处理单元和存储器,在该存储器上存储有一个或多个计算机程序模块,其中,所述一个或多个计算机程序模块被配置为由所述处理单元执行时实现如上述任一实施例的预取方法或任一实施例的预取训练方法。
本公开的至少一实施例还提供了一种非瞬时可读存储介质,其中,所述非瞬时可读存储介质上存储有计算机指令,其中,所述计算机指令被处理器执行时实现如上述任一实施例的预取方法或任一实施例的预取训练方法。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
图1示出了一种处理器核的流水线的示意图。
图2为一种计算机系统中使用页表进行地址翻译流程的示意图。
图3示出了一种指针数组访问模式的示例性示意图。
图4示出了本公开的至少一实施例提供的基于指针值读取指令缓存的指针数据预取方法的示意图。
图5示出了本公开的至少一实施例提供的指针值读取指令缓存的示意图。
图6示出了根据本公开至少一实施例的指针数据的预取方法的流程图。
图7示出了根据一个示例的指针数据的预取方法的流程图。
图8示出了根据本公开至少一实施例的用于指针数据的预取训练方法的流程图。
图9示出了根据一个示例的用于指针数据的预取训练方法的流程图。
图10示出了根据本公开的一些实施例的用于指针数据的预取训练方法的流程图。
图11示出了根据一个示例的用于指针数据的预取训练方法的流程图。
图12为本公开至少一个实施例提供的一种电子装置的示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
除非另作定义,此处使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
现有的CPU核架构中,程序和数据都保存在内存(例如DRAM)中,所以程序中存在大量的内存读取指令(Load指令)。由于CPU核运行频率远远高于内存运行频率,因此,从内存获取数据需要上百个CPU核时钟,往往会造成CPU核由于无法继续运行相关指令而空转,造成性能损失。高性能CPU核通常都包含多级高速缓存(Cache)去缩短内存访问的延迟,加快CPU核的运行速度,但是当读取从未被访问的数据或是由于缓存大小限制被踢出的数据时,CPU核仍然需要等待数十甚至上百个时钟周期,这将造成性能损失。
高性能CPU核不但包含多级缓存架构来保存最近被访问的数据,同时还会利用预取器发现CPU核对数据、指令访问的规律,来提前预取即将被访问的数据、指令到缓存中。如果预取的是指令,则称为指令预取,对应的预取器为指令预取器;如果预取的是数据,则称为数据预取,对应的预取器为数据预取器。后者根据目标缓存位置,可以进一步细分为L1D数据预取器(预取到第一级数据(L1D)缓存),L2数据预取器,LLC数据预取器(预取到最后一级缓存(Last Level Cache))等等。
计算机操作系统一个重要职能是内存管理。在多进程操作系统中,每个进程都有自己的虚拟地址空间,可以使用任意系统规定范围内的虚拟地址。CPU执行一个应用程序时所使用的地址就是虚拟地址。操作系统给一个进程分配内存时,需要把使用到的虚拟地址映射到物理地址,物理地址才是真正的物理内存访问地址。这样做有几个好处,首先,简化程序编译,编译器可以基于一个连续的、充足的虚拟地址空间来编译程序。其次,不同进程的虚拟地址被分配到不同的物理地址,使得系统能够同时运行多个进程,从而提高整个计算机系统的运行效率。最后,由于应用程序可以使用但无法更改地址翻译,因此一个进程无法访问到另一个进程的内存内容,从而增加了系统的安全性。
图2为一种计算机系统中使用页表进行地址翻译流程的示意图,图中示出了使用四级页表的地址翻译过程。如图2所示,该系统中的一个虚拟地址被划分为几段,例如,分别表示为EXT、OFFSET_lvl4、OFFSET_lvl3、OFFSET_lvl2、OFFSET_lvl1、OFFSET_pg。在该示例中,高位的虚拟地址段EXT没有被使用。虚拟地址段OFFSET_lvl4、OFFSET_lvl3、OFFSET_lvl2、OFFSET_lvl1分别表示四级页表的偏移值,也即是,虚拟地址段OFFSET_lvl4表示第四级页表的偏移值,虚拟地址段OFFSET_lvl3表示第三级页表的偏移值,虚拟地址段OFFSET_lvl2表示第二级页表的偏移值,虚拟地址段OFFSET_lvl1表示第一级页表的偏移值。
最高一级页表(也即第四级页表)的初始地址存放在架构寄存器REG_pt中,其内容由操作系统设定,应用程序无法更改。在第二级页表、第三级页表、第四级页表中,每一级页表的页表项中存放的是下一级页表的起始地址。第一级页表项(Page Table Entry,PTE)存放的是相应内存页的物理地址的高位,它与一项虚拟地址的虚拟地址偏移(OFFSET_pg)合并即可得到该虚拟地址对应的物理地址。由此,通过这种方式逐级获取下一级页表的起始地址,最终可以得到第一级页表项(PTE),从而进一步得到对应的物理地址,实现了从虚拟地址到物理地址的翻译。需要说明的是,虽然图2示出了4级页表,但是本公开的实施例不限于此,可以采用任意数量的多级页表。
地址翻译是一个非常耗时的过程,图2示例中,最坏情况下需要访问内存四次才能获得相应物理地址。为了节省地址翻译时间,提升计算机系统性能,很多CPU核中包含翻译后备缓冲器(Translation Lookasaid Buffer,TLB)来存放之前使用过的第一级页表表项PTE。命中TLB的地址翻译可以立即获得相应物理地址。与用于CPU核的缓存架构类似,TLB也可以有多种架构,比如全相联(Fully Associative)、组相联(Set Associative)、直接索引(Directly Indexed)等。TLB架构也可以是多级结构,最低一级TLB的尺寸最小且速度最快,当最低一级TLB没有命中时,再搜索下一级TLB。
指针(Pointer)是一类特殊类型的数据,该数据的内容是另一块数据的虚拟地址。软件可以使用指针实现复杂的数据结构,比如链表(Linked List)、图(Graph)等。在本公开中,“指针数据”(Pointed Data)表示的是指针指向的数据块中存储的数据内容;“指针值”(Pointer Value)表示指针本身的内容,用于计算获得“指针数据”的虚拟地址,即“指针数据地址”,通过该虚拟地址可以找到“指针数据”。
在计算机系统中,很多内存访问指令的内存访问虚拟地址是动态生成的,使用一个或者多个(架构)寄存器。常用的地址生成形式有如下三种:
(1)一个寄存器作为base,提供基地址;一个立即数提供偏移量(一个大小受限的值),而虚拟地址是两者之和(即,base+offset);
(2)一个寄存器作为base,提供基地址;另一个寄存器作为index,提供索引量,并且支持有限的缩放(例如x1、x2、x4、x8等,一般默认为1);一个立即数提供偏移量(一个大小受限的值),而虚拟地址使三者之和(即,base+index*scale+offset);
(3)一个寄存器作为index,提供索引量,并且支持有限的缩放(例如x1、x2、x4、x8等,一般默认为1);一个立即数提供偏移量(一个大小受限的值),而虚拟地址使两者之和(即,index*scale+offset)。
如上所述,复杂软件会应用大量使用指针来实现复杂的数据结构,比如二叉树、哈希表、链表、图等。对此,本公开的发明人注意到,指针值本身的读取在很多应用中,通常是有规律可循的,例如指针数组。指针数组是指存放着指针值或者偏移值的数组,其中偏移值是指在进行加/减/移位后与同一个base值相加后获得指针值的类型,对于指针数组的访问具有明显的步长规律,并且可以很好的被Stride预取器预取。同时指针值读取也存在着很多其他的访问模式可以被各种不同的预取器学习,并较有效地发出数据预取请求。
图3示出了一种指针数组访问模式的示例性示意图。图3中上部为伪代码,下部为指针数组与指针数据的示意图。如图3所示,连续的实线方块为内存中的指针数组,而离散的虚线方框为指针数组对应的内存地址,其中分别存储有对应的指针数据。例如,在图中上部的伪代码中,Addq指针在循环中每次减8,并使用ldq指令去访问存在指针数组中的指针值,其访问具有明显的规律。在获得指针值后,ldl指令使用指针值作为地址,访问指针数据。在例如CPU核中的Stride预取器可以很好地捕捉到ldq指令的访存规律并提前发出数据预取请求。
但是,现有的数据预取器很难对使用指针的指针数据进行预取,这是由于这样几个原因造成的。首先,指针数据访问的地址之间往往没有特别明显的规律来进行预取,例如参见图3所示,虚线框之间是彼此离散的,这表示这些指针数据可能分散中内存中的不同的位置。其次,当一个指令获得指针值后,该指针值往往会马上被使用到,使得CPU核没有时间去预取相应的指针数据,也不能很好地对于数据预取器进行训练。因此,由于缺乏有效的预取方式,从而从内存中获取指针数据这一过程常造成长时延,该长时延是制约CPU系统性能的一个重要因素。
本公开的一个或多个实施例提供了一种指针数据预取方法及指针数据预取器(预取装置),该指针数据预取方法可以在得到指针值后,根据例如CPU核的内模式识别所建立的指针数据的预取信息,立即产生一个或多个指针数据的预取请求。例如,该指针数据预取方法可以适用于所有指针值读取规律可以被其他预取器学习并发送预取的情况,这包括但不限于指针数组。该指针数据预取方法可以大幅减少CPU核等待读取指针数据的时延,提高了系统性能。
本公开的一个或多个实施例的指针数据预取方法及指针数据预取器可以和CPU核中的其他预取器协同工作,对于其他预取器发出的指针值预取请求,指针数据预取器可以访问并获取指针数据预取信息,在指针值预取返回预取结果时,可以使用该预取结果计算出要预取的指针数据的指针数据地址,并使用该指针数据地址发出指针数据的预取请求。在这种情况下,本公开实施例的指针数据预取方法及指针数据预取器通过其他预取器触发的指针值预取可以很好地解决指针数据预取及时性问题并提高指针数据预取的覆盖率。
本公开至少一个实施例提供的指针预取器(预取装置)可以置于一级数据(L1D)缓存之处(即与L1D缓存直接连接),但是在其他实施例中,指针预取器(预取装置)可以被置于L2缓存、LLC缓存之处,甚至设置在内存之处,这相对于被放置在L1D之处而言,可以更早拿到指针值或指针值预取数据,从而可以更早发出指针数据预取请求。
本公开的一个或多个实施例还提供了用于上述实施例的指针数据预取方法及指针数据预取器的训练方法及方法装置,该训练方法及方法装置可以追踪指针值读取指令与指针数据读取指令之间的相互关系、两者之间所需的地址计算操作以及指针值读取的数据大小、符号拓展等信息,从而可以对于指针值进行更加精准的估算以得到用于指针数据预取的指针数据地址。
在本公开的一个或多个实施例中,为CPU核提供了指针值读取指令缓存(PointerLoad Cache,PLC)以保存过往的指针值读取指令的信息,从而基于过往的指针值读取指令的信息来实现指针数据预取。
图4示出了本公开的至少一实施例提供的基于指针值读取指令缓存的指针数据预取方法的示意图。如图4所示,其他预取器(例如Stride预取器)产生指针值预取请求,使用该指针值预取请求访问PLC,如果命中,则返回指针数据预取信息,并且使用该指针值预取请求进行指针值预取,当被预取的指针值被返回到例如一级缓存(L1缓存)时,进行指针值预取回填;指针数据预取器使用该预取得到的指针值以及指针数据预取信息产生指针数据预取请求,进行指针数据预取,在系统获得被预取的指针数据之后,将该指针数据填写到一级缓存中以备未来被读取。
图5示出了本公开的至少一实施例提供的指针值读取指令缓存的示意图。该指针值读取指令缓存可以使用硬件实现,以记录一项或多项指针值读取指令的至少部分执行信息以供后续查询、使用,并且其记录的内容可根据之后使用该一项或多项指针值读取指令所读取的指针值进行读取地址计算的情形进行更新(例如实时更新)。
如图4所示,该指针值读取指令缓存(PLC)可以包括多个备查指针值读取请求项,并且每条备查指针值读取请求项包括如下多个域(字段):
·标签(Tag):对应的指针值读取指令的部分指令地址(例如虚拟地址的高位部分),用于在指针值读取指令缓存中查询该对应的指针值读取指令;
·数据大小(DS,data size):对应的指针值读取指令读取的数据中用于计算指针数据地址的指针值的数据大小;
·一个或多个偏移量(offset 0~n):计算过程中,指针数据的虚拟地址与指针值之间的偏移值,对于后续的不同的使用指针值的指令可以有不同的偏移值;
·一个或多个缩放量(scale 0~n):计算过程中,指针数据的虚拟地址与指针值之间的缩放量,对于后续的不同的使用该指针值的指令可以有不同的缩放量,与前述不同的偏移值相对应;
·一个或多个置信度(conf 0~n):分别针对上述一个或多个偏移量以及一个或多个缩放量的一个或多个组合的置信度,当该置信度大于阈值时代表其所针对的偏移量以及缩放量的组合有效,可以用于计算得到用于预取的指针数据地址。
例如,指针值读取指令缓存可以采用类似与缓存(例如一级缓存)的架构,比如,可以采用全相联(Fully Associative)、组相联(Set Associative)或直接索引(DirectlyIndexed)等架构,例如使用可以使用标签(Tag)等进行检索等操作,例如,在使用过程中,使用最近访问的数据以填充其中的某个备查指针值读取请求项时所采用的替换策略也可以包括最近使用(Least Recently Used,LRU)、最不常使用(Least-Frequently Used,LFU)等,本公开的实施例对此不作限制。
指针值读取指令缓存中标签(Tag)的取值例如可以与一级缓存(L1 Cache)查询时所使用的标签相同或相似,例如,使用第一指令的取指地址中的高位部分作为标签进行查询。并且,如果指针值读取指令缓存中一个记录行包括多个备查指针值读取请求项时,则还可以使用取指地址中的低位部分作为行内偏移值以定位相应的备查指针值读取请求项。
根据上述示例,由于置信度(Conf)在大于系统设定的阈值时才会将对应记录项中的“固定值”用于预测执行,所以系统在判断是否根据进行指针数据预取时,需要检测是否满足预取条件,然后根据检测结果进行处理。
在上述这些域中,如果系统对于指针值的数据大小有固定值,则该项可以不设置(即省略);如果系统对于指针值的数据大小没有固定值,软件可以选择不同的数据大小,例如一个字节(byte)、一个字(word)或双字(double word)等。
在本公开的一个或多个实施例中,为了传递指针值读取指令以及指针数据读取指令之间的各种地址计算信息,还为CPU核提供了读取架构寄存器表,该读取架构寄存器表包括一个或多个备选架构寄存器项,每个备选架构寄存器项为一个架构寄存器,其中所记载的值直接或间接源于某一指针值读取指令所读取的指针值。需要指出的是,在本公开中,读取架构寄存器表是传递指针值读取指令以及指针数据读取指令之间的各种信息一种示例性方案,也可以使用其他传递指针值读取指令以及指针数据读取指令之间的各种地址计算信息的方案。
当CPU核接收到指针值读取指令返回的数据后,往往要使用不同的计算操作去计算生成指针数据地址(即指针数据的虚拟地址)。在本公开的一个或多个实施例,提供了核内指针模式识别,通过读取架构寄存器表保存指针值与指针数据地址之间的计算信息,并将其归纳为预取信息、写入到指针值读取指令缓存(PLC)中。
不同的指令集通常定义了不同的架构寄存器,指针值读取指令和指针数据读取指令之间的地址计算通常需要使用多个架构寄存器作为桥梁。在本公开的实施例中,读取架构寄存器表的主要作用就是记录指针值和指针数据地址计算之间每条相关指令的操作以及所涉及的相应架构寄存器,并将这一信息随着指令流进行传播。在本公开的一项或实施例中,指针值与指针数据地址之间的计算操作包括但不限于上述三种方式,即[base+offset]、[base+index*scale+offset]和[index*scale+offset],这些方式可以多次叠加、组合。
当指针数据读取指令查询读取架构寄存器表,可以得知其源寄存器来自于一个指针值读取指令,并且可以得到指针值和指针数据地址之间的计算操作。通过对这些操作的逻辑操作,可以将指针值与指针数据虚拟地址之间的计算操作归纳为预取信息并保存在PLC的各个域内,并将相应的置信度(即conf0~n之一)+1。
由于对于运行在计算机系统中的一项进程而言,由于基地址(base)基本上是固定的且保持在基址寄存器中,因此在上述实施例中,PLC没有包括用于保存计算地址所需要使用的基地址(base)的值的域;此外,在地址计算中,指针值本身用于做索引量,因此在上述实施例中,也不需要包括用于保存索引量(index)的值的域。本公开的实施例不限于上述示例,根据需要也可以包括更多的域以用于记载基地址(base)和/或索引量(index)。
在读取架构寄存器表中,每个备选架构寄存器项的内容可以包括如下的多个域(字段):
·有效值(Valid):用于表示该备选架构寄存器项是否有效,例如用
“1”表示有效且代表此架构寄存器的源头直接或间接来自于一个过往的指针值读取指令,而用“0”则表示无效;
·取值地址(PC):过往的指针值读取指令的取值地址;
·数据大小(DS):过往的指针值读取指令所读取的指针值的数据大小;
·计算信息(Opinfo):记录了从过往的指针值读取指令所读取的指针值到指针数据地址的一项或多项计算信息。
同样地,在上述域中,如果系统对于指针值的数据大小有固定值,则该项可以不设置;如果系统对于指针值的数据大小没有固定值,软件可以选择不同的数据大小,例如一个字节(byte)、一个字(word)或双字(double word)等。
在本公开的至少一个实施例中,读取架构寄存器表可以是一个形成单独的数据表,例如可以通过硬件实现,也可以复用例如CPU核中原有的某一架构寄存器表,例如,可以选择退休(架构)寄存器表(Retire Reg Map),在该寄存器表中为每一架构寄存器项中增加上述新的域并记录上述信息。
本公开的至少一个实施例提供了一种用于指针数据的预取方法,图6示出了该预取方法的流程图。如图所示,该预取方法包括如下步骤101~104:
步骤101:在指针值读取指令缓存(PLC)查询命中第一数据读取请求。
如上所述,指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个备查指针值读取请求项包括指针数据地址计算信息。当在指针值读取指令缓存(PLC)查询命中第一数据读取请求,则表明该第一数据读取请求是一项指针值读取请求(例如指针值读取指令)。
步骤102:执行第一数据读取请求以获取第一读取数据。
第一数据读取请求是一项指针值读取请求,则第一读取数据为指针值。
步骤103:使用指针值读取指令缓存(PLC)中与第一数据读取请求对应的第一指针数据地址计算信息以及第一读取数据,计算得到第一指针数据预取地址。
使用获取的第一读取数据(指针值)以及根据第一指针数据地址计算信息(其中包括偏移量、缩放量和置信度)计算得到第一指针数据预取地址,例如,在包括置信度的情形,选择置信度大于阈值的偏移量和缩放量的组合来计算得到指针数据预取地址;例如,如果置信度大于阈值的偏移量和缩放量的组合不只一项,则可以计算得到多个指针数据预取地址。
步骤104:使用第一指针数据预取地址发出第一指针数据预取请求。
如上所述,在计算得到多个指针数据预取地址的情形,可以使用该多个指针数据预取地址,产生并发出多个指针数据预取请求,由此产生多笔数据预取,从而提高覆盖率。
在至少一个示例中,第一数据读取请求来自待执行程序或由预取器产生。例如,第一数据读取请求为待执行程序的指令流中待执行的一项指针值读取指令,或者例如由其他预取器(例如Stride预取器)针对例如指针数组产生的指针值预取请求。
在至少一个示例中,响应于预取器表示根据数据预取请求得到的第一读取数据包括除了目标指针值外的其他至少一个指针值,则使用目的指针值计算得到第一指针数据预取地址,并且使用其他至少一个指针值计算得到其他至少一个指针数据预取地址,且使用其他至少一个指针数据预取地址发出其他至少一个指针数据预取请求。
例如,对于指针值请求或预取请求返回的数据往往以缓存行(cacheline)为单位,比如64字节,这通常大于一个指针值本身的大小。若一个指针预取的请求是由其他预取器的预取请求产生的,则通常说明对于指针值的读取具有一定的规律性。比如,由Stride预取器产生的预取请求如果命中了PLC,则说明对于指针值的读取具有固定的步长(Stride),所以一条缓存行里面可能存在多个指针值,其数量n=缓存行大小/步长。因此,在被预取请求的数据返回时,则可以根据步长信息,从缓存行中提取出多个指针值,该多个指针值既包括预取请求本身针对的目的指针值,也包括其他指针值,基于这些指针值可以计算出多个指针数据地址,因此通过一次指针值预取可以产生多个指针数据预取请求。
除Stride预取器之外的其他预取器同样可以捕捉到指针值读取的规律,若其规律暗示在一个缓存行中存在多个指针值,同样也可以发出多个指针预取请求。
在至少一个示例中,上述指针数据的预取方法还包括:在指针值读取指令缓存(PLC)查询命中第一数据读取请求之后,且在执行第一数据读取请求以获取第一读取数据之前,在第一数据读取请求中设置指针数据预取标志,其中,指针数据预取标志用于触发第一指针数据预取请求。
例如,指针数据预取标志可以选择第一数据读取请求中的空余位来设置,或者给第一数据读取请求附加标志位来实现。
在至少一个示例中,执行第一数据读取请求以获取第一读取数据的过程中,对于要读取的第一读取数据(指针值),如果直接在一级缓存(例如,一级数据缓存,L1D)命中,那么可以从一级缓存中直接取得第一读取数据,或者,如果没有在一级缓存命中(即缺失),从一级缓存之后的后级缓存(例如二级缓存、三级缓存等)乃至内存取得第一读取数据。
例如,对于一级缓存,如果查询缺失,则将要读取的目标数据的信息写入到相应的缺失状态保持寄存器(Miss-status Handling Registers,MSHR)中,然后向后一级缓存(对于一级缓存为二级缓存)中请求目标数据,待二级缓存返回目标数据之后,将目标数据填入一级缓存中并例如清除MSHR中与目标数据对应的项。
在至少一个示例中,在指针值读取指令缓存(PLC)查询命中第一数据读取请求,包括:基于第一数据读取请求的取指地址的至少部分在指针值读取指令缓存(PLC)中查询。更具体地,在至少一个示例中,每个备查指针值读取请求项还包括标签(Tag)以用于查询,标签为每个备查指针值读取请求项对应的指针值读取指令的取指地址的至少部分。
在至少一个示例中,每个备查指针值读取请求项还包括被读取指针值数据大小(DS),如上所述,被读取指针值数据大小(DS)为每个备查指针值读取请求项对应的指针值读取指令所读取的指针值数据的大小。
图7示出了根据一个示例的指针数据的预取方法的流程图。如图7所示,在该示例中,
在步骤701,接收到一项读取请求;
在步骤702,在PLC中查询是否命中该读取请求,如果查询命中,则表示该读取请求为一项指针值读取请求并且流程进入到步骤703,如果查询缺失,则结束流程;
在步骤703,从PLC中读取被命中的项中记载的指针数据预取信息(包括指针数据地址计算信息);
在步骤704,在读取请求中设置指针数据预取标志,CPU核根据该指针数据预取标志判断是否进行指针数据预取;
在步骤705,执行读取请求,如果所请求的指针值不在一级数据缓存(L1D Cache)中,则流程前进到步骤706,否则前进到步骤711;
在步骤706,将指针值读取信息写入L1D缓存的MSHR,然后向下级缓存(二级缓存)发出读取请求;
在步骤707,L1D缓存收到从下级缓存返回的被读取的指针值,并且填写到相应的MSHR项中;
在步骤708,读取L1D缓存中相应的MSHR项中的指针值;
在步骤709,指针数据预取器计算指针数据预取地址;
在步骤710,指针数据预取器使用计算得到的指针数据预取地址,发出指针数据预取请求;
在步骤711,也就是在L1D缓存中命中读取请求要读取的指针值的情况下,从L1D缓存中读取指针值;
在步骤712,将从L1D缓存读取得到的指针值发送到指针数据预取器,接下来流程进入到步骤710。
对应于上述预取方法,本公开的至少一实施例提供了一种用于指针数据的预取装置,该预取装置包括:
查询模块,配置为在指针值读取指令缓存(PLC)查询命中第一数据读取请求,其中,指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个备查指针值读取请求项包括指针数据地址计算信息;
执行模块,配置为执行第一数据读取请求以获取第一读取数据;
地址计算模块,配置为使用指针值读取指令缓存(PLC)中与第一数据读取请求对应的第一指针数据地址计算信息以及第一读取数据,计算得到第一指针数据预取地址;
请求发出模块,配置为使用第一指针数据预取地址发出第一指针数据预取请求。
例如,至少一个实施例的预取装置中,上述示例中所描述的指针数据预取器包括上述地址计算模块和请求发出模块。
例如,在至少一个实施例的预取装置中,对于执行模块,执行第一数据读取请求以获取第一读取数据,包括:从一级缓存中直接取得第一读取数据,或者,从一级缓存之后的后级缓存或内存取得第一读取数据。
例如,在至少一个实施例的预取装置中,该预取装置还包括设置模块,该设置模块配置为,在指针值读取指令缓存查询命中第一数据读取请求之后,且在执行第一数据读取请求以获取第一读取数据之前,在第一数据读取请求中设置指针数据预取标志,其中,指针数据预取标志用于触发第一指针数据预取请求。
例如,在至少一个实施例的预取装置中,对于查询模块,在指针值读取指令缓存查询命中第一数据读取请求,包括:基于第一数据读取请求的取指地址的至少部分在指针值读取指令缓存中查询。
例如,在至少一个实施例的预取装置中,每个备查指针值读取请求项还包括标签以用于查询,标签为每个备查指针值读取请求项对应的指针值读取指令的取指地址的至少部分。
例如,在至少一个实施例的预取装置中,每个备查指针值读取请求项还包括被读取指针值数据大小,被读取指针值数据大小为每个备查指针值读取请求项对应的指针值读取指令所读取的指针值数据的大小。
例如,在至少一个实施例的预取装置中,每个备查指针值读取请求项包括的指针数据地址计算信息包括一个或多个偏移值、一个或多个缩放量、一个或多个置信度,一个或多个置信度分别对应于结合一个或多个偏移值和一个或多个缩放量得到的一个或多个组合;一个或多个偏移值和一个或多个缩放量用于取指地址计算,一个或多个置信度用于分别确定一个或多个组合用于取指地址计算的可信度。
例如,在至少一个实施例的预取装置中,对于地址计算模块,使用指针值读取指令缓存中与第一数据读取请求对应的第一指针数据地址计算信息以及第一读取数据,计算得到第一指针数据预取地址,包括:选择置信度大于阈值的偏移量和缩放量的组合来计算得到第一指针数据预取地址。
例如,在至少一个实施例的预取装置中,第一数据读取请求来自待执行程序或由预取器产生的数据预取请求。
例如,在至少一个实施例的预取装置中,响应于预取器表示根据数据预取请求得到的第一读取数据包括除了目标指针值外的其他至少一个指针值,则使用目的指针值计算得到第一指针数据预取地址,并且使用其他至少一个指针值计算得到其他至少一个指针数据预取地址,且使用其他至少一个指针数据预取地址发出其他至少一个指针数据预取请求。
本公开的一些实施例还提供了一种用于指针数据的预取训练方法,该预取训练方法用于对指针值读取指令缓存进行维护,图8示出了该预取方法的流程图。如图8所示,该方法包括如下步骤201~205:
步骤201:接收第一数据读取指令。
例如,第一数据读取指令包括第一源寄存器。
步骤202:在读取架构寄存器表中查询命中第一源寄存器。
如上所述,读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于过往指针值读取指令的指针数据地址计算信息(Opinfo)。
步骤203:根据第一数据读取指令,获取基于第一源寄存器对应的指针值与目的指针数据地址的之间的第一指针数据地址计算信息。
步骤204:在指针值读取指令缓存(PLC)中,更新对应于第一源寄存器的过往指针值读取指令的第一备查指针值读取请求项。
如上所述,指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个备查指针值读取请求项包括指针数据地址计算信息。
步骤205:在第一备查指针值读取请求项写入第一指针数据地址计算信息。
这里,该第一指针数据地址计算信息以用于产生指针数据预取请求。
在至少一个示例中,该预取训练方法还包括:在架构寄存器表中与第一源寄存器对应的架构寄存器项中,写入与第一数据读取指令对应的第一指针数据地址计算信息。
在至少一个示例中,每个备选架构寄存器项还包括用于标识当前备选架构寄存器项是否有效的有效标识,并且在第一源寄存器对应的选架构寄存器项的有效标识为有效值的情形下,才在读取架构寄存器表中确认查询命中第一源寄存器。
在至少一个示例中,每个备查指针值读取请求项还包括被读取指针值数据大小(DS),被读取指针值数据大小(DS)为过往指针值读取指令所读取的指针值数据的大小;使用相应的架构寄存器的过往指针值读取指令的信息包括过往指针值读取指令的取值地址(PC)的至少部分。
在至少一个示例中,在第一备查指针值读取请求项写入第一指针数据地址计算信息,包括:响应于第一备查指针值读取请求项已经记载了与第一指针数据地址计算信息相同的内容,增加第一指针数据地址计算信息对应的置信度。例如,在一项备查指针值读取请求项中,不存在某一偏移量和缩放量组合,则建立该组合,如果已经存在相同的偏移量和缩放量组合,则将该组合对应的置信度增加(例如+1)。
在至少一个示例中,上述预取训练方法还包括更新读取架构寄存器表。
在至少一个示例中,上述预取训练方法还包括,在实际执行使用第一读取数据的第一指针数据读取指令时,如果发生缓存查询缺失(例如L1D缓存),那么将PLC中与第一数据读取请求对应的备查指针值读取请求项复位,例如,清空该备查指针值读取请求项,或者将该备查指针值读取请求项中相关的偏移量和缩放量的组合对应的置信度置零。
图9示出了根据一个示例的指针数据的预取训练方法的流程图。如图9所示,在该示例中,
在步骤901,接收到指令;
在步骤902,判断该指令是否为读取指令,如果是,则流程前进到步骤903,否则流程结束;
在步骤903,根据该读取指令的源寄存器Rs,在读取架构寄存器表中查询与源寄存器Rs相对应的项;
在步骤904,判断是否查询到且查询到的项是有效(valid)的,如果是,则表明该读取指令是一项利用指针值去获得指针数据地址的指针数据读取指令,流程前进到步骤905,否则流程结束;
在步骤905,从读取架构寄存器表中获取与源寄存器Rs相对应的项中的相关信息,该相关信息例如包括PC、DS和Opinfo等域的信息,分别表示产生该指针值的指针值读取指令的取指地址、被读取指针值的数据大小和地址计算信息;
在步骤906,根据该读取指令本身,处理指针值与指针数据地址间的计算信息,以得到的计算信息,不同的指针数据读取指令产生地址的方式可能不同(上述所述的三种方法);
在步骤907,使用上述获取的相关信息中的PC域的值,在PLC中通过标签进行查询,查询到之后将计算信息填写到该PLC的项中。
并且,该得到的计算信息也可以填写到读取架构寄存器表中获取与源寄存器Rs相对应的项中以供后续训练使用。
对应于上述训练方法,本公开的至少一实施例还提供了一种用于指针数据的预取训练装置,该预取训练装置包括:
接收模块,配置为接收第一数据读取指令,其中,第一数据读取指令包括第一源寄存器;
创建/更新模块,配置为在读取架构寄存器表中查询命中第一源寄存器,其中,读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于过往指针值读取指令的指针数据地址计算信息(Opinfo);
获取模块,配置为根据第一数据读取指令,获取基于第一源寄存器对应的指针值与目的指针数据地址的之间的第一指针数据地址计算信息;
更新模块,配置为在指针值读取指令缓存(PLC)中,更新对应于第一源寄存器的过往指针值读取指令的第一备查指针值读取请求项,其中,指针值读取指令缓存(PLC)用于缓存至少一项备查指针值读取请求项,每个备查指针值读取请求项包括指针数据地址计算信息;
写入模块,配置为在第一备查指针值读取请求项写入第一指针数据地址计算信息,以用于产生指针数据预取请求。
例如,在至少一个实施例的预取装置中,该预取装置还包括第二写入模块,该第二写入模块配置为,在架构寄存器表中与第一源寄存器对应的架构寄存器项中,写入与第一数据读取指令对应的第一指针数据地址计算信息。
例如,在至少一个实施例的预取装置中,每个备选架构寄存器项还包括用于标识当前备选架构寄存器项是否有效的有效标识,在第一源寄存器对应的选架构寄存器项的有效标识为有效值的情形下,才在读取架构寄存器表中确认查询命中第一源寄存器。
例如,在至少一个实施例的预取装置中,每个备查指针值读取请求项还包括被读取指针值数据大小,被读取指针值数据大小为过往指针值读取指令所读取的指针值数据的大小;使用相应的架构寄存器的过往指针值读取指令的信息包括过往指针值读取指令的取值地址的至少部分。
例如,在至少一个实施例的预取装置中,对于写入模块,在第一备查指针值读取请求项写入第一指针数据地址计算信息,包括:响应于第一备查指针值读取请求项已经记载了与第一指针数据地址计算信息相同的内容,增加第一指针数据地址计算信息对应的置信度。
本公开的一些实施例还提供了一种用于指针数据的预取训练方法,图10示出了该预取方法的流程图,该预取训练方法用于对读取架构寄存器表进行维护。如图10所示,该方法包括如下步骤301~305:
步骤301:接收第一指令以及获取读取架构寄存器表。
其中,如上所述,读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于过往指针值读取指令的指针数据地址计算信息(Opinfo),且用于更新用于指针数据预取操作的指针值读取指令缓存(PLC)。
步骤302:在第一指令为读取指令的情形下的处理。该处理包括:在读取架构寄存器表中创建或更新对应于读取指令的目的寄存器中的第一备选架构寄存器项,在第一备选架构寄存器项中记载读取指令的信息。
步骤303:在第一指令为计算指令的情形下的处理。该处理包括:获取计算指令基于该计算指令的源寄存器对应的指针值的第一指针数据地址计算信息(Opinfo),在读取架构寄存器表中对应于计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息(Opinfo),在读取架构寄存器表中创建或更新对应于计算指令的目的寄存器的第三备选架构寄存器项,且将第二备选架构寄存器项中记载的内容复制到第三备选架构寄存器项。
上述步骤302和步骤303是二选一的关系。如果是读取指令,则可以根据其目的寄存器,在读取架构寄存器表中开始创建新的项或将已有项进行更新。如果是计算指令,则其是在使用之前读取指令的读取结果,并且该读取结果为源操作数之一,那么该计算指令的目的寄存器可以继承源操作数的属性,因此可以将读取架构寄存器表中源寄存器对应的项的相应信息复制到目的寄存器对应的项中,由此实现信息的传播。
在至少一个示例中,每个备选架构寄存器项还包括用于标识当前备选架构寄存器项是否有效的有效标识,在第二备选架构寄存器项的有效标识为有效值的情形下,才在读取架构寄存器表中对应于计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息(Opinfo)。
在至少一个示例中,更新对应于读取指令的目的寄存器中的第一备选架构寄存器项,包括:将读取架构寄存器表中原有的第一备选架构寄存器项清空。
在至少一个示例中,过往指针值读取指令的信息包括过往指针值读取指令的取值地址(PC)的至少部分;过往指针值读取指令的指针数据地址计算信息(Opinfo)包括使用过往指针值读取指令读取的指针值进行读取地址计算的历史信息。
图11示出了根据一个示例的指针数据的预取训练方法的流程图。如图11所示,在该示例中,
在步骤1101,接收到一项指令;
在步骤1102,判断该指令是否是读取指令(load),如果是,则流程前进到步骤1103,否则前进到步骤1105;
在步骤1103,清空读取架构寄存器表中与该读取指令的目的寄存器对应的项中原有内容;
在步骤1104,将当前的读取指令的取指地址(PC)、读取的数据大小写入到读取架构寄存器表中与该目的寄存器对应的项中,然后前进到步骤1111;
在步骤1105,继续判断该指令是否计算指令,如果是,则前进到步骤1106,否则流程结束;
在步骤1106,在读取架构寄存器表中,查询该计算指令的源寄存器对应的项;
在步骤1107,如果查询命中且源寄存器对应的项,则前进到步骤1108,否则流程结束;
在步骤1108,提取该计算指令中的使用源寄存器计算地址的地址计算信息;
在步骤1109,将地址计算信息写入到读取架构寄存器表中源寄存器对应的项;
在步骤1110,将源寄存器对应的项的PC以及DS域复制到目的寄存器对应的项;
在步骤1111,设置读取架构寄存器表中目的架构寄存器对应的项为有效(valid)。
对应于上述训练方法,本公开的至少一实施例还提供了一种用于指针数据的预取训练装置,该预取训练装置包括:
接收模块,配置为接收第一指令以及获取读取架构寄存器表,其中,读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于过往指针值读取指令的指针数据地址计算信息(Opinfo),且用于更新用于指针数据预取操作的指针值读取指令缓存(PLC);
创建/更新模块,配置为响应于第一指令为读取指令,在读取架构寄存器表中创建或更新对应于读取指令的目的寄存器中的第一备选架构寄存器项,在第一备选架构寄存器项中记载读取指令的信息,或者,
响应于第一指令为计算指令,获取计算指令基于计算指令的源寄存器对应的指针值的第一指针数据地址计算信息(Opinfo),在读取架构寄存器表中对应于计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息(Opinfo),在读取架构寄存器表中创建或更新对应于计算指令的目的寄存器的第三备选架构寄存器项,且将第二备选架构寄存器项中记载的内容复制到第三备选架构寄存器项。
例如,在至少一个实施例的预取装置中,每个备选架构寄存器项还包括用于标识当前备选架构寄存器项是否有效的有效标识,在第二备选架构寄存器项的有效标识为有效值的情形下,才在读取架构寄存器表中对应于计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息。
例如,在至少一个实施例的预取装置中,对于更新模块,更新对应于读取指令的目的寄存器中的第一备选架构寄存器项,包括:将读取架构寄存器表中原有的第一备选架构寄存器项清空。
例如,在至少一个实施例的预取装置中,过往指针值读取指令的信息包括过往指针值读取指令的取值地址的至少部分;过往指针值读取指令的指针数据地址计算信息包括使用过往指针值读取指令读取的指针值进行读取地址计算的历史信息。
本公开的至少一实施例还提供了一种计算机程序的处理装置,包括处理单元和存储器,在该存储器上存储有一个或多个计算机程序模块,其中,所述一个或多个计算机程序模块被配置为由所述处理单元执行时实现如上述任一实施例的预取方法或任一实施例的预取训练方法。
本公开的至少一实施例还提供了一种非瞬时可读存储介质,其中,所述非瞬时可读存储介质上存储有计算机指令,其中,所述计算机指令被处理器执行时实现如上述任一实施例的预取方法或任一实施例的预取训练方法。
本公开的一些实施例还提供了一种电子装置,该电子装置包括上述任一实施例的处理装置或者可执行上述任一实施例的处理方法。
图12为本公开至少一个实施例提供的一种电子装置的示意图。本公开实施例中的电子装置可以包括但不限于诸如笔记本电脑、PDA(个人数字助理)、PAD(平板电脑)等的移动终端以及诸如台式计算机等固定终端。
图12示出的电子装置1000仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。例如,如图12所示,在一些示例中,电子装置1000包括本公开实施例的图像处理装置,该图像处理装置可以根据存储在只读存储器(ROM)1002中的程序或者从存储装置1008加载到随机访问存储器(RAM)1003中的程序而执行各种适当的动作和处理,例如本公开实施例的计算机程序的处理方法。在RAM 1003中,还存储有计算机系统操作所需的各种程序和数据。处理器1001、ROM 1002以及RAM 1003通过总线1004被此相连。输入/输出(I/O)接口1005也连接至总线1004。
例如,以下部件可以连接至I/O接口1005:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置1006;包括诸如液晶显示器(LCD)、扬声器、振动器等的输出装置1007;包括例如磁带、硬盘等的存储装置1008;例如还可以包括诸如LAN卡、调制解调器等的网络接口卡的通信装置1009。通信装置1009可以允许电子装置1000与其他设备进行无线或有线通信以交换数据,经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸存储介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储装置1008。
虽然图12示出了包括各种装置的电子装置1000,但是应理解的是,并不要求实施或包括所有示出的装置。可以替代地实施或包括更多或更少的装置。
例如,该电子装置1000还可以进一步包括外设接口(图中未示出)等。该外设接口可以为各种类型的接口,例如为USB接口、闪电(lighting)接口等。该通信装置1009可以通过无线通信来与网络和其他设备进行通信,该网络例如为因特网、内部网和/或诸如蜂窝电话网络之类的无线网络、无线局域网(LAN)和/或城域网(MAN)。无线通信可以使用多种通信标准、协议和技术中的任何一种,包括但不局限于全球移动通信系统(GSM)、增强型数据GSM环境(EDGE)、宽带码分多址(W-CDMA)、码分多址(CDMA)、时分多址(TDMA)、蓝牙、Wi-Fi(例如基于IEEE 802.11a、IEEE 802.11b、IEEE 802.11g和/或IEEE 802.11n标准)、基于因特网协议的语音传输(VoIP)、Wi-MAX,用于电子邮件、即时消息传递和/或短消息服务(SMS)的协议,或任何其他合适的通信协议。
对于本公开,还有以下几点需要说明:
(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
(2)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
以上仅是本公开的示范性实施方式,而非用于限制本公开的保护范围,本公开的保护范围由所附的权利要求确定。
Claims (31)
1.一种用于指针数据的预取方法,包括:
在指针值读取指令缓存查询命中第一数据读取请求,其中,所述指针值读取指令缓存用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;
执行所述第一数据读取请求以获取第一读取数据;
使用所述指针值读取指令缓存中与所述第一数据读取请求对应的第一指针数据地址计算信息以及所述第一读取数据,计算得到第一指针数据预取地址;
使用所述第一指针数据预取地址发出第一指针数据预取请求。
2.根据权利要求1所述的预取方法,其中,执行所述第一数据读取请求以获取所述第一读取数据,包括:
从一级缓存中直接取得所述第一读取数据,或者,
从所述一级缓存之后的后级缓存或内存取得所述第一读取数据。
3.根据权利要求1所述的预取方法,还包括:
在所述指针值读取指令缓存查询命中所述第一数据读取请求之后,且在执行所述第一数据读取请求以获取所述第一读取数据之前,在所述第一数据读取请求中设置指针数据预取标志,其中,所述指针数据预取标志用于触发所述第一指针数据预取请求。
4.根据权利要求1所述的预取方法,其中,在所述指针值读取指令缓存查询命中所述第一数据读取请求,包括:
基于所述第一数据读取请求的取指地址的至少部分在所述指针值读取指令缓存中查询。
5.根据权利要求4所述的预取方法,其中,每个所述备查指针值读取请求项还包括标签以用于查询,
所述标签为每个所述备查指针值读取请求项对应的指针值读取指令的取指地址的至少部分。
6.根据权利要求1所述的预取方法,其中,每个所述备查指针值读取请求项还包括被读取指针值数据大小,所述被读取指针值数据大小为每个所述备查指针值读取请求项对应的指针值读取指令所读取的指针值数据的大小。
7.根据权利要求1所述的预取方法,其中,每个所述备查指针值读取请求项包括的指针数据地址计算信息包括一个或多个偏移值、一个或多个缩放量、一个或多个置信度,
所述一个或多个置信度分别对应于结合所述一个或多个偏移值和一个或多个缩放量得到的一个或多个组合;
所述一个或多个偏移值和所述一个或多个缩放量用于取指地址计算,所述一个或多个置信度用于分别确定所述一个或多个组合用于所述取指地址计算的可信度。
8.根据权利要求7所述的预取方法,其中,使用所述指针值读取指令缓存中与所述第一数据读取请求对应的第一指针数据地址计算信息以及所述第一读取数据,计算得到第一指针数据预取地址,包括:
选择置信度大于阈值的偏移量和缩放量的组合来计算得到所述第一指针数据预取地址。
9.根据权利要求1所述的预取方法,其中,所述第一数据读取请求来自待执行程序或由预取器产生的数据预取请求。
10.根据权利要求9所述的预取方法,其中,响应于所述预取器表示根据所述数据预取请求得到的所述第一读取数据包括除了目标指针值外的其他至少一个指针值,则使用目的指针值计算得到所述第一指针数据预取地址,并且使用所述其他至少一个指针值计算得到其他至少一个指针数据预取地址,且使用所述其他至少一个指针数据预取地址发出其他至少一个指针数据预取请求。
11.一种用于指针数据的预取训练方法,包括:
接收第一数据读取指令,其中,所述第一数据读取指令包括第一源寄存器;
在读取架构寄存器表中查询命中所述第一源寄存器,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息;
根据所述第一数据读取指令,获取基于所述第一源寄存器对应的指针值与目的指针数据地址的之间的第一指针数据地址计算信息;
在指针值读取指令缓存中,更新对应于所述第一源寄存器的过往指针值读取指令的第一备查指针值读取请求项,其中,所述指针值读取指令缓存用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;
在所述第一备查指针值读取请求项写入所述第一指针数据地址计算信息,以用于产生指针数据预取请求。
12.根据权利要求11所述的预取训练方法,还包括:
在所述架构寄存器表中与所述第一源寄存器对应的架构寄存器项中,写入与所述第一数据读取指令对应的第一指针数据地址计算信息。
13.根据权利要求11所述的预取训练方法,其中,每个所述备选架构寄存器项还包括用于标识当前备选架构寄存器项是否有效的有效标识,
在所述第一源寄存器对应的选架构寄存器项的有效标识为有效值的情形下,才在所述读取架构寄存器表中确认查询命中所述第一源寄存器。
14.根据权利要求11所述的预取训练方法,其中,每个所述备查指针值读取请求项还包括被读取指针值数据大小,所述被读取指针值数据大小为所述过往指针值读取指令所读取的指针值数据的大小;
使用相应的架构寄存器的过往指针值读取指令的信息包括所述过往指针值读取指令的取值地址的至少部分。
15.根据权利要求11所述的预取训练方法,其中,在所述第一备查指针值读取请求项写入所述第一指针数据地址计算信息,包括:
响应于所述第一备查指针值读取请求项已经记载了与所述第一指针数据地址计算信息相同的内容,增加所述第一指针数据地址计算信息对应的置信度。
16.一种用于指针数据的预取训练方法,包括:
接收第一指令以及获取读取架构寄存器表,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息,且用于更新用于指针数据预取操作的指针值读取指令缓存;
响应于所述第一指令为读取指令,在所述读取架构寄存器表中创建或更新对应于所述读取指令的目的寄存器中的第一备选架构寄存器项,在所述第一备选架构寄存器项中记载所述读取指令的信息,或者,
响应于第一指令为计算指令,获取所述计算指令基于所述计算指令的源寄存器对应的指针值的第一指针数据地址计算信息,在所述读取架构寄存器表中对应于所述计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息,在所述读取架构寄存器表中创建或更新对应于所述计算指令的目的寄存器的第三备选架构寄存器项,且将所述第二备选架构寄存器项中记载的内容复制到所述第三备选架构寄存器项。
17.根据权利要求16所述的预取训练方法,其中,每个所述备选架构寄存器项还包括用于标识当前备选架构寄存器项是否有效的有效标识,
在所述第二备选架构寄存器项的有效标识为有效值的情形下,才在所述读取架构寄存器表中对应于所述计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息。
18.根据权利要求16所述的预取训练方法,其中,所述更新对应于所述读取指令的目的寄存器中的第一备选架构寄存器项,包括:
将读取架构寄存器表中原有的第一备选架构寄存器项清空。
19.根据权利要求16所述的预取训练方法,其中,所述过往指针值读取指令的信息包括所述过往指针值读取指令的取值地址的至少部分;
所述过往指针值读取指令的指针数据地址计算信息包括使用所述过往指针值读取指令读取的指针值进行读取地址计算的历史信息。
20.一种用于指针数据的预取装置,包括:
查询模块,配置为在指针值读取指令缓存查询命中第一数据读取请求,其中,所述指针值读取指令缓存用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;
执行模块,配置为执行所述第一数据读取请求以获取第一读取数据;
地址计算模块,配置为使用所述指针值读取指令缓存中与所述第一数据读取请求对应的第一指针数据地址计算信息以及所述第一读取数据,计算得到第一指针数据预取地址;
请求发出模块,配置为使用所述第一指针数据预取地址发出第一指针数据预取请求。
21.根据权利要求20所述的预取装置,其中,所述执行模块进一步配置为:
从一级缓存中直接取得所述第一读取数据,或者,
从所述一级缓存之后的后级缓存或内存取得所述第一读取数据。
22.根据权利要求20所述的预取装置,其中,每个所述备查指针值读取请求项包括的指针数据地址计算信息包括一个或多个偏移值、一个或多个缩放量、一个或多个置信度,
所述一个或多个置信度分别对应于结合所述一个或多个偏移值和一个或多个缩放量得到的一个或多个组合;
所述一个或多个偏移值和所述一个或多个缩放量用于取指地址计算,所述一个或多个置信度用于分别确定所述一个或多个组合用于所述取指地址计算的可信度。
23.根据权利要求20所述的预取装置,其中,所述第一数据读取请求来自待执行程序或由预取器产生的数据预取请求。
24.一种用于指针数据的预取训练装置,包括:
接收模块,配置为接收第一数据读取指令,其中,所述第一数据读取指令包括第一源寄存器;
查询模块,配置为在读取架构寄存器表中查询命中所述第一源寄存器,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息;
获取模块,配置为根据所述第一数据读取指令,获取基于所述第一源寄存器对应的指针值与目的指针数据地址的之间的第一指针数据地址计算信息;
更新模块,配置为在指针值读取指令缓存中,更新对应于所述第一源寄存器的过往指针值读取指令的第一备查指针值读取请求项,其中,所述指针值读取指令缓存用于缓存至少一项备查指针值读取请求项,每个所述备查指针值读取请求项包括指针数据地址计算信息;
写入模块,配置为在所述第一备查指针值读取请求项写入所述第一指针数据地址计算信息,以用于产生指针数据预取请求。
25.根据权利要求24所述的预取训练装置,其中,每个所述备查指针值读取请求项还包括被读取指针值数据大小,所述被读取指针值数据大小为所述过往指针值读取指令所读取的指针值数据的大小;
使用相应的架构寄存器的过往指针值读取指令的信息包括所述过往指针值读取指令的取值地址的至少部分。
26.根据权利要求24所述的预取训练装置,其中,所述写入模块进一步配置为:
响应于所述第一备查指针值读取请求项已经记载了与所述第一指针数据地址计算信息相同的内容,增加所述第一指针数据地址计算信息对应的置信度。
27.一种用于指针数据的预取训练装置,包括:
接收模块,配置为接收第一指令以及获取读取架构寄存器表,其中,所述读取架构寄存器表用于记录至少一个备选架构寄存器项,并且每个所述备选架构寄存器项包括使用相应的架构寄存器的过往指针值读取指令的信息以及基于所述过往指针值读取指令的指针数据地址计算信息,且用于更新用于指针数据预取操作的指针值读取指令缓存;
创建/更新模块,配置为响应于所述第一指令为读取指令,在所述读取架构寄存器表中创建或更新对应于所述读取指令的目的寄存器中的第一备选架构寄存器项,在所述第一备选架构寄存器项中记载所述读取指令的信息,或者,
响应于第一指令为计算指令,获取所述计算指令基于所述计算指令的源寄存器对应的指针值的第一指针数据地址计算信息,在所述读取架构寄存器表中对应于所述计算指令的源寄存器中的第二备选架构寄存器项中记载第一指针数据地址计算信息,在所述读取架构寄存器表中创建或更新对应于所述计算指令的目的寄存器的第三备选架构寄存器项,且将所述第二备选架构寄存器项中记载的内容复制到所述第三备选架构寄存器项。
28.根据权利要求27所述的预取训练装置,其中,所述创建/更新模块进一步配置为:
将读取架构寄存器表中原有的第一备选架构寄存器项清空,以更新对应于所述读取指令的目的寄存器中的第一备选架构寄存器项。
29.根据权利要求27所述的预取训练装置,其中,所述过往指针值读取指令的信息包括所述过往指针值读取指令的取值地址的至少部分;
所述过往指针值读取指令的指针数据地址计算信息包括使用所述过往指针值读取指令读取的指针值进行读取地址计算的历史信息。
30.一种计算机程序的处理装置,包括:
处理单元;
存储器,其上存储有一个或多个计算机程序模块,
其中,所述一个或多个计算机程序模块被配置为由所述处理单元执行时实现如权利要求1-10中任一所述的预取方法或权利要求11-19中任一所述的预取训练方法。
31.一种非瞬时可读存储介质,其中,所述非瞬时可读存储介质上存储有计算机指令,其中,所述计算机指令被处理器执行时实现如权利要求1-10中任一所述的预取方法或权利要求11-19中任一所述的预取训练方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211726101.8A CN115934170A (zh) | 2022-12-29 | 2022-12-29 | 预取方法及装置、预取训练方法及装置、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211726101.8A CN115934170A (zh) | 2022-12-29 | 2022-12-29 | 预取方法及装置、预取训练方法及装置、存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115934170A true CN115934170A (zh) | 2023-04-07 |
Family
ID=86555973
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211726101.8A Pending CN115934170A (zh) | 2022-12-29 | 2022-12-29 | 预取方法及装置、预取训练方法及装置、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115934170A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117609110A (zh) * | 2023-12-19 | 2024-02-27 | 北京开源芯片研究院 | 一种缓存方法、高速缓存、电子设备及可读存储介质 |
-
2022
- 2022-12-29 CN CN202211726101.8A patent/CN115934170A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117609110A (zh) * | 2023-12-19 | 2024-02-27 | 北京开源芯片研究院 | 一种缓存方法、高速缓存、电子设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7739477B2 (en) | Multiple page size address translation incorporating page size prediction | |
JP3977015B2 (ja) | リネームタグのスワッピングにより転送を行なうレジスタリネーミング | |
Hsu et al. | Prefetching in supercomputer instruction caches | |
US7707397B2 (en) | Variable group associativity branch target address cache delivering multiple target addresses per cache line | |
JP3871883B2 (ja) | 間接分岐ターゲットを計算するための方法 | |
US8683136B2 (en) | Apparatus and method for improving data prefetching efficiency using history based prefetching | |
US20080065809A1 (en) | Optimized software cache lookup for simd architectures | |
US11176055B1 (en) | Managing potential faults for speculative page table access | |
JPH1074166A (ja) | 多重レベル・ダイナミック・セット予測方法および装置 | |
US9690707B2 (en) | Correlation-based instruction prefetching | |
KR20180040151A (ko) | 명령 인코딩을 기반으로 한 프리페치 명령들의 결정 | |
CN115934170A (zh) | 预取方法及装置、预取训练方法及装置、存储介质 | |
US6363471B1 (en) | Mechanism for handling 16-bit addressing in a processor | |
WO2018057273A1 (en) | Reusing trained prefetchers | |
US11847053B2 (en) | Apparatuses, methods, and systems for a duplication resistant on-die irregular data prefetcher | |
US20070022270A1 (en) | Translation lookaside buffer prediction mechanism | |
EP4127917B1 (en) | Fetch stage handling of indirect jumps in a processor pipeline | |
US11500779B1 (en) | Vector prefetching for computing systems | |
CN113849222A (zh) | 流水线化乱序页未命中处理程序 | |
CN113885943A (zh) | 处理单元、片上系统、计算装置及方法 | |
CN115080464B (zh) | 数据处理方法和数据处理装置 | |
CN112559389A (zh) | 存储控制装置、处理装置、计算机系统和存储控制方法 | |
CN112579170B (zh) | 一种用于减少虚拟地址计算的处理器及其方法 | |
CN117289995B (zh) | 指令处理方法以及处理器 | |
US11481331B2 (en) | Promoting prefetched data from a cache memory to registers in a processor |
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 |