CN117251387A - 一种数据预取方法、编译方法及相关装置 - Google Patents
一种数据预取方法、编译方法及相关装置 Download PDFInfo
- Publication number
- CN117251387A CN117251387A CN202210654495.4A CN202210654495A CN117251387A CN 117251387 A CN117251387 A CN 117251387A CN 202210654495 A CN202210654495 A CN 202210654495A CN 117251387 A CN117251387 A CN 117251387A
- Authority
- CN
- China
- Prior art keywords
- data
- metadata
- address
- instruction
- data structure
- 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
- 238000000034 method Methods 0.000 title claims abstract description 125
- 230000008569 process Effects 0.000 claims abstract description 33
- 238000003860 storage Methods 0.000 claims description 61
- 238000004590 computer program Methods 0.000 claims description 6
- 238000010586 diagram Methods 0.000 description 21
- 238000004891 communication Methods 0.000 description 16
- 238000012545 processing Methods 0.000 description 15
- 230000006399 behavior Effects 0.000 description 10
- 238000005457 optimization Methods 0.000 description 9
- 238000005516 engineering process Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 7
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 230000001788 irregular Effects 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 238000012795 verification Methods 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 238000007667 floating Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000001356 surgical procedure Methods 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0862—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
一种数据预取方法以及编译方法,能够对链式数据结构中的数据实现有效预取。本方案中,在编译过程中识别到访问链式数据结构的代码时,则生成数据访问指令以及用于指示链式数据结构中数据的地址的元数据,并且生成预取指令,以指示数据访问指令的地址以及该元数据。这样一来,运行设备在执行编译得到的可执行文件时,能够根据预取指令确定数据访问指令以及元数据,从而实现链式数据结构中的数据预取;并且,运行设备在基于预取指令获取到数据访问指令的地址后,能够根据数据访问指令的访问次数来获知链式数据结构中的数据访问进度,从而适应性地调整预取数据的数量,保证链式数据结构中数据的有效预取。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种数据预取方法、编译方法及相关装置。
背景技术
在计算机系统中,不同存储设备的访问速度通常不同。在具有多级存储系统的计算机中,计算机通常采用数据预取技术来提高系统的访问性能。具体地,计算机会对待访问的数据进行预测,并提前将预测的数据从访问速度较慢的存储设备中加载到访问速度较快的存储设备中,例如将预测的数据从内存中加载到缓存(cache)中。
目前,现有的数据预取技术通常是根据历史访存信息来预取待访问的数据。例如,计算机通过检测历史访存信息发现程序以地址递增的方式来访问数据时,计算机则基于当前所访问的数据以及相同的地址递增方式来预取待访问的数据。
然而,目前的数据预取技术只能够对存储地址具有一定规律的数据实现有效预取,例如存储地址连续的数据或者是存储地址以一定数值递增的数据。对于存储地址无规律可循的链式数据结构中的数据,当前的数据预取技术难以实现数据的有效预取。其中,链式数据结构中通常包括多个分散存储的数据,且链式数据结构中包括指针的数据会指向下一个数据所存储的地址。目前的数据预取技术在对链式数据结构中的数据进行预取时,往往难以确定数据的预取数量可能会一次性预取过多的数据而导致缓存污染,或者是数据预取过少而达不到提高数据访问性能的目的。
因此,目前亟需一种能够对链式数据结构中的数据实现有效预取的方法。
发明内容
本申请提供了一种数据预取方法,能够对链式数据结构中的数据实现有效预取。
本申请第一方面提供一种数据预取方法,所述方法应用于计算机系统的第一实例,且所述计算机系统还包括第二实例。具体地,该数据预取方法包括:第一实例获取可执行文件中的预取指令,所述预取指令用于指示数据访问指令的地址以及至少一个元数据,所述数据访问指令用于指示链式数据结构的地址,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据用于指示链式数据结构中的数据的地址。其中,链式数据结构的地址可以是指链式数据结构中任意一个数据的地址。链式数据结构的地址可以是根据链式数据结构中第一个需要访问的数据的地址来确定的,例如链式数据结构中第一个需要访问的数据为链式数据结构中的首个数据,那么数据访问指令则指示链式数据结构中首个数据的地址。此外,链式数据结构的地址可以是指示具体的单个地址,例如存储某个数据的起始地址;链式数据结构的地址也可以是指示一个地址段,例如存储某个数据的地址段。
然后,所述第一实例根据所述数据访问指令的地址,获取所述链式数据结构的地址。并且,所述第一实例根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据。
此外,所述第二实例执行所述数据访问指令,以访问所述链式数据结构中的数据。
具体地,所述第一实例在预取所述链式数据结构中数据的过程中,所述第一实例根据所述第二实例执行所述数据访问指令的次数来控制预取所述链式数据结构中数据的进度,所述进度用于使所述链式数据结构中的数据在被访问前已预取到缓存中。
本方案中,运行设备在执行可执行文件时,能够根据可执行文件中的预取指令确定数据访问指令以及至少一个元数据,从而实现链式数据结构中的数据预取;并且,运行设备在基于预取指令获取到数据访问指令的地址后,则能够根据数据访问指令的访问次数来获知链式数据结构中的数据访问进度,从而控制预取所述链式数据结构中数据的进度,即适应性地调整预取数据的数量,保证链式数据结构中数据的有效预取。
需要说明的是,在第一实例预取链式数据结构中的数据的过程中,第一实例所预取得到的数据可以是不包括指向其他数据的指针;或者第一实例预取得到的所有数据中的部分数据包括指向其他数据的指针,而另一部分数据则不包括指向其他数据的指针。类似地,第二实例执行数据访问指令的过程中,第二实例所访问的数据也可以是不包括指向其他数据的指针;或者第二实例所访问的所有数据中的部分数据包括指向其他数据的指针,而另一部分数据则不包括指向其他数据的指针。
在一种可能的实现方式中,在所述第一实例预取所述链式数据结构中数据的过程中,已预取数据的数量与已访问数据的数量之间的差值在预设范围内。例如,假设预设范围为5-10,那么第一实例可以则控制链式数据结构中的数据的预取数量始终比实际已访问的数据个数多5-10个,以在保证预取的及时性的同时,避免预取数据过多而污染缓存。此外,第一实例在预取数据的过程中,可以根据数据的进度以及运行设备的可用缓存空间,动态地调整上述的预设范围,以保证数据预取数量以及可用缓存空间之间的平衡。
在一种可能的实现方式中,所述链式数据结构中的数据包括用于指向所述链式数据结构内其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置。
所述第一实例根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据,包括:所述第一实例根据所述链式数据结构的地址,预取所述链式数据结构中的数据;所述第一实例根据所述链式数据结构中的已预取数据和所述已预取数据对应的元数据,获取所述已预取数据中的指针;所述第一实例根据所述已预取数据中的指针所指向的地址,从所述链式数据结构中预取所述已预取数据所指向的其他数据。
在一种可能的实现方式中,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。也就是说,对于某一个元数据而言,该元数据还用于指示自身所对应的数据中的指针所指向的其他数据的大小。例如,假设元数据1与数据1对应,数据1中的指针指向数据2;那么,元数据1还用于指示数据1中的指针所指向的数据2的大小。
在一种可能的实现方式中,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
本方案中,通过在元数据中指示数据的数据类型,能够确定元数据所指示的指针实际上是指向哪个数据,从而确定链式数据结构中的数据的链接关系,以便于运行设备能够在复杂的链式数据结构中有效地实现数据的预取。
在一种可能的实现方式中,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
本方案中,通过在预取指令中指示其与数据访问指令之间的地址偏移,能够减少对预取指令的编码空间占用,从而节省指令开销。
在一种可能的实现方式中,所述预取指令具体用于指示所述至少一个元数据的地址;所述方法还包括:所述第一实例根据所述至少一个元数据的地址,获取所述至少一个元数据。
本方案中,通过在预取指令中指示元数据的存储地址,能够避免在预取指令中直接存放元数据,减少对预取指令的编码空间占用,从而节省指令开销。
在一种可能的实现方式中,所述至少一个元数据的大小相同,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量;所述第一实例根据所述至少一个元数据的存储地址,获取所述至少一个元数据,包括:所述第一实例根据所述至少一个元数据的数量和大小,从所述至少一个元数据的起始存储地址开始获取所述至少一个元数据。
本申请第二方面提供一种编译方法,包括:编译器获取第一代码;其中,第一代码可以是指程序源代码,例如基于java,c,c++,python等高级语言编写成的代码。
在识别到所述第一代码中存在请求访问链式数据结构的代码时,编译器根据所述链式数据结构生成数据访问指令和至少一个元数据,其中,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据分别用于指示所述链式数据结构中数据的地址,所述数据访问指令用于指示所述链式数据结构的地址以及请求访问所述链式数据结构。
最后,编译器根据所述至少一个元数据和所述数据访问指令生成预取指令,以得到编译后的第二代码,所述预取指令用于指示所述数据访问指令的地址以及所述至少一个元数据。
本方案中,通过在编译过程中识别到访问链式数据结构的代码时,则生成数据访问指令以及用于指示链式数据结构中的待访问数据的地址的至少一个元数据,并且在数据访问指令前插入预取指令,以指示数据访问指令的地址以及该至少一个元数据。这样一来,运行设备在执行编译得到的可执行文件时,能够根据预取指令确定数据访问指令以及至少一个元数据,从而实现链式数据结构中的数据预取;并且,运行设备在基于预取指令获取到数据访问指令的地址后,则能够根据数据访问指令的访问次数来获知链式数据结构中的数据访问进度,从而适应性地调整预取数据的数量,保证链式数据结构中数据的有效预取。
在一种可能的实现方式中,所述链式数据结构中的数据包括用于指向其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置。
在一种可能的实现方式中,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
在一种可能的实现方式中,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
在一种可能的实现方式中,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
在一种可能的实现方式中,所述预取指令具体用于指示所述至少一个元数据的地址。
在一种可能的实现方式中,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量,所述至少一个元数据的大小相同。
在一种可能的实现方式中,所述至少一个元数据位于第二代码中的代码段或数据段,所述第二代码是基于所述第一代码编译得到的。
本申请第三方面提供一种数据预取装置,包括:
获取单元,用于获取预取指令,其中所述预取指令用于指示数据访问指令的地址以及至少一个元数据,所述数据访问指令用于指示链式数据结构的地址,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据用于指示链式数据结构中的数据的地址;
所述获取单元,还用于根据所述数据访问指令的地址,获取所述链式数据结构的地址;
预取单元,用于根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据;
执行单元,用于执行所述数据访问指令,以访问所述链式数据结构中的数据;
其中,所述第一实例在预取所述链式数据结构中数据的过程中,所述第一实例根据所述第二实例执行所述数据访问指令的次数来控制预取所述链式数据结构中数据的进度,所述进度用于使所述链式数据结构中的数据在被访问前已预取到缓存中。
在一种可能的实现方式中,在所述预取单元预取所述链式数据结构中数据的过程中,已预取数据的数量与已访问数据的数量之间的差值在预设范围内。
在一种可能的实现方式中,所述链式数据结构中的数据包括用于指向所述链式数据结构内其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置;
所述预取单元,具体用于:根据所述链式数据结构的地址,预取所述链式数据结构中的数据;根据所述链式数据结构中的已预取数据和所述已预取数据对应的元数据,获取所述已预取数据中的指针;根据所述已预取数据中的指针所指向的地址,从所述链式数据结构中预取所述已预取数据所指向的其他数据。
在一种可能的实现方式中,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
在一种可能的实现方式中,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
在一种可能的实现方式中,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
在一种可能的实现方式中,所述预取指令具体用于指示所述至少一个元数据的地址;
所述获取单元还用于:根据所述至少一个元数据的地址,获取所述至少一个元数据。
在一种可能的实现方式中,所述至少一个元数据的大小相同,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量;
所述获取单元还用于:根据所述至少一个元数据的数量和大小,从所述至少一个元数据的起始地址开始获取所述至少一个元数据。
本申请第四方面提供一种编译装置,包括:
获取单元,用于获取第一代码;
处理单元,用于在识别到所述第一代码中存在请求访问链式数据结构的代码时,根据所述链式数据结构生成数据访问指令和至少一个元数据,其中,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据分别用于指示所述链式数据结构中数据的地址,所述数据访问指令用于指示所述链式数据结构的地址以及请求访问所述链式数据结构;
所述处理单元,还用于根据所述至少一个元数据和所述数据访问指令生成预取指令,以得到编译后的第二代码,所述预取指令用于指示所述数据访问指令的地址以及所述至少一个元数据。
在一种可能的实现方式中,所述链式数据结构中的数据包括用于指向其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置。
在一种可能的实现方式中,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
在一种可能的实现方式中,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
在一种可能的实现方式中,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
在一种可能的实现方式中,所述预取指令具体用于指示所述至少一个元数据的地址。
在一种可能的实现方式中,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量,所述至少一个元数据的大小相同。
在一种可能的实现方式中,所述至少一个元数据位于第二代码中的代码段或数据段,所述第二代码是基于所述第一代码编译得到的。
本申请第五方面提供一种电子设备,该电子设备包括:存储器和处理器;所述存储器存储有代码,所述处理器被配置为执行所述代码,当所述代码被执行时,所述电子设备执行如第一方面或第二方面中的任意一种实现方式的方法。
本申请第六方面提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机程序,当其在计算机上运行时,使得计算机执行如第一方面或第二方面中的任意一种实现方式的方法。
本申请第七方面提供一种计算机程序产品,当其在计算机上运行时,使得计算机执行如第一方面或第二方面中的任意一种实现方式的方法。
本申请第八方面提供一种芯片,包括一个或多个处理器。处理器中的部分或全部用于读取并执行存储器中存储的计算机程序,以执行上述任一方面任意可能的实现方式中的方法。
可选地,该芯片该包括存储器,该存储器与该处理器通过电路或电线与存储器连接。可选地,该芯片还包括通信接口,处理器与该通信接口连接。通信接口用于接收需要处理的数据和/或信息,处理器从该通信接口获取该数据和/或信息,并对该数据和/或信息进行处理,并通过该通信接口输出处理结果。该通信接口可以是输入输出接口。本申请提供的方法可以由一个芯片实现,也可以由多个芯片协同实现。
本申请第二方面至第八方面的有益效果可以参考本申请第一方面的介绍,在此不再赘述。
附图说明
图1为本申请实施例提供的一种链式数据结构的示意图;
图2为本申请实施例提供的多种不同的链式数据结构的示意图;
图3为本申请实施例提供的一种运行设备执行应用程序的示意图;
图4为本申请实施例提供的一种编译方法的流程示意图;
图5为本申请实施例提供的一种链式数据结构中的数据与元数据之间的对应示意图;
图6为本申请实施例一种链式数据结构中的数据的类型的示意图;
图7为本申请实施例提供的一种数据预取方法的流程示意图;
图8为本申请实施例提供的一种系统架构示意图;
图9为本申请实施例提供的一种编译方法的流程示意图;
图10A为本申请实施例提供的一种基于现有编译器对验证程序进行编译的示意图;
图10B为本申请实施例提供的一种基于新增优化PASS的编译器对验证程序进行编译的示意图;
图11为本申请实施例提供的一种数据预取方法的流程示意图;
图12为本申请实施例提供的一种编译装置1200的结构示意图;
图13为本申请实施例提供的一种数据预取装置1300的结构示意图;
图14为本申请实施例提供的一种计算机可读存储介质的结构示意图。
具体实施方式
下面结合本申请实施例中的附图对本申请实施例进行描述。本申请的实施方式部分使用的术语仅用于对本申请的具体实施例进行解释,而非旨在限定本申请。
下面结合附图,对本申请的实施例进行描述。本领域普通技术人员可知,随着技术的发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的术语在适当情况下可以互换,这仅仅是描述本申请的实施例中对相同属性的对象在描述时所采用的区分方式。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,以便包含一系列单元的过程、方法、系统、产品或设备不必限于那些单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它单元。
为便于理解,以下将对本申请实施例所涉及的技术术语进行解释。
链式数据结构:链式数据结构中包括地址不连续的多个数据,且多个数据相互间具有地址指向关系,即链式数据结构中的前一个数据指向了下一个数据的地址。请参阅图1,图1为本申请实施例提供的一种链式数据结构的示意图。如图1所示,链式数据结构中的每个数据包括两部分,一部分为有效数据部分,另一部分为指针部分,且指针部分用于指向当前数据所链接的下一个数据的地址。简单来说,链式数据结构是用指针来体现数据元素之间的逻辑关系的。这样一来,在访问链式数据结构的过程中,通常是从前往后依次进行访问,即先访问前一个数据,才能够基于前一个数据所指示的地址来访问下一个数据。
通常,链式数据结构的结构形式主要包括单向链表、双向链表、环形链表、脊柱-肋骨(Backbone-rib)链表、二叉树结构以及结构体数组结构。其中,结构体数组结构是指在连续内存中保存结构体数组,且结构体内具有指针。示例性地,请参阅图2,图2为本申请实施例提供的多种不同的链式数据结构的示意图。图2中的(1)所展示的是Backbone-rib链表,图2中的(2)所展示的是二叉树结构,图2中的(3)所展示的是结构体数组结构。
目前,链式数据结构主要是由动态连接的数据组成,通常表现为树/图/链表的形式。链式数据结构被广泛的应用在通用计算,高性能计算(High Performance Computing,HPC),数据库和人工智能领域。同时也是C++/Java等面向对象编程语言提供的容器的底层实现的重要数据结构。链式数据结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但链式数据结构的缺点是数据之间没有空间局部性,因此对链式数据结构的读取大多是一种典型的非规则内存访问,容易造成访存延迟,限制中央运行设备(centralprocessing unit,CPU)性能的发挥,在不同应用场景中表现为性能瓶颈。
访存延迟:访存延迟是指等待对系统内存中存储数据的访问完成时引起的延期。
编译:是指利用编译程序从源语言编写的源程序产生目标代码的过程。目标代码是介于高级语言和机器语言之间的语言。目标代码能够被进一步转换为可执行的二进制机器代码。简单来说,编译是将由高级语言编写的源程序转换为由更接近机器语言的目标代码。由于计算机只认识1和0,因此编译实际上就是把人们熟悉的高级语言变成计算机可以识别的2进制语言。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。
中间代码:是源程序的一种内部表示,又可以称为中间表示(IntermediateRepresentation,IR)。中间表示的作用是可使编译程序的结构在逻辑上更为简单明确,特别是使目标代码的优化比较容易实现。中间表示的复杂性介于源程序语言和机器语言之间。
代码优化:是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。
优化Pass:优化Pass是编译框架中的重要部分。优化Pass对中间表示进行分析和修改。在代码优化的过程中,由多个优化Pass对中间表示进行分析和修改,每个Pass完成特定的优化工作。
指令计数器(Program Counter,PC):一种寄存器,用于存储运行设备要执行的下一条指令的地址。
元数据(Metadata):元数据,又称中介数据、中继数据,为描述数据的一种数据(data about data)。元数据主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。具体来说,元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
一般来说,应用程序是由程序代码段、数据段以及只读数据段等程序段构成,程序代码段是由一条条连续的指令所构成。在应用程序的执行过程中,操作系统将应用程序的程序段加载到内存中,然后由运行设备基于一定的顺序依次执行程序代码段中的指令,从而实现应用程序的执行。
可以参阅图3,图3为本申请实施例提供的一种运行设备执行应用程序的示意图。如图3所示,运行设备中通常包括控制单元、存储单元和运算单元。控制单元中包括指令计数器和指令寄存器,其中指令计数器用于存储下一条待执行的指令在内存中的地址,指令寄存器则用于存储待执行的指令。存储单元通常包括多个寄存器,例如通用寄存器、浮点寄存器等,存储单元中的寄存器通常用于存储执行指令期间需要用到的数据。运算单元用于根据当前所执行的指令,对数据进行加工处理。
基于上述的结构,运行设备的运行原理为:控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(即指令在内存中的地址)送到地址总线(图3中未示出)上,然后运行设备将这个指令地址中的指令读到指令寄存器进行译码。对于在执行指令过程中所需要用到的数据,运行设备将该数据对应的数据地址送到地址总线上,并基于该数据地址将数据读到运行设备内部的存储单元暂存。最后,运行设备中的运算单元基于当前所执行的指令对数据进行处理加工。总的来说,运行设备从内存中一条一条地取出指令和相应的数据,并根据指令中的操作码,对数据进行运算处理,直到程序执行完毕为止。
具体地,运行设备的工作过程都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回。
1.取指令(Instruction Fetch,IF)阶段。
取指令阶段是将一条指令从内存中取到指令寄存器的过程。其中,指令计数器中的数值,用于指示下一条待执行的指令在内存中的位置。当一条指令被取出后,指令计数器中的数值将根据指令的长度而自动递增。
2.指令译码(Instruction Decode,ID)阶段。
取出指令后,运行设备立即进入指令译码阶段。在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别以及各种获取操作数的方法。
3.执行指令(Execute,EX)阶段。
在取指令和指令译码阶段之后,运行设备进入执行指令阶段。执行指令阶段的任务是完成指令所规定的各种操作,以实现指令的功能。因此,运行设备的不同部分被连接起来,以执行所需的操作。例如,如果要求完成一个加法运算,运算单元中的算术逻辑单元将被连接到一组输入和一组输出,输入端提供需要相加的数值,输出端将含有最后的运算结果。
4.访存取数(Memory,MEM)阶段。
在执行指令的过程中,根据指令需要,运行设备有可能要访问内存,以读取操作数。在这种情况下,运行设备就进入了访存取数阶段。访存取数阶段的任务是:运行设备根据指令地址码,得到操作数在内存中的地址,并从内存中读取该操作数用于运算。
5.结果写回(Writeback,WB)阶段。
作为最后一个阶段,结果写回阶段把执行指令阶段的运行结果数据“写回”到某种存储结构中。例如,结果数据通常会被写到运行设备的内部寄存器中,以便被后续的指令快速地存取;在一些情况下,结果数据也可被写入相对较慢、但较廉价且容量较大的内存中。
在指令执行完毕、结果数据写回之后,运行设备就接着从指令计数器中取得下一条指令的地址,开始新一轮的循环,下一个指令周期将顺序取出下一条指令。
由上述对运行设备工作过程的介绍可知,运行设备在处理每条访存指令时通常都需要执行访存取数阶段,并且在执行完访存取数阶段之后才能够对从内存中取得的数据进行运算处理。这样一来,在运行设备需要大量指令的情况下,运行设备每处理一条访存指令都需要等待数据从内存中被取出至缓存中,从而造成极大的访存延迟。
有鉴于此,业界普遍通过预取技术尝试掩盖访存延迟。预取技术主要包括软件预取技术(SoftWare Prefetch,SWP)和硬件预取技术(HardWare Prefetch,HWP)。
软件预取技术是指在程序中显式地插入预取指令,让运行设备从内存中读取指定地址的数据进缓存(Cache)。预取指令可以通过编译器自动添加,也可以通过程序员手工加入。软件预取几乎对硬件没有要求,其最大的技术挑战在于如何在目标代码中正确添加预取指令,对于链式数据结构来说,很难通过软件预取的方式进行优化,因为计算链式数据结构预取的地址开销很大,很容易造成预取提前量不足的问题。
硬件预取技术是由硬件根据访存的历史信息,对未来可能的访存单元预先取入Cache,典型的硬件预取器包括流预取器和跨步预取器,流预取器的作用是当检测到程序以地址递增的方式访问数据时,自动预取下一个缓存行(Cacheline)的数据。跨步预取器会监控每条内存加载指令(Load),当发现规律性跨步读取时,该预取器会预先算出下一步地址并发起预取。业界现有硬件预取技术大多都是基于时间局部性和空间局部性的假设,然而链表式数据结构对当前的CPU访存架构非常不友好,也导致目前商用CPU面对此类应用性能不理想,很难预取复杂的非规则内存访问。
并且,目前的数据预取技术在对链式数据结构中的数据进行预取时,往往难以确定数据的预取数量,往往可能会一次性预取过多的数据而导致缓存污染,或者是数据预取过少而达不到提高数据访问性能的目的。
有鉴于此,本申请实施例中提供了一种编译方法及数据预取方法,在编译过程中识别到访问链式数据结构的行为时,则生成数据访问指令以及用于指示链式数据结构中的待访问数据的地址的至少一个元数据,并且在数据访问指令前插入预取指令,以指示数据访问指令的地址以及该至少一个元数据。这样一来,运行设备在执行编译得到的可执行文件时,能够根据预取指令确定数据访问指令以及至少一个元数据,从而实现链式数据结构中的数据预取;并且,运行设备在基于预取指令获取到数据访问指令的地址后,则能够根据数据访问指令的访问次数来获知链式数据结构中的数据访问进度,从而适应性地调整预取数据的数量,保证链式数据结构中数据的有效预取。
本申请实施例所提供的编译方法可以应用于编译具有链式数据结构访问行为的代码,例如通用计算,高性能计算,数据库以及人工智能等领域的代码编译。本申请实施例所提供的数据预取方法则可以是应用于需要执行有链式数据结构访问需求的应用程序的场景。
示例性地,本申请实施例所提供的编译方法和数据预取方法可以应用于电子设备上。本申请实施例所提供的电子设备例如可以是服务器、智能手机(mobile phone)、个人电脑(personal computer,PC)、笔记本电脑、平板电脑、智慧电视、移动互联网设备(mobileinternet device,MID)、可穿戴设备,虚拟现实(virtual reality,VR)设备、增强现实(augmented reality,AR)设备、工业控制(industrial control)中的无线终端、无人驾驶(self driving)中的无线终端、远程手术(remote medical surgery)中的无线终端、智能电网(smart grid)中的无线终端、运输安全(transportation safety)中的无线终端、智慧城市(smart city)中的无线终端、智慧家庭(smart home)中的无线终端等。
请参阅图4,图4为本申请实施例提供的一种编译方法的流程示意图。如图4所示,该编译方法包括以下的步骤401-403。
步骤401,获取第一代码。
本实施例中,第一代码可以是指程序源代码。其中,程序源代码是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。示例性地,程序源代码可以是基于java,c,c++,python等高级语言编写成的代码。
步骤402,在识别到所述第一代码中存在请求访问链式数据结构的代码时,根据所述链式数据结构生成至少一个元数据和数据访问指令,其中,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据分别用于指示所述链式数据结构中待访问数据的地址,所述数据访问指令用于指示所述链式数据结构的地址以及请求访问所述链式数据结构。
本实施例中,编译器在对第一代码进行编译的过程,当编译器识别到第一代码中存在请求访问链式数据结构的行为时,由于链式数据结构中的每个数据都会指向下一个数据的地址,因此编译器可以根据链式数据结构的实际结构来获取链式数据结构中待访问数据的地址,从而生成至少一个元数据。其中,编译器所生成的至少一个元数据分别用于指示链式数据结构中的多个待访问数据的地址。链式数据结构中包括地址不连续的多个数据,且数据之间具有地址指向关系。此外,链式数据结构中的多个待访问数据可以是链式数据结构中的所有数据或者是链式数据结构中的部分数据,本实施例对此不做具体限定。
需要说明的是,本实施例中所述的至少一个元数据是指一个或一个以上元数据。为了便于叙述,对于“至少一个元数据”,以下将简称为“元数据”。
可选的,编译器所生成的元数据可以是位于第二代码中的代码段或数据段,所述第二代码是基于所述第一代码编译得到的,即第二代码实际上是编译器根据第一代码编译得到的可执行文件。也就是说,元数据可以是作为不执行的指令代码存放于第二代码的代码段中,该元数据也可以是作为程序代码中的一种数据而存放于第二代码的数据段中。
另外,在编译器识别到第一代码中存在请求访问链式数据结构的行为时,编译器还生成数据访问指令,以便于后续运行设备在执行编译后的可执行文件时能够根据数据访问指令来访问链式数据结构。其中,数据访问指令具体用于请求访问所述链式数据结构,且数据访问指令中还指示了所述链式数据结构的地址。
其中,链式数据结构的地址可以是指链式数据结构中任意一个数据的地址。链式数据结构的地址可以是根据链式数据结构中第一个需要访问的数据的地址来确定的。例如,在第一代码中,如果链式数据结构中第一个需要访问的数据为链式数据结构中的首个数据,那么数据访问指令则指示链式数据结构中首个数据的地址;如果链式数据结构中第一个需要访问的数据为链式数据结构中间的某个数据,那么数据访问指令则指示链式数据结构中间的该数据的地址。此外,链式数据结构的地址可以是指示具体的单个地址,例如存储某个数据的起始地址;链式数据结构的地址也可以是指示一个地址段,例如存储某个数据的地址段。
此外,本申请实施例所述的地址,例如链式数据结构的地址、数据访问指令的地址等地址,均可以是指物理存储地址或虚拟存储地址,本实施例对此不做具体限定。
步骤403,根据所述至少一个元数据和所述数据访问指令生成预取指令,以得到编译后的第二代码,所述预取指令用于指示所述数据访问指令的地址以及所述至少一个元数据。
在编译器生成元数据和数据访问指令后,编译器进一步生成预取指令,该预取指令用于指示数据访问指令的地址以及元数据。此外,编译器还可以是将预取指令插入在数据访问指令之前,以便于在应用程序执行阶段,运行设备在执行编译后的可执行文件时,是先执行预取指令,再执行数据访问指令。
本实施例中,通过在编译得到的可执行文件中插入预取指令,运行设备在执行可执行文件时,能够根据预取指令确定数据访问指令以及元数据,从而实现链式数据结构中的数据预取。即,运行设备先根据预取指令确定数据访问指令的地址,从而通过访问数据访问指令的地址来获取链式数据结构的起始存储地址;然后,基于链式数据结构的起始存储地址和元数据,有序地预取链式数据结构中的数据。并且,运行设备在基于预取指令获取到数据访问指令的地址后,则能够根据数据访问指令的访问次数来获知链式数据结构中的数据访问进度,从而适应性地调整预取数据的数量,保证链式数据结构中数据的有效预取。
可选的,上述的预取指令可以是直接指示数据访问指令的地址,例如预取指令指示数据访问指令的地址为0x1002。预取指令也可以是指示预取指令与数据访问指令之间的地址偏移。例如,预取指令的地址为0x1008,数据访问指令的地址为0x1002,那么预取指令与数据访问指令之间的地址偏移则为06。可以理解的是,考虑到预取指令提示运行设备进行预取的及时性和有效性,预取指令是生成在对数据访问指令前,且这两个指令之间的地址偏移较小。
因此,本实施例中,相较于直接在预取指令中指示数据访问指令的地址,通过在预取指令中指示其与数据访问指令之间的地址偏移,能够减少对预取指令的编码空间占用,从而节省指令开销。
以上介绍了编译器在编译过程中生成元数据以及数据访问指令,且在数据访问之前前插入了指示元数据和数据访问指令的预取指令。为了便于理解,以下将详细介绍编译器所生成的元数据。
可选的,上述的预取指令也可以是指示元数据的内容,或者是指示所述元数据的存储地址。
其中,预取指令指示元数据的存储地址的实现方式有多种。
实现方式1,预取指令用于指示元数据的起始存储地址以及所述元数据的数量,且每个元数据的大小相同。
本实施例中,编译器所生成的元数据的大小均相同,且元数据的存储地址是连续的。因此,编译器可以是在预取指令中指示元数据的起始存储地址以及元数据的数量。这样一来,运行设备则能够根据元数据的起始存储地址以及元数据的大小,先取出元数据中的首个元数据;并且,以元数据的大小为地址偏移,继续取出后续的其他元数据,从而实现所有元数据的预取。
例如,假设元数据的数量为4个,第一个元数据存储于0x0004-0x0007,第二个元数据存储于0x0008-0x000b,第三个元数据存储于0x000c-0x000f,第四个元数据存储于0x0010-0x0013。那么,编译器可以在预取指令中指示元数据的起始存储地址为0x0004,元数据的数量为4个。这样,运行设备可以基于元数据的大小为4字节,以及元数据的起始存储地址和数量,分别确定每个元数据的存储地址。
实现方式2,预取指令用于指示元数据的起始存储地址以及每个元数据的大小。
相较于实现方式1,实现方式2中预取指令所指示的每个元数据的大小可以是不一样的。
例如,假设元数据的数量为4个,预取指令中指示了多个元数据的起始存储地址为0x0001,且第一个元数据的大小为2字节,第二个元数据的大小为4字节,第三个元数据的大小为2字节,第四个元数据的大小为6字节。这样,运行设备可以基于元数据的起始存储地址和各个元数据的大小,确定第一个元数据的存储地址为0x0000-0x0001,第二个元数据的存储地址为0x002-0x005,第三个元数据的存储地址为0x0006-0x0007,第四个元数据的存储地址为0x0008-0x000d。
可以理解的是,由于链式数据结构中的数据包括用于指向其他数据的地址的指针,即链式数据结构中的数据中包括指向下一个数据的地址的指针。因此,在一些可能的实现方式中,编译器所生成的元数据可以是不直接指示链式数据结构中的数据的地址,而是指示数据中的指针在数据中所处的位置。
示例性地,编译器所生成的多个元数据可以是分别与所述链式数据结构中不同的数据对应,例如该多个元数据中的每个元数据分别与链式数据结构中的每个待访问数据一一对应。并且,该多个元数据均用于指示所对应的数据中指针的位置。
请参阅图5,图5为本申请实施例提供的一种链式数据结构中的数据与元数据之间的对应示意图。如图5所示,链式数据结构中包括4个待访问的数据,分别为:数据1、数据2、数据3和数据4。编译器根据链式数据结构中的4个待访问的数据,生成了4个元数据,分别为:元数据1、元数据2、元数据3和元数据4。并且,编译器所生成的4个元数据分别与链式数据结构中的4个待访问的数据一一对应。其中,元数据1指示了数据1中的指针1在数据1中的偏移(即指针1的起始存储地址相对于数据1的起始存储地址之间的偏移)为8;元数据2指示了数据2中的指针2在数据2中的偏移为14;元数据3指示了数据3中的指针3在数据3中的偏移为4;元数据4指示了数据4中的指针4在数据4中的偏移为14。这样,运行设备在获得各个元数据之后,即可根据元数据所指示的内容,确定从链式数据结构中预取得到的各个数据的指针的位置,进而继续确定下一个需要预取的数据的地址。
可选的,编译器所生成的多个元数据中的每个元数据还用于指示其对应的数据所指向的其他数据的大小。这样,在链式数据结构中的数据的大小不相同的情况下,运行设备在执行编译得到的可执行文件时,运行设备能够根据元数据的指示确定下一个需要预取的数据的大小,从而基于下一个需要预取的数据的起始存储地址和大小实现该数据的预取。
示例性地,以图5为例,元数据1与数据1对应,元数据1还可以指示数据1所指向的数据2的大小。这样,运行设备在根据元数据1中所指示的偏移确定指针1在数据1中的位置之后,即可根据指针1确定数据2的起始存储地址;然后,运行设备结合元数据1中所指示的数据2的大小以及数据2的起始存储地址,确定整个数据2的实际存储地址,从而实现数据2的预取。
可选的,编译器所生成的多个元数据中的每个元数据还用于指示其对应的数据的类型以及其对应的数据所指向的其他数据的类型。
请参阅图6,图6为本申请实施例一种链式数据结构中的数据的类型的示意图。如图6所示,在Backbone-rib链式数据结构中,一部分数据是链接有多个数据,即一部分数据指向了多个其他数据的地址。在这种情况下,设定同一行的数据的类型相同,即第一行数据的数据类型为0,第二行数据的数据类型为1,第三行数据的数据类型为2。这样,当元数据指示了数据类型0和1的情况下,运行设备则能够确定元数据所对应的数据为第一行数据,且元数据对应的数据所指向的数据为第二行数据;类似地,当元数据指示了数据类型0和0的情况下,运行设备则能够确定元数据所对应的数据为第一行数据,且元数据对应的数据所指向的数据为第一行数据。
这样一来,通过在元数据中指示数据的数据类型,能够确定元数据所指示的指针实际上是指向哪个数据,从而确定链式数据结构中的数据的链接关系,以便于运行设备能够在复杂的链式数据结构中有效地实现数据的预取。
以上介绍了本申请实施例提供的一种编译方法。为了便于理解,以下将介绍本申请实施例提供的一种数据预取方法,以了解运行设备如何基于编译得到的可执行文件来实现数据的预取。
请参阅图7,图7为本申请实施例提供的一种数据预取方法的流程示意图。如图7所示,该数据预取方法包括以下的步骤701-704。并且,该数据预取方法应用于计算机系统的第一实例,所述计算机系统还包括第二实例。
步骤701,所述第一实例获取预取指令,其中所述预取指令用于指示数据访问指令的地址以及至少一个元数据,所述数据访问指令用于指示链式数据结构的地址,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据用于指示链式数据结构中的数据的地址。
本实施例中,运行设备中的第一实例在执行应用程序的可执行文件的过程中,能够获取到可执行文件中的预取指令。其中,可执行文件中的预取指令是上述的编译方法中所编译得到的预取指令,具体可参考上述的编译方法,在此不再赘述。
其中,第二实例用于执行数据访问指令,以请求访问链式数据结构中的数据。具体地来说,第二实例用于执行应用程序的可执行文件,而第一实例则独立地执行本申请实施例提供的数据预取方法。
需要说明的是,本申请实施例中的第一实例和第二实例可以为物理上的两个独立的执行单元,例如第一实例和第二实例分别为两个独立的处理器或处理核。第一实例和第二实例也可以为虚拟的两个独立的执行单元,例如第一实例和第二实例分别为不同的线程、超线程或进程,本实施例对此并不做具体限定。
步骤702,所述第一实例根据所述数据访问指令的地址,获取所述链式数据结构的地址。
本实施例中,第二实例在获取到可执行文件中的预取指令后,运行设备则执行该预取指令,以启动第一实例。在第一实例启动后,第一实例同样可以获取到该预取指令。由于预取指令中指示了元数据以及数据访问指令的地址,因此第一实例可以根据预取指令获取到元数据,并暂时存储该元数据,以便于后续基于元数据来预取数据。此外,运行设备还可以基于预取指令所指示的数据访问指令的地址,获取数据访问指令所指示的链式数据结构的地址。
具体地,由于预取指令插入在数据访问指令之前,因此第一实例根据预取指令得到数据访问指令的地址之后,第一实例可以实时监控数据访问指令的地址,以确定第二实例何时执行到数据访问指令。当第二实例执行到数据访问指令时,第一实例则能够基于该数据访问指令,获取到链式数据结构的地址。
其中,链式数据结构的地址可以是指链式数据结构中任意一个数据的地址。链式数据结构的地址可以是根据链式数据结构中第一个需要访问的数据的地址来确定的。例如,在第一代码中,如果链式数据结构中第一个需要访问的数据为链式数据结构中的首个数据,那么数据访问指令则指示链式数据结构中首个数据的地址;如果链式数据结构中第一个需要访问的数据为链式数据结构中间的某个数据,那么数据访问指令则指示链式数据结构中间的该数据的地址。此外,链式数据结构的地址可以是指示具体的单个地址,例如存储某个数据的起始地址;链式数据结构的地址也可以是指示一个地址段,例如存储某个数据的地址段。
步骤703,所述第一实例根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据。
在获得链式数据结构的起始存储地址以及元数据之后,第一实例可以根据该起始存储地址以及元数据所指示的待访问数据的地址,依次预取链式数据结构中的数据。
步骤704,所述第二实例执行所述数据访问指令,以访问所述链式数据结构中的数据。
其中,所述第一实例在预取所述链式数据结构中数据的过程中,所述第一实例根据所述第二实例执行所述数据访问指令的次数来控制预取所述链式数据结构中数据的进度,所述进度用于使所述链式数据结构中的数据在被访问前已预取到缓存中。
具体来说,在第一实例预取数据的过程中,第一实例在链式数据结构中的预取数据的数量是与数据访问指令的执行次数有关的,以保证第一实例所预取的数据始终多于实际所访问的数据。其中,数据访问指令的执行次数表示了链式数据结构中已访问的数据的个数。第二实例每执行一次数据访问指令,则代表链式数据结构中已访问的数据增加一个。具体来说,该数据访问指令可以是指示第二实例访问某个寄存器内特定位置所指示的地址,以实现访问链式数据结构中的数据;此外,第二实例还在根据寄存器内特定位置所指示的地址获取到需要访问的数据之后,将该寄存器内的数据替换为新获取到的数据。这样一来,第二实例继续执行该数据访问指令时,则能够根据寄存器内新的数据所指示的地址,获取到链式数据结构中的下一个数据。
例如,假设链式数据结构中的每个数据中指向特定类型数据的指针都是位于相同的位置,即指针在数据中的偏移都是相同的。这样,数据访问指令可以是指示访问某个寄存器内特定偏移下所指示的地址,即访问寄存器内所保存的数据中特定偏移下的指针所指示的地址。那么,在第二实例每次执行数据访问指令后,寄存器内的数据都会发生变化,且第二实例下一次执行数据访问指令时,能够根据寄存器内的数据来访问链式数据结构内的下一个数据。
也就是说,第一实例在基于预取指令获取到数据访问指令的地址后,则可以实时监控数据访问指令的访问次数,从而能够根据数据访问指令的访问次数来获知链式数据结构中的数据访问进度,进而适应性地调整预取数据的数量,避免数据预取过少或过多,保证链式数据结构中数据的有效预取。
可选的,由于数据访问指令的执行次数能够指示链式数据结构中实际被访问的数据的个数,因此第一实例可以是控制链式数据结构中的数据的预取数量与链式数据结构中实际已访问的数据的数量之间的差值在预设范围内。例如,假设预设范围为5-10,那么第一实例可以则控制链式数据结构中的数据的预取数量始终比实际已访问的数据个数多5-10个,以在保证预取的及时性的同时,避免预取数据过多而污染缓存。
可以理解的是,预设范围的值可以是根据实际应用场景来调整。例如,在运行设备缓存较大且数据访问性能要求较高的情况下,预设范围的值可以调整为较大的值;在运行设备缓存较小且数据访问性能要求不高的情况下,预设范围的值可以调整为较小的值。
可选的,第一实例所获取到的预取指令具体可以是用于指示预取指令与数据访问指令之间的地址偏移。这样,运行设备可以根据预取指令的实际地址以及其与数据访问指令之间的地址偏移,确定数据访问指令的实际地址。
需要说明的是,在第一实例预取链式数据结构中的数据的过程中,第一实例所预取得到的数据可以是不包括指向其他数据的指针;或者第一实例预取得到的所有数据中的部分数据包括指向其他数据的指针,而另一部分数据则不包括指向其他数据的指针。类似地,第二实例执行数据访问指令的过程中,第二实例所访问的数据也可以是不包括指向其他数据的指针;或者第二实例所访问的所有数据中的部分数据包括指向其他数据的指针,而另一部分数据则不包括指向其他数据的指针。本申请实施例并不对预取的数据以及访问的数据的内容做具体限定。
在一些可能的实现方式中,上述的预取指令也可以是指示元数据的内容,或者是指示所述元数据的存储地址。那么,在预取指令指示存储地址的情况下,运行设备则根据所述元数据的存储地址,获取所述元数据。
示例性地,在多个元数据中每个元数据的大小相同的情况下,所述预取指令具体指示所述多个元数据的起始存储地址以及所述多个元数据的数量。因此,运行设备在获取到预取指令后,则根据所述多个元数据的数量和大小,从元数据的起始存储地址开始获取所述多个元数据。具体来说,运行设备根据元数据的起始存储地址以及元数据的大小,先取出多个元数据中的首个元数据;并且,以元数据的大小为地址偏移,继续取出后续的其他元数据,从而实现所有元数据的预取。
此外,预取指令还可以通过其他的实现方式来指示元数据的存储地址,具体请参考上述图3对应的实施例,在此不再赘述。
可选的,由于链式数据结构中的数据包括用于指向同一个链式数据结构内其他数据的地址的指针,因此预取指令中所指示的多个元数据可以是分别与链式数据结构中不同的数据对应,且所述多个元数据均用于指示其对应的数据中指针的位置。
也就是说,编译器所生成的元数据可以是不直接指示链式数据结构中的数据的地址,而是指示数据中的指针在数据中所处的位置。在这种情况下,运行设备可以是基于以下的步骤来实现数据的预取。
首先,运行设备根据链式数据结构的起始存储地址,预取所述链式数据结构中的首个数据。
然后,运行设备根据链式数据结构中的已预取数据和已预取数据对应的元数据,获取所述已预取数据中的指针,其中已预取数据包括链式数据结构中的首个数据或者是基于所述首个数据继续预取得到的其他数据。
最后,运行设备根据已预取数据中的指针所指向的地址,从所述链式数据结构中预取所述已预取数据所指向的其他数据。
示例性地,以图5为例,假设运行设备根据链式数据结构的起始存储地址,预取了链式数据结构的数据1(即首个数据)后。运行设备再根据数据1和数据1所对应的元数据1,获取数据1中的指针的位置,进而获取到数据1中的指针。最后,运行设备再根据数据1中的指针所指向的地址,从链式数据结构中预取数据1所指向的数据2。类似地,在预取到数据2之后,运行设备可以根据数据2以及数据2对应的元数据2,继续预取数据2所指向的数据3,以此循环,直至预取的数据达到需要为止。
可选的,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小,具体请参考上述实施例,在此不再赘述。
可选的,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型,具体请参考上述实施例,在此不再赘述。
为了便于理解,以下将结合具体例子详细介绍上述的编译方法和数据预取方法。
请参阅图8,图8为本申请实施例提供的一种系统架构示意图。如图8所示,系统架构中包括编译器和运行设备。其中,编译器用于对应用程序源代码进行编译,得到应用程序的可执行文件。并且,编译器编译得到的可执行文件中包括预取指令、数据访问指令和元数据。运行设备则用于执行应用程序的可执行文件,并根据可执行文件中的预取指令获取数据访问指令和元数据,以实现链式数据结构中的数据的预取。
请参阅图9,图9为本申请实施例提供的一种编译方法的流程示意图。如图9所示,该编译方法包括以下的步骤901-904。
步骤901,编译器识别源代码中对链式数据结构的访存行为,提炼链式数据结构中的数据链接关系,得到至少一个元数据。
在编译器对源代码进行编译的过程中,当编译器识别到源代码中存在对链式数据结构的访存行为时,编译器则提炼链式数据结构中的数据链接关系,得到至少一个元数据。其中,每个元数据与链式数据结构中的一个数据对应,且每个元数据指示了其对应的数据所指向的另一个数据。此外,每个元数据还可以是指示其对应的数据所指向的另一个数据的大小以及数据类型。
在一些实施例中,为了便于对元数据的管理,编译器所生成的每个元数据的大小都是相同的。例如,编译器所生成的每个元数据都是以X字节来进行保存,其中,X可以是根据不同的应用场景来进行设置,在此不做具体限定。
步骤902,编译器基于源代码中对链式数据结构的访存行为,生成数据访问指令。
其中,数据访问指令用于指示访问链式数据结构中的数据,且数据访问指令还指示了链式数据结构的起始存储地址。
步骤903,编译器在数据访问指令前插入预取指令,以指示数据访问指令的地址以及元数据。
本实施例中,预取指令用于指示数据访问指令的地址以及元数据,并且预取指令是插入在数据访问指令之前的。也就是说,在应用程序执行阶段,运行设备在执行编译后的可执行文件时,是先执行预取指令,再执行数据访问指令,以便于实现数据的预取。
具体地,预取指令中可以是指示了元数据的起始存储地址、元数据的数量以及数据访问指令的地址(例如数据访问指令与预取指令之间的偏移)。
步骤904,编译器生成携带预取指令、数据访问指令和元数据的可执行文件。
最后,在编译器完成对源代码的编译后,即可生成一个携带预取指令、数据访问指令和元数据的可执行文件。
为详细说明本申请实施例,本实施例从典型Workload中抽取出对链式数据结构的访问模式,构造验证程序。然后,采用新增优化PASS的编译器编译该验证程序,生成带有预取指令的二进制程序(即可执行文件),并将该二进制程序运行到仿真器进行验证。
请参阅图10A,图10A为本申请实施例提供的一种基于现有编译器对验证程序进行编译的示意图。如图10A所示,图10A中的a示出了链式数据结构的部分结构,图10A中的b示出了验证程序中指示访问链式数据结构的代码。在图10A中的c中,针对于验证程序中指示访问链式数据结构的代码,现有编译器经过编译后生成对应的数据访问指令。
请参阅图10B,图10B为本申请实施例提供的一种基于新增优化PASS的编译器对验证程序进行编译的示意图。如图10B所示,本申请实施例中在编译器中新增优化PASS,以同新增的优化PASS在编译阶段针对链式数据结构的访存行为生成对应的预取指令。如图10B中的c所示,相比于图10A中基于现有编译器编译得到的汇编代码,基于新增优化PASS的编译器所编译得到的汇编代码中还包括了相应的预取指令以及元数据。其中,新增的预取指令是地址为400b00所指示的指令,该指令具体为[2,0x104,0xc0]。在预取指令中,2表示的是元数据的数量;0x104表示的是预取指令与元数据之间的地址偏移;0xc0表示的是预取指令与数据访问指令之间的地址偏移。基于预取指令的地址以及预取指令所指示的地址偏移0x104,运行设备能够确定元数据的地址为400c04;基于预取指令的地址以及预取指令所指示的地址偏移0xc0,运行设备能够确定数据访问指令的地址为400bc0。
以下将结合图10B,详细介绍本实施例中编译器基于链式数据结构生成元数据的一种实施方式。
编译器在对验证程序进行编译时,识别到验证程序中对链式数据结构的访存行为。针对图10B所示的验证程序,编译器识别到图10B中的b所示循环,并根据10B中的a所示的数据结构信息,生成相应的元数据。
具体地,针对编译器所生成的元数据,元数据以4字节为单位,每个元数据保存链式数据结构中的某一个数据与该数据中的某指针所指向的另一个数据的信息。其中,每个元数据内存储的内容包括以下的5种信息。
1.节点标识(Node-ID)。其中,链式数据结构中不同类型的数据均被分配一个Node-ID。元数据中的Node-ID则用于指示元数据所对应的数据的类型。
2.地址偏移(Offset)。其中,Offset以N字节(Byte)为单位,存储当前元数据对应的数据的指针(pointer,Ptr)的相对偏移,即指示了指针在元数据对应的数据内的位置。
3.Nextnode-ID。Nextnode-ID指示了Ptr指向的下一个数据的ID,即指示了元数据对应的数据所指向的另一个数据的类型。
4.Nextnode-size。Nextnode-size以M字节为单位,存储Ptr指向的下一个数据的大小,即指示了元数据对应的数据所指向的另一个数据的大小。
5.RSV:后续扩展其他需要提供给硬件的元数据信息。
需要说明的是:上述的N和M以及各部分所占编码空间可以根据应用和架构调整,本实施例并不限定这些参数的具体取值。
具体地,本申请实例按以上的方式分配元数据的编码空间,且设定Offset与Nextnode-size以字节为单位表示;那么,对于图10B所示的程序,编译器生成的元数据如表1所示。
表1
<imm5> | <imm8> | <imm5> | <imm6> | <imm8> | |
Node-ID | Offset | Nextnode-ID | Nextnode-size | RSV | 16进制标识 |
0 | 0 | 0 | 24 | 0 | 0x00001800 |
0 | 16 | 1 | 16 | 0 | 0x00805000 |
由于图10B中的b所示程序中需要对BackboneNode结点的数据和RibNode结点的数据进行访问,因此编译器通过元数据传递给硬件计算这两个结点地址所需要的信息。由于图10B中的b中的访存行为,没有访问到ArcNode的数据,因此不用给出计算ArcNode地址的元数据,即编译器所生成的元数据是用于指示待访问数据的地址。
在表1中,0x00001800这条元数据所表示的含义如下:在NodeID=0所代表的结点(BackboneNode)的offset=0偏移处,有一个指向Nextnode-ID=0(BackboneNode结点类型)的指针,Nextnode-ID=0所代表的结点Size为24Byte(Nextnode-size=24)。即,通过本条元数据,运行设备可以计算出每次迭代需要预取的下一个BackboneNode结点地址。
此外,0x00805000这条元数据所表示的含义如下:在NodeID=0所代表的结点(BackboneNode)的offset=16偏移处,有一个指向Nextnode-ID=1(RibNode结点类型)的指针,Nextnode-ID=1所代表的结点Size为16Byte(Nextnode-size=16)。即,通过本条元数据,运行设备可以计算出每次迭代需要预取的下一个RibNode结点地址。
请参阅图11,图11为本申请实施例提供的一种数据预取方法的流程示意图。如图11所示,该数据预取方法包括以下的步骤1101-1104。
步骤1101,运行设备判断指令是否为预取指令。
在运行设备执行应用程序的可执行文件的过程中,运行设备中的译码单元判断当前待执行的指令是否为预取指令。
步骤1102,运行设备基于预取指令初始化链式预取器,以获取并保存预取指令所指示的元数据以及数据访问指令的地址。
若运行设备当前所译码的指令为预取指令,则运行设备基于预取指令初始化链式预取器。这样,运行设备中的链式预取器能够获取并保存预取指令所指示的元数据以及数据访问指令的地址。
步骤1103,运行设备判断指令是否为数据访问指令。
由于预取指令插入在数据访问指令之前,因此运行设备基于预取指令获取到数据访问指令的地址后,运行设备中的译码单元持续监控是否执行到数据访问指令,即判断当前所译码的指令是否为预取指令所指示的数据访问指令。
步骤1104,运行设备基于数据访问指令获取链式数据结构的起始存储地址。
其中,数据访问指令指示了链式数据结构的起始存储地址。
步骤1105,运行设备根据起始存储地址向缓存(cache)发送预取请求。
步骤1106,运行设备判断cache是否已返回预取数据。
如果运行设备确定cache已经返回预取数据,则运行设备继续执行步骤1107。
步骤1107,运行设备根据预取指令所指示的元数据和已返回数据计算下一次预取地址。
由于元数据中指示了其对应的数据中的指针的位置,且数据中的指针又指示了下一个数据的地址,因此运行设备中的链式预取器能够根据预取指令所指示的元数据和已返回数据计算下一次预取地址。
步骤1108,运行设备根据数据访问指令的执行次数和数据预取数量判断是否停止预取。
由于预取指令中指示了数据访问指令的地址,因此运行设备能够基于数据访问指令的地址监控数据访问指令的执行次数。当数据预取数量与数据访问指令的执行次数之间的差值小于预设范围时,运行设备则基于已计算的下一次预取地址继续执行数据的预取;当数据预取数量与数据访问指令的执行次数之间的差值大于预设范围时,运行设备则停止数据的预取。
以上介绍了本申请实施例所提供的编译方法和数据预取方法,以下将介绍用于执行上述方法的执行设备。
具体可以参阅图12,图12为本申请实施例提供的一种编译装置1200的结构示意图,该编译装置1200包括:获取单元1201和处理单元1202。获取单元1201,用于获取第一代码;处理单元1202,用于在识别到所述第一代码中存在请求访问链式数据结构的代码时,根据所述链式数据结构生成数据访问指令和至少一个元数据,其中,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据分别用于指示所述链式数据结构中数据的地址,所述数据访问指令用于指示所述链式数据结构的地址以及请求访问所述链式数据结构;所述处理单元1202,还用于根据所述至少一个元数据和所述数据访问指令生成预取指令,以得到编译后的第二代码,所述预取指令用于指示所述数据访问指令的地址以及所述至少一个元数据。
在一种可能的实现方式中,所述链式数据结构中的数据包括用于指向其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置。
在一种可能的实现方式中,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
在一种可能的实现方式中,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
在一种可能的实现方式中,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
在一种可能的实现方式中,所述预取指令具体用于指示所述至少一个元数据的地址。
在一种可能的实现方式中,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量,所述至少一个元数据的大小相同。
在一种可能的实现方式中,所述至少一个元数据位于第二代码中的代码段或数据段,所述第二代码是基于所述第一代码编译得到的。
具体可以参阅图13,图13为本申请实施例提供的一种数据预取装置1300的结构示意图,该数据预取装置1300包括:获取单元1301、预取单元1302和执行单元1303。获取单元1301,用于获取预取指令,其中所述预取指令用于指示数据访问指令的地址以及至少一个元数据,所述数据访问指令用于指示链式数据结构的地址,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据用于指示链式数据结构中的数据的地址;所述获取单元1301,还用于根据所述数据访问指令的地址,获取所述链式数据结构的地址;预取单元1302,用于根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据;执行单元1303,用于执行所述数据访问指令,以访问所述链式数据结构中的数据;其中,所述第一实例在预取所述链式数据结构中数据的过程中,所述第一实例根据所述第二实例执行所述数据访问指令的次数来控制预取所述链式数据结构中数据的进度,所述进度用于使所述链式数据结构中的数据在被访问前已预取到缓存中。
在一种可能的实现方式中,在所述预取单元1302预取所述链式数据结构中数据的过程中,已预取数据的数量与已访问数据的数量之间的差值在预设范围内。
在一种可能的实现方式中,所述链式数据结构中的数据包括用于指向所述链式数据结构内其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置;
所述预取单元1302,具体用于:根据所述链式数据结构的地址,预取所述链式数据结构中的数据;根据所述链式数据结构中的已预取数据和所述已预取数据对应的元数据,获取所述已预取数据中的指针;根据所述已预取数据中的指针所指向的地址,从所述链式数据结构中预取所述已预取数据所指向的其他数据。
在一种可能的实现方式中,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
在一种可能的实现方式中,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
在一种可能的实现方式中,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
在一种可能的实现方式中,所述预取指令具体用于指示所述至少一个元数据的地址;
所述获取单元1301还用于:根据所述至少一个元数据的地址,获取所述至少一个元数据。
在一种可能的实现方式中,所述至少一个元数据的大小相同,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量;
所述获取单元1301还用于:根据所述至少一个元数据的数量和大小,从所述至少一个元数据的起始地址开始获取所述至少一个元数据。
本申请实施例提供的编译方法及数据预取方法具体可以由电子设备中的芯片来执行,该芯片包括:处理单元和通信单元,处理单元例如可以是处理器,通信单元例如可以是输入/输出接口、管脚或电路等。该处理单元可执行存储单元存储的计算机执行指令,以使电子设备内的芯片执行上述图1至图11所示实施例描述的方法。可选的,存储单元为芯片内的存储单元,如寄存器、缓存等,存储单元还可以是无线接入设备端内的位于芯片外部的存储单元,如只读存储器(read-only memory,ROM)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(random access memory,RAM)等。
可以参阅图14,本申请还提供了一种计算机可读存储介质,在一些实施例中,上述实施例所公开的方法可以实施为以机器可读格式被编码在计算机可读存储介质上或者被编码在其它非瞬时性介质或者制品上的计算机程序指令。
图14示意性地示出根据这里展示的至少一些实施例而布置的示例计算机可读存储介质的概念性局部视图,示例计算机可读存储介质包括用于在计算设备上执行计算机进程的计算机程序。
在一个实施例中,计算机可读存储介质1400是使用信号承载介质1401来提供的。信号承载介质1401可以包括一个或多个程序指令1402,其当被一个或多个处理器运行时可以提供以上针对图4或图7描述的功能或者部分功能。因此,例如,参考图4中所示的实施例,步骤401-403的一个或多个特征可以由与信号承载介质1401相关联的一个或多个指令来承担。此外,图14中的程序指令1402也描述示例指令。
在一些示例中,信号承载介质1401可以包含计算机可读介质1403,诸如但不限于,硬盘驱动器、紧密盘(CD)、数字视频光盘(DVD)、数字磁带、存储器、ROM或RAM等等。
在一些实施方式中,信号承载介质1401可以包含计算机可记录介质1404,诸如但不限于,存储器、读/写(R/W)CD、R/W DVD、等等。在一些实施方式中,信号承载介质1401可以包含通信介质1405,诸如但不限于,数字和/或模拟通信介质(例如,光纤电缆、波导、有线通信链路、无线通信链路、等等)。因此,例如,信号承载介质1401可以由无线形式的通信介质1405(例如,遵守IEEE 802.14标准或者其它传输协议的无线通信介质)来传达。
一个或多个程序指令1402可以是,例如,计算机可执行指令或者逻辑实施指令。在一些示例中,计算设备的计算设备可以被配置为,响应于通过计算机可读介质1403、计算机可记录介质1404、和/或通信介质1405中的一个或多个传达到计算设备的程序指令1402,提供各种操作、功能、或者动作。
应该理解,这里描述的布置仅仅是用于示例的目的。因而,本领域技术人员将理解,其它布置和其它元素(例如,机器、接口、功能、顺序、和功能组等等)能够被取而代之地使用,并且一些元素可以根据所期望的结果而一并省略。另外,所描述的元素中的许多是可以被实现为离散的或者分布式的组件的、或者以任何适当的组合和位置来结合其它组件实施的功能实体。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。
Claims (20)
1.一种数据预取方法,其特征在于,所述方法应用于计算机系统的第一实例,所述计算机系统还包括第二实例,所述方法包括:
所述第一实例获取预取指令,其中所述预取指令用于指示数据访问指令的地址以及至少一个元数据,所述数据访问指令用于指示链式数据结构的地址,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据用于指示链式数据结构中的数据的地址;
所述第一实例根据所述数据访问指令的地址,获取所述链式数据结构的地址;
所述第一实例根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据;
所述第二实例执行所述数据访问指令,以访问所述链式数据结构中的数据;
其中,所述第一实例在预取所述链式数据结构中数据的过程中,所述第一实例根据所述第二实例执行所述数据访问指令的次数来控制预取所述链式数据结构中数据的进度,所述进度用于使所述链式数据结构中的数据在被访问前已预取到缓存中。
2.根据权利要求1所述的方法,其特征在于,在所述第一实例预取所述链式数据结构中数据的过程中,已预取数据的数量与已访问数据的数量之间的差值在预设范围内。
3.根据权利要求1或2所述的方法,其特征在于,所述链式数据结构中的数据包括用于指向所述链式数据结构内其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置;
所述第一实例根据所述链式数据结构的地址和所述至少一个元数据,预取所述链式数据结构中的数据,包括:
所述第一实例根据所述链式数据结构的地址,预取所述链式数据结构中的数据;
所述第一实例根据所述链式数据结构中的已预取数据和所述已预取数据对应的元数据,获取所述已预取数据中的指针;
所述第一实例根据所述已预取数据中的指针所指向的地址,从所述链式数据结构中预取所述已预取数据所指向的其他数据。
4.根据权利要求3所述的方法,其特征在于,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
5.根据权利要求3或4所述的方法,其特征在于,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
6.根据权利要求1-5任意一项所述的方法,其特征在于,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
7.根据权利要求1-6任意一项所述的方法,其特征在于,所述预取指令具体用于指示所述至少一个元数据的地址;
所述方法还包括:
所述第一实例根据所述至少一个元数据的地址,获取所述至少一个元数据。
8.根据权利要求7所述的方法,其特征在于,所述至少一个元数据的大小相同,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量,;
所述第一实例根据所述至少一个元数据的地址,获取所述至少一个元数据,包括:
所述第一实例根据所述至少一个元数据的数量和大小,从所述至少一个元数据的起始地址开始获取所述至少一个元数据。
9.一种编译方法,其特征在于,包括:
获取第一代码;
在识别到所述第一代码中存在请求访问链式数据结构的代码时,根据所述链式数据结构生成数据访问指令和至少一个元数据,其中,所述链式数据结构包括地址不连续的多个数据,所述至少一个元数据用于指示所述链式数据结构中数据的地址,所述数据访问指令用于指示所述链式数据结构的地址以及请求访问所述链式数据结构;
根据所述至少一个元数据和所述数据访问指令生成预取指令,以得到编译后的第二代码,所述预取指令用于指示所述数据访问指令的地址以及所述至少一个元数据。
10.根据权利要求9所述的方法,其特征在于,所述链式数据结构中的数据包括用于指向其他数据的地址的指针,所述至少一个元数据分别与所述链式数据结构中不同的数据对应,且所述至少一个元数据均用于指示所对应的数据中指针的位置。
11.根据权利要求10所述的方法,其特征在于,所述至少一个元数据还用于指示所对应的数据所指向的其他数据的大小。
12.根据权利要求10或11所述的方法,其特征在于,所述至少一个元数据中的每个元数据还用于指示所对应的数据的类型和所述所对应的数据所指向的其他数据的类型。
13.根据权利要求9-12任意一项所述的方法,其特征在于,所述预取指令具体用于指示所述预取指令与所述数据访问指令之间的地址偏移。
14.根据权利要求9-13任意一项所述的方法,其特征在于,所述预取指令具体用于指示所述至少一个元数据的地址。
15.根据权利要求14所述的方法,其特征在于,所述预取指令用于指示所述至少一个元数据的起始地址以及所述至少一个元数据的数量,所述至少一个元数据的大小相同。
16.根据权利要求9-15任意一项所述的方法,其特征在于,所述至少一个元数据位于第二代码中的代码段或数据段,所述第二代码是基于所述第一代码编译得到的。
17.一种电子设备,其特征在于,包括存储器和处理器;所述存储器存储有代码,所述处理器被配置为执行所述代码,当所述代码被执行时,所述电子设备执行如权利要求1至8任一项所述的方法。
18.一种电子设备,其特征在于,包括存储器和处理器;所述存储器存储有代码,所述处理器被配置为执行所述代码,当所述代码被执行时,所述电子设备执行如权利要求9至16任一项所述的方法。
19.一种计算机可读存储介质,其特征在于,包括计算机可读指令,当所述计算机可读指令在计算机上运行时,使得所述计算机执行如权利要求1至16中任一项所述的方法。
20.一种计算机程序产品,其特征在于,包括计算机可读指令,当所述计算机可读指令在计算机上运行时,使得所述计算机执行如权利要求1至16任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210654495.4A CN117251387A (zh) | 2022-06-10 | 2022-06-10 | 一种数据预取方法、编译方法及相关装置 |
PCT/CN2023/099303 WO2023237084A1 (zh) | 2022-06-10 | 2023-06-09 | 一种数据预取方法、编译方法及相关装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210654495.4A CN117251387A (zh) | 2022-06-10 | 2022-06-10 | 一种数据预取方法、编译方法及相关装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117251387A true CN117251387A (zh) | 2023-12-19 |
Family
ID=89117547
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210654495.4A Pending CN117251387A (zh) | 2022-06-10 | 2022-06-10 | 一种数据预取方法、编译方法及相关装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN117251387A (zh) |
WO (1) | WO2023237084A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117971722A (zh) * | 2024-03-28 | 2024-05-03 | 北京微核芯科技有限公司 | 一种取数指令的执行方法及其装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108874690B (zh) * | 2017-05-16 | 2020-12-15 | 龙芯中科技术有限公司 | 数据预取的实现方法和处理器 |
US10684857B2 (en) * | 2018-02-01 | 2020-06-16 | International Business Machines Corporation | Data prefetching that stores memory addresses in a first table and responsive to the occurrence of loads corresponding to the memory addresses stores the memory addresses in a second table |
US10445241B2 (en) * | 2018-03-06 | 2019-10-15 | Arm Limited | Prefetching using offset data to access a pointer within a current data element for use in prefetching a subsequent data element |
CN113407119B (zh) * | 2021-06-28 | 2023-03-24 | 海光信息技术股份有限公司 | 数据预取方法、数据预取装置、处理器 |
-
2022
- 2022-06-10 CN CN202210654495.4A patent/CN117251387A/zh active Pending
-
2023
- 2023-06-09 WO PCT/CN2023/099303 patent/WO2023237084A1/zh unknown
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117971722A (zh) * | 2024-03-28 | 2024-05-03 | 北京微核芯科技有限公司 | 一种取数指令的执行方法及其装置 |
Also Published As
Publication number | Publication date |
---|---|
WO2023237084A1 (zh) | 2023-12-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3588285B1 (en) | Sequence optimizations in a high-performance computing environment | |
US7533242B1 (en) | Prefetch hardware efficiency via prefetch hint instructions | |
CN109272109B (zh) | 神经网络模型的指令调度方法及装置 | |
KR101385420B1 (ko) | 메타데이터 추출을 통한 동적 언어의 실행 | |
US7243333B2 (en) | Method and apparatus for creating and executing integrated executables in a heterogeneous architecture | |
US7877741B2 (en) | Method and corresponding apparatus for compiling high-level languages into specific processor architectures | |
US5537620A (en) | Redundant load elimination on optimizing compilers | |
US20060158354A1 (en) | Optimised code generation | |
KR100643268B1 (ko) | 자바 가상 머신의 성능을 향상시키는 방법 및 상기 방법에의해 동작되는 시스템 | |
US7765527B2 (en) | Per thread buffering for storing profiling data | |
US7823140B2 (en) | Java bytecode translation method and Java interpreter performing the same | |
US7137111B2 (en) | Aggressive prefetch of address chains | |
US20100095285A1 (en) | Array Reference Safety Analysis in the Presence of Loops with Conditional Control Flow | |
CN105511942A (zh) | 语言虚拟机中热点中间代码的识别方法以及装置 | |
CN105393217A (zh) | 用于编译器优化的方法和系统 | |
KR102353213B1 (ko) | 데이터 프리페칭 방법, 장치, 및 시스템 | |
KR100654428B1 (ko) | 자바 프로그램의 처리 속도를 향상시키는 시스템 및 그 방법 | |
WO2023237084A1 (zh) | 一种数据预取方法、编译方法及相关装置 | |
CN113220306A (zh) | 操作执行方法、装置和电子设备 | |
WO2021036173A1 (zh) | 解释执行字节码指令流的方法及装置 | |
KR100463642B1 (ko) | 보조프로세서를 이용한 멀티미디어 처리를 위한 가속장치 | |
CN111095197B (zh) | 代码处理方法和设备 | |
CN114218152B (zh) | 流处理方法、处理电路和电子设备 | |
CN115437637A (zh) | 一种编译方法及相关装置 | |
US10802854B2 (en) | Method and apparatus for interpreting bytecode instruction stream |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |