CN103608768A - 一种数据预取方法、相关装置及系统 - Google Patents
一种数据预取方法、相关装置及系统 Download PDFInfo
- Publication number
- CN103608768A CN103608768A CN201380001332.5A CN201380001332A CN103608768A CN 103608768 A CN103608768 A CN 103608768A CN 201380001332 A CN201380001332 A CN 201380001332A CN 103608768 A CN103608768 A CN 103608768A
- Authority
- CN
- China
- Prior art keywords
- code
- data
- looking ahead
- prefetch
- buffer
- 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.)
- Granted
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(Central Processing Unit,中央处理器)主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构、指令结构、信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速度有关。若CPU工作速度较高,但内存存取速度相对较低,则造成CPU等待,降低处理速度,浪费CPU的能力。
当前减少CPU与内存之间速度差异的方法主要有以下几种方式:
在基本总线周期中插入等待,但这样会浪费CPU的能力;
采用存取时间较快的SRAM作存储器,这样虽然解决了CPU与存储器间速度不匹配的问题,但却大幅提升了系统成本;
在慢速的DRAM和快速CPU之间插入一速度较快、容量较小的SRAM,起到缓冲作用;使CPU既可以以较快速度存取SRAM中的数据,又不使系统成本上升过高,这就是Cache法;
采用新型的高速存储器。
目前,一般采用Cache法减少CPU与内存之间速度差异,它使硬件系统在不大增加成本的前提下,使计算处理性能提升的一个非常有效的技术。
Cache的工作原理是基于程序访问的局部性。对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次。因此,对这些地址的访问就自然地具有时间上集中分布的倾向。虽然数据分布的这种集中倾向不如指令明显,但是对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性。
根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速但容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用。这对提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器Cache。
系统正是依据局部性原理,不断地将与当前指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,从而达到速度匹配。CPU对存储器进行数据请求时,通常先访问Cache。由于局部性原理不能保证所请求的数据百分之百地在Cache中,这里便存在一个命中率,即CPU在任一时刻从Cache中可靠获取数据的几率。命中率越高,正确获取数据的可靠性就越大。为了提高数据的命中率,就需要选择适当的数据预取方式。
数据预取技术是提高计算机系统处理速度的有效方法。预取是指在指令或数据即将访问之前,将所需指令或数据提前从内存取至Cache,以达到访问时Cache命中的目的。针对预取的对象是指令还是数据,可分为指令预取和数据预取。目前使用的预取技术大多为软硬件结合预取技术。
软硬件结合的预取技术中,首先确定任务中需要预取数据的程序段,然后由计算机系统的硬件来决定预取的数据的数目并到内存中预取相应的数据流。发明人发现,现有技术中的软硬件结合的预取方式预取数据时,在任务对应的可执行程序的运行过程中,硬件需要一直处于预取状态,会带来不必要的能量消耗,并且硬件一直处理预取状态还可能产生不必要的预取操作,导致Cache污染等问题。
发明内容
本发明实施例提供一种数据预取方法、相关装置及系统,可控制硬件的预取状态的开启和关闭,以节约功耗并一定程度上避免Cache污染。
第一方面,本发明实施例提供了一种数据预取方法,包括:
运行可执行程序;
当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示,对到数据存储器预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
结合第一方面,在第一种可能的实现方式中,所述运行可执行程序之前,还包括:
在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入所述预取代码。
结合第一方面,或者第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述方法还包括:
检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
结合第一方面,或者第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,在第三种可能的实现方式中,所述若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据,包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据;
所述若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据,包括:
若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
结合第一方面,第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,在第四种可能的实现方式中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制,还包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
结合第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,或者第一方面的第四种可能的实现方式,在第五种可能的实现方式中,所述识别确定出所述可执行程序中密集访存的代码区间,包括:
查找预编译过程中所述可执行程序中预置的预取关键字;
根据预取关键字标记出候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
结合第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,或者第一方面的第四种可能的实现方式,或者第一方面的第五种可能的实现方式,在第六种可能的实现方式中,所述识别确定出所述可执行程序中密集访存的代码区间,包括:
识别确定出所述可执行程序中为循环体的代码区间;
将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
结合第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,或者第一方面的第四种可能的实现方式,或者第一方面的第五种可能的实现方式,在第七种可能的实现方式中,所述识别确定出所述可执行程序中密集访存的代码区间,包括:
根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
结合第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,或者第一方面的第四种可能的实现方式,或者第一方面的第五种可能的实现方式,或者第一方面的第六种可能的实现方式,或者第一方面的第七种可能的实现方式,在第八种可能的实现方式中,所述在所述密集访存的代码区间插入预取代码,包括:
在所述密集访存的代码区间的代码入口处插入预取开启代码;
在所述密集访存的代码区间的代码出口处插入预取关闭代码。
结合第一方面的第八种可能的实现方式,在第九种可能的实现方式中,所述在所述密集访存的代码区间插入预取代码,还包括:
根据密集访存的代码区间中代码访问的数据存储地址中数据流的特征,在所述密集访存的代码区间的代码入口处插入预取模式代码;和/或
根据密集访存的代码区间中代码访问的数据存储地址中数据流的特征,在所述密集访存的代码区间的代码入口处插入用于指示预取的数据量大小的预取数代码。
结合第一方面,或者第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,或者第一方面的第四种可能的实现方式,或者第一方面的第五种可能的实现方式,或者第一方面的第六种可能的实现方式,或者第一方面的第七种可能的实现方式,或者第一方面的第八种可能的实现方式,或者第一方面的第九种可能的实现方式,在第十种可能的实现方式中,还包括:将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
其中,将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
结合第一方面,或者第一方面的第一种可能的实现方式,或者第一方面的第二种可能的实现方式,或者第一方面的第三种可能的实现方式,或者第一方面的第四种可能的实现方式,或者第一方面的第五种可能的实现方式,或者第一方面的第六种可能的实现方式,或者第一方面的第七种可能的实现方式,或者第一方面的第八种可能的实现方式,或者第一方面的第九种可能的实现方式,或者第一方面的第十种可能的实现方式,在第十一种可能的实现方式中,还包括:
根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
将获取的数据或者连续存储的数组数据存储到一级缓存器中。
第三方面,本发明实施例还提供了一种数据预取控制装置,包括:
程序运行模块,用于运行可执行程序;
预取控制模块,用于当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述预取控制模块具体包括:
预取开启控制单元,用于若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;
预取关闭控制单元,用于若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
结合第三方面,在第一种可能的实现方式中,还包括:
区间识别模块,用于在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间;
代码插入模块,用于在所述密集访存的代码区间插入预取代码。
结合第三方面,或者第三方面的第一种可能的实现方式,在第二种可能的实现方式中,所述装置还包括:
状态存储模块,用于在检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
查找模块,用于在检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
所述预取控制模块还用于若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
结合第三方面,或者第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,在第三种可能的实现方式中,
所述预取开启控制单元,具体用于若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效,控制开启缓存器的预取功能以到数据存储器中预取数据;
所述预取关闭单元,具体用于若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效,控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
结合第三方面,或者第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,或者第三方面的第三种可能的实现方式,在第四种可能的实现方式中,所述预取控制模块还包括:
模式控制单元,用于若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值,控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
预取数控制单元,用于若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值,控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
结合第三方面,或者第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,或者第三方面的第三种可能的实现方式,或者第三方面的第四种可能的实现方式,在第五种可能的实现方式中,所述区间识别模块包括:
第一标记单元,用于查找预编译过程中所述可执行程序中预置的预取关键字;并根据预取关键字标记出候选密集访存的代码区间;
第一判断单元,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第一确定单元,用于在所述第一判断单元的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
结合第三方面,或者第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,或者第三方面的第三种可能的实现方式,或者第三方面的第四种可能的实现方式,在第六种可能的实现方式中,所述区间识别模块包括:
第二标记单元,用于识别确定出所述可执行程序中为循环体的代码区间;并将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
第二判断单元,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第二确定单元,用于在所述第二判断单元的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
结合第三方面,或者第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,或者第三方面的第三种可能的实现方式,或者第三方面的第四种可能的实现方式,在第七种可能的实现方式中,所述区间识别模块包括:
第三标记单元,用于根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
第三判断单元,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第三确定单元,用于在所述第三判断单元的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
结合第三方面的第三种可能的实现方式,或者第三方面的第四种可能的实现方式,或者第三方面的第五种可能的实现方式,或者第三方面的第六种可能的实现方式,或者第三方面的第七种可能的实现方式,在第八种可能的实现方式中,所述代码插入模块包括:
第一插入单元,用于在所述密集访存的代码区间的代码入口处插入预取开启代码;
第二插入单元,用于在所述密集访存的代码区间的代码出口处插入预取关闭代码。
结合第三方面的第八种可能的实现方式,在第九种可能的实现方式中,所述代码插入模块还包括:
第三插入单元,用于在所述密集访存的代码区间的代码入口处插入预取模式代码;或
第四插入单元,用于在所述密集访存的代码区间的代码入口处插入预取数代码。
结合第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,或者第三方面的第三种可能的实现方式,或者第三方面的第四种可能的实现方式,或者第三方面的第五种可能的实现方式,或者第三方面的第六种可能的实现方式,或者第三方面的第七种可能的实现方式,或者第三方面的第八种可能的实现方式,或者第三方面的第九种可能的实现方式,在第十种可能的实现方式中,还包括:
存储模块,用于将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
转存模块,用于将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
结合第三方面的第一种可能的实现方式,或者第三方面的第二种可能的实现方式,或者第三方面的第三种可能的实现方式,或者第三方面的第四种可能的实现方式,或者第三方面的第五种可能的实现方式,或者第三方面的第六种可能的实现方式,或者第三方面的第七种可能的实现方式,或者第三方面的第八种可能的实现方式,或者第三方面的第九种可能的实现方式,或者第三方面的第十种可能的实现方式,在第十一种可能的实现方式中,还包括:
获取模块,用于根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
提取模块,用于将获取的数据或者连续存储的数组数据存储到一级缓存器中。
第四方面,本发明实施例还提供了一种计算机存储介质,所述计算机存储介质可存储有程序,该程序执行时包括上述第一方面所述的方法。
第五方面,本发明实施例还提供了一种计算机系统,包括:
总线;
与所述总线相连的处理器;
与所述总线相连的存储器;
其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于:
运行可执行程序;
当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
结合第五方面,在第一种可能的实现方式中,所述处理器在执行所述运行可执行程序之前,还用于:
在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入预取代码。
结合第五方面,或者第五方面的第一种可能的实现方式,在第二种可能的实现方式中,所述处理器还用于:
检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
结合第五方面,或者第五方面的第一种可能的实现方式,或者第五方面的第二种可能的实现方式,在第三种可能的实现方式中,所述处理器在执行所述若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据时,具体用于:
若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效,控制开启缓存器的预取功能以到数据存储器中预取数据;
所述处理器在执行所述若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据,具体用于:
若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效,控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
结合第五方面,或者第五方面的第一种可能的实现方式,或者第五方面的第二种可能的实现方式,或者第五方面的第三种可能的实现方式,在第四种可能的实现方式中,所述处理器在执行所述根据该预取代码的指示对到数据存储器中预取数据进行控制时,还用于:
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值,控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值,控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
结合第五方面的第一种可能的实现方式,或者第五方面的第二种可能的实现方式,或者第五方面的第三种可能的实现方式,在第五种可能的实现方式中,所述处理器在执行所述识别确定出所述可执行程序中密集访存的代码区间,具体用于:
查找预编译过程中所述可执行程序中预置的预取关键字;
根据预取关键字标记出候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
结合第五方面的第一种可能的实现方式,或者第五方面的第二种可能的实现方式,或者第五方面的第三种可能的实现方式,在第六种可能的实现方式中,所述处理器在执行所述识别确定出所述可执行程序中密集访存的代码区间,具体用于:
识别确定出所述可执行程序中为循环体的代码区间;
将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
结合第五方面的第四种可能的实现方式,或者第五方面的第五种可能的实现方式,或者第五方面的第六种可能的实现方式,在第七种可能的实现方式中,所述处理器在执行所述识别确定出所述可执行程序中密集访存的代码区间,具体用于:
根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
结合第五方面的第一种可能的实现方式,或者第五方面的第二种可能的实现方式,或者第五方面的第三种可能的实现方式,或者第五方面的第四种可能的实现方式,或者第五方面的第五种可能的实现方式,或者第五方面的第六种可能的实现方式,或者第五方面的第七种可能的实现方式,在第八种可能的实现方式中,所述处理器执行所述在所述密集访存的代码区间插入预取代码时,所述处理器执行所述在所述密集访存的代码区间插入预取代码时,具体用于:
在所述密集访存的代码区间的代码入口处插入预取开启代码;
在所述密集访存的代码区间的代码出口处插入预取关闭代码。
结合第五方面的第八种可能的实现方式,在第九种可能的实现方式中,所述处理器执行所述在所述密集访存的代码区间插入预取代码时,具体还用于:
在所述密集访存的代码区间的代码入口处插入预取模式代码;
在所述密集访存的代码区间的代码入口处插入预取数代码。
结合第五方面,或者第五方面的第一种可能的实现方式,或者第五方面的第三种可能的实现方式,或者第五方面的第四种可能的实现方式,或者第五方面的第五种可能的实现方式,或者第五方面的第六种可能的实现方式,或者第五方面的第五种可能的实现方式,或者第五方面的第八种可能的实现方式,或者第五方面的第九种可能的实现方式,在第十种可能的实现方式中,所述处理器还用于:
将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
其中,将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
结合第五方面,或者第五方面的第一种可能的实现方式,或者第五方面的第三种可能的实现方式,或者第五方面的第四种可能的实现方式,或者第五方面的第五种可能的实现方式,或者第五方面的第六种可能的实现方式,或者第五方面的第五种可能的实现方式,或者第五方面的第八种可能的实现方式,或者第五方面的第九种可能的实现方式,或者第五方面的第十种可能的实现方式,在第十一种可能的实现方式中,所述处理器还用于:
根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
将获取的数据或者连续存储的数组数据存储到一级缓存器中。
第六方面,本发明实施例还提供了一种数据预取系统,包括程序运行装置、可编程预取装置、缓存器以及数据存储器,其中,所述数据存储器中存储有可执行程序需要访问的数据;
所述程序运行装置用于运行所述可执行程序;
所述可编程预取装置用于当所述程序运行装置运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示控制所述缓存器到所述数据存储器中预取数据;
所述缓存器用于到所述数据存储器中预取数据;
其中,所述可编程预取装置具体用于:若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启所述缓存器的预取功能;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭所述缓存器的预取功能;
所述缓存器具体用于在预取功能被开启后到所述数据存储器中预取数据;以及,在预取功能被关闭后,停止到所述数据存储器中预取数据。
结合第六方面,在第一种可能的实现方式中,所述程序运行装置,还用于在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入预取代码。
结合第六方面,或者第六方面的第一种可能的实现方式,在第二种可能的实现方式中,所述可编程预取装置,还用于检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
本发明实施例在可执行程序的运行过程中,当运行到预先插入在所述可执行程序中的包括用于指示预取开始和预取结束的预取代码时,相应地开启预取功能或者关闭预取功能,可以根据代码的实际数据访问需求对数据的预取操作进行控制,不必使一直处于数据预取开启状态,不仅降低了功耗,节约了成本,并且在一定程度上避免了预取误操作带来的缓存污染问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的一种数据预取方法的流程示意图;
图2是本发明实施例的另一种数据预取方法的流程示意图;
图3是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中一种具体方法的流程示意图;
图4是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中另一种具体方法的流程示意图;
图5是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中又一种具体方法的流程示意图;
图6是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中再一种具体方法的流程示意图;
图7是本发明实施例的又一种数据预取方法的流程示意图;
图8是本发明实施例的一种数据预取控制装置的结构示意图;
图9是本发明实施例的另一种数据预取控制装置的结构示意图;
图10是图9中的区间识别模块的结构示意图;
图11是图9中的另一种区间识别模块的结构示意图;
图12是图9中的再一种区间识别模块的结构示意图;
图13是本发明实施例的又一种数据预取装置的结构示意图;
图14是本发明实施例的一种处理器的结构示意图;
图15是本发明实施例一个计算机系统的结构示意图;
图16本发明实施例的另一个计算机系统的结构示意图;
图17是本发明实施例的一种数据预取系统的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1,是本发明实施例的一种数据预取方法的流程示意图,本发明实施例所述的方法可应用于计算机系统中完成数据的预取操作,具体可以由一个内置有缓存器Cache的处理器执行,本发明实施例的所述方法包括:
S101:运行可执行程序。
可执行程序包括各类计算机应用程序,处理器在加载后运行所述可执行程序的过程中,在运行到所述可执行程序的各代码时,会生成相应的计算机指令以控制计算机的其他模块,例如发出访问指令访问内存或者硬盘中的数据,发出显示指令在计算机显示器上显示相应内容,此为现有技术。
S102:当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
预取功能主要是指:可执行程序被运行的过程中在某段代码需要访问内存等数据存储器中的数据之前,能够将所需指令或数据提前从内存或者硬盘等存储数据的存储器中提取并存储到内置的缓存器Cache中。
所述预取开启代码、预取关闭代码可以是在所述可执行程序的预编译阶段,根据对程序代码所要访问的数据的分析结果,识别出需要预取数据的代码区间后,将相应的预取开启代码和预取关闭代码插入到对应的代码区间,在该代码区间的开始处插入预取开启代码Prefetch.on,在该代码区间的结束位置插入预取关闭代码Prefetch.off,当然还可以在该代码区间的开始处插入用于指示预取模式的预取模式代码。
在包括预取代码插入操作的预编译阶段完成后,用户可以根据需要在任何时候运行该可执行程序。处理器在加载后运行该可执行程序的过程中,当运行到插入其中的预取开启代码、预取关闭代码等预取代码时,会开启预取功能到内存、硬盘等存储数据的存储器中预取数据;或者关闭预取功能停止预取数据。
在开启预取功能后,根据处理器当前运行所述可执行程序时发出的数据访问指令,到内存或者直接到硬盘中预取数据。而当关闭预取功能后,则停止到内存或者硬盘中预取数据。
预取到的数据可以直接存储到cache中,也可以先缓存到一个预置的预取缓冲器prefetch buffer中,预取缓冲器为一个缓冲装置,用于在需要时缓冲预取到的数据。具体可以通过预取控制寄存器配置预取缓存配置信息对预取数据的存储方式进行控制。因此,在所述S102中预取到数据后,本发明实施例所述的方法缓存预取到的数据的步骤可以包括:将从数据存储器中预取到的数据缓存到缓存器中或者缓存到预取缓冲器中;其中,当根据预置的预取缓存配置信息将从数据存储器中预取到的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据时,将所述数据存储器中预取到的数据缓存到预取缓冲器中。
具体的,如果配置的缓存目的地址为cache,则将预取到的数据直接缓存到cache中,而如果配置的缓存目的地址为预取缓冲器prefetch buffer,则将预取到的数据直接缓存到prefetch buffer中。另外,如果配置的缓存目的地址为cache,但预取到的数据在遇到缓存冲突时,例如遇到等待缓存器的存储单元cache line(缓存器的存储单元分配超过预设时间值)的分配或prefetch逻辑正在缓存另一条数据到cache中时,则将数据缓存到预取缓冲器prefetch buffer中。
进一步的,对预取的数据进行缓存时,还可以通过设置多级缓存来进一步提高数据的访问效率。例如设置一级缓存器和二级缓存器的两级高速缓存,根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;将获取的数据或者连续存储的数组数据存储到一级缓存器中。所述预设阈值可以是一个值例如80%或90%等值,也可以为一个范围,阈值是可以根据时间应用或经验值灵活设置。
二级缓存器具有包容性,即一级缓存器中的数据都出现在二级缓存器中,以便于I/O和cache之间内容一致性。并且,由于一级缓存器的数据量较小,且为常被访问的数据,可以使得可执行程序需要访问数据时,首先到一级缓存器中访问数据,可以较为有效地提高访问效率。
本发明实施例在可执行程序的运行过程中,当运行到预先插入在所述可执行程序中的包括用于指示预取开始和预取结束的预取代码时,相应地开启预取功能或者关闭预取功能,可以根据代码的实际数据访问需求对数据的预取操作进行控制,不必使一直处于数据预取开启状态,不仅降低了功耗,节约了成本,并且在一定程度上避免了预取误操作带来的缓存污染问题。
再请参见图2,是本发明实施例的另一种数据预取方法的流程示意图,与上述实施例相同,本发明实施例所述的方法可应用于计算机系统中完成数据的预取操作,具体可以由一个内置缓存器Cache的处理器执行,本发明实施例的所述方法包括:
S201:在可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入预取代码。
所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示关闭预取功能的预取关闭代码,还可以包括其他形式的预取代码,如:用于指示预取模式的预取模式代码,或者用于指示预取的数据量大小的预取数代码等。
所述密集访存的代码区间可以是指:数据读取和存储操作(访存操作)相对于所有操作所占比例相对较大的代码区间,比如该代码区间访存操作占整个操作比例达到50%以上。
在本发明实施例中,开启预取功能的代码被标记为prefetch.on,关闭预取功能的代码被标记为prefetch.off,预取模式的代码被标记为set.prefetch.mode i:i值对应不同的数据预取模式,查询预取模式的代码被标记为get.prefetch.mode。
所述的识别以及插入过程是在所述可执行程序预编译阶段进行的,可以通过PPU(Programmable Prefeth Unit,可编程预取单元)等数据预取控制装置进行识别和插入操作,也可以采用能够自动识别并插入代码的编译器。
当然,所述可执行程序的预编译阶段还可以包括现有的其他步骤,在此不赘述。所述可执行程序预编译通过后,即可以根据需要加载到处理器中以实现相应的功能应用,即执行S202。
S202:运行可执行程序。
S203:当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据
具体的,本发明实施例的所述S202具体可以包括以下步骤实现:
若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据。
若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令。
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
所述预取指令可以采用下述表1的内容表示,对所述预取指令赋值后得到相应的预取命令。
表1
b15 | b14 | b13 | b12 | b11 | b10 | b9 | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
可以使用表1中的一位例如b15来指示缓存器开启数据预取功能或关闭数据预取功能,即b15为预取开启控制位,同时也可以作为预取结束控制位,通过赋值为1或0表示有效。
可以使用表1中两位例如b14和b13来指示缓存器开启预取功能后预取数据时所采用的预取模式,即b14和b13为预取模式控制位。其中,预取模式可以是与缓存器预先约定的用于预取数据所使用的策略,例如,约定的预取模式可以包括:
在缓存命中hit或未命中miss时,预取下一存储块line中的数据或多个存储块line中的数据;
在缓存连续命中hit或未命中miss时,预取下一存储块line中的数据或多个存储块line中的数据;
在缓存命中hit或未命中miss时,用步长stride的方式预取下一存储块line的数据或多个存储块line中的数据(带固定偏移的预取);
在缓存命中hit或未命中miss时,预取上一存储块line中的数据或多个存储块line中的数据(前向预取)。
可以使用11位例如b10至b0来指示缓存器开启预取功能后预取的数据量大小,即b10至b0为用于指示预取的数据量大小的预取数控制位,其中具体的,在b10到b0中,可以采用其中的三位来指示预取深度,而采用低8位来指示预取的步长。所述步长是指每次预取的数据量的最小数量值,而深度则是指每次预取的步长的数量,通过深度和步长共同确定每次预取的数据量大小。
S204:检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态。
目前的计算机系统一般为多任务系统,可以处理多个任务对应的可执行程序,在将当前运行的所述可执行程序切换为运行其他程序时,将可执行程序在切换前所处的预取状态记录到某一指定的存储器中,具体可以存储到计算机操作系统的任务控制块中。
在本步骤完成预取状态的存储之后,可以关闭数据预取功能;或者,可以到计算机操作系统的任务控制块等指定的存储器中查找并读取切换后的所述其他程序的预取状态,以执行相应的关于所述其他程序数据预取控制操作。
S205:检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态。
S206:若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
当计算机系统再次运行所述可执行程序时,到计算机操作系统的任务控制块等指定的存储器中查找并读取所述可执行程序的预取状态,然后生成相应的预取控制指令,并向缓存器发送该预取控制指令。
预取状态包括预取开启状态以及预取结束状态,为预取开始状态时存储预取开始、预取模式、预取数据量大小等信息。当处于预取开启状态时,所述S206中同样可以对如上述表1的预取指令进行赋值,生成用于控制开启缓存器的预取功能以预取数据的指令、用于控制开启缓存器的预取功能并按模式值所指示的预取模式以预取数据的指令、或者用于控制开启缓存器的预取功能并按数量值所指示的数量以预取数据的预取控制指令以预取数据;而处于预取结束状态时,则生成用于控制关闭缓存器的预取功能以停止预取数据的预取控制指令以使缓存器关闭预取功能。
预取到的数据可以直接存储到cache中,也可以缓存到预取缓冲器中prefetch buffer,预取缓冲器为一个缓冲装置,用于在需要时缓冲预取到的数据。具体可以通过控制寄存器配置预取缓存配置信息对预取数据的存储方式进行控制。因此,在预取到数据后,本发明实施例所述的方法缓存这些数据的步骤可以包括:将从数据存储器中预取到的数据缓存到缓存器中或者缓存到预取缓冲器中;其中,当根据预置的预取缓存配置信息将从数据存储器中预取到的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据时,将所述数据存储器中预取到的数据缓存到预取缓冲器中。
具体的,如果配置的缓存目的地址为cache,则将预取到的数据直接缓存到cache中,而如果配置的缓存目的地址为预取缓冲器prefetch buffer,则将预取到的数据直接缓存到prefetch buffer中。另外,如果配置的缓存目的地址为cache,但预取到的数据在遇到缓存冲突时,例如遇到等待缓存器的存储单元cache line(缓存器的存储单元分配超过预设时间值)的分配或prefetch逻辑正在缓存另一条数据到cache中时,则将数据缓存到预取缓冲器prefetch buffer中。
进一步的,对预取的数据进行缓存时,还可以通过设置多级缓存来进一步提高数据的访问效率。例如设置一级缓存器和二级缓存器的两级高速缓存,根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;将获取的数据或者连续存储的数组数据存储到一级缓存器中。所述预设阈值可以是一个值例如80%或90%等值,也可以为一个范围,阈值是可以根据时间应用或经验值灵活设置。
二级缓存器具有包容性,即一级缓存器中的数据都出现在二级缓存器中,以便于I/O和cache之间内容一致性。并且,由于一级缓存器的数据量较小,且为常被访问的数据,可以使得可执行程序需要访问数据时,首先到一级缓存器中访问数据,可以较为有效地提高访问效率。
具体请参见图3,是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中一种具体方法的流程示意图,所述方法用于在所述可执行程序的预编译过程中,根据预取关键字识别出密集访存的代码区间以便于插入相应的预取代码。所述方法包括:
S1001:查找预编译过程中所述可执行程序中预置的预取关键字。
S1002:根据预取关键字标记出候选密集访存的代码区间。
S1003:判断所述被标记为候选密集访存的代码区间是否满足预取条件。
所述S1003中,具体可以包括:该被标记为候选密集访存的代码区间为循环体,并且该被标记为候选密集访存的代码区间在被执行时涉及对数组的访存;或者,该被标记为候选密集访存的代码区间在被执行时需要多次访问同一存储单元的数据。
S1004:若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
若不满足时,则直接结束本次判断,继续所述可执行程序预编译,进行下一个代码区间的判断以及标记。
所述预取关键字pragma prefetch为程序编写过程中写入到可执行程序的源代码中,主要用于指导是否需要对预取关键字pragma prefetch所标记的代码区间进行是否满足预取条件的判断即预取有益性的判断。通过预取关键字pragmaprefetch的标记,可以跳过对大多数代码区间的判断,可以有效地加快对可执行程序预编译阶段插入预取代码的效率。
再请参见图4,是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中另一种具体方法的流程示意图,本方法用于在所述可执行程序预编译阶段,根据程序控制流识别密集访存的代码区间以便于插入相应的预取代码。所述方法包括:
S1011:识别确定出所述可执行程序中为循环体的代码区间。
具体可以根据为所述可执行程序建立的程序控制流图来识别所述可执行程序中为循环体的代码区间,其中,所述程序控制流图(Control Flow Graph,CFG)是一个建立在中间表示之上的结构,是对正在编译对象的控制流行为的抽象,由编译装置在内部维护。CFG是一个有向图,顶点表示基本块,边表示从一个基本块到另一个基本块的可能转换。常见的控制流特征:线性结构,分支结构,循环结构,以及相互之间各种组合。而其中的中间表示(IntermediateRepresentaion,IR)是指:操作在编译器内部的表示形式,高级语言经过编译器解析后形成中间表示,再经过中间表示上的各种变换,最终输出目标机指令。其中的基本块是指:一段只能从它开始处进入,并从它的结束处离开的线性指令序列或中间表示序列,基本特征为单入口单出口。在所述S1011中,首先需要确定所述可执行程序对于程序的控制流,然后根据控制流建立程序的控制流图(control flow graph),再根据控制流图建立支配树即必经节点树,最后根据支配树的各个节点识别为循环体的代码区间。识别循环是根据判断是否包括满足下述条件的所有节点:循环的入口节点(即回边的头节点)是所有这些节点的必经节点,所有这些节点都可以到达入口节点,而且其内只有一条回边。
S1012:将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
S1013:判断所述被标记为候选密集访存的代码区间是否满足预取条件;
所述S1013具体可以包括:判断该被标记为候选密集访存的代码区间是否不仅为循环体,而且为循环体中涉及对数组的访存;或者,判断该被标记为候选密集访存的代码区间需要多次访问同一存储单元的数据。
S1014:若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
若不满足时,则直接结束本次判断,继续所述可执行程序预编译,进行下一个代码区间的判断以及标记。
再请参见图5,是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中又一种具体方法的流程示意图,本方法用于在所述可执行程序预编译阶段,根据程序访问数据流识别密集访存的代码区间以便于插入相应的预取代码。所述方法包括:
S1021:根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
S1022:判断所述被标记为候选密集访存的代码区间是否满足预取条件;
所述S1022具体可以包括:判断该被标记为候选密集访存的代码区间是否为循环体,而且是否为循环体中涉及对数组的访存;或者,判断该被标记为候选密集访存的代码区间需要多次访问同一存储单元的数据。
S1023:若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
若不满足时,则直接结束本次判断,继续所述可执行程序预编译,进行下一个代码区间的判断以及标记。
其中,在所述S1021中,识别密集访问同一存储单元或者访问存储单元呈线性规律变化的代码区间可以通过:进行归纳变量(Induction variables)分析,确定候选的预取数据,在循环中,若变量x的值在每次循环中增加或减少一个固定的常数,则称x为循环的归纳变量,并且,与归纳变量有线性关系的也是归纳变量,其记录方式可以为:{[变量名,起始量,步长,终止量]}。在确定出预取数据后,进行数据访问规律分析,从而识别出代码区间,以得到后续密集访存的代码区间。
通过归纳变量的分析从而进行数据访问规律的分析确定出代码区间,可以有效地剔除掉实际是访问通过类似链表方式组织的数据的代码区间,在一定程度上避免了缓存污染,降低功耗。
在通过上述的三种方式确定了所述可执行程序中密集访存的代码区间后,在所述密集访存的代码区间插入预取代码具体可以包括:在所述密集访存的代码区间的代码入口处插入预取开启代码;在所述密集访存的代码区间的代码出口处插入预取关闭代码。进一步可选的,还可以包括:根据密集访存的代码区间中代码访问的数据存储地址中数据流的特征,在所述密集访存的代码区间的代码入口处插入用于指示缓存器在预取数据时的预取模式的预取模式代码;和/或根据密集访存的代码区间中代码访问的数据存储地址中数据流的特征,在所述密集访存的代码区间的代码入口处插入用于指示预取的数据量大小的预取数代码。其中,数据流(Data Flow)是一个建立在中间表示之上的数据信息,是对正在编译对象的数据传递关系的抽象,由编译器等编译装置在内部维护。数据流特征的分析可以以代数系统中的格为理论依据,可分为前向问题、后向问题以及双向问题。前向问题按程序执行方向分析,后向问题按程序执行的反方向分析,双向问题要求同时向前和向后分析数据传递。
具体的,例如,在可执行程序的源代码中包括如下密集访存的代码区间:
for(i=0;i<n;i++)
{
load A[i];
load B[i];
compute
store C[i];
}
自动的生成相应的预取开启代码Prefetch.on、预取关闭代码Prefetch.off以及根据密集访存的代码区间中代码访问的数据存储地址中数据流的特征生成插入预取模式代码set.prefetech.mode2,并插入相应预取代码到对应的代码区间后,该段代码变换为如下代码段:
Prefetch.on
set.prefetech.mode2
for(i=0;i<n;i++)
{
load A[i];
load B[i];
compute
store C[i];
}
Prefetch.off
这样,在所述可执行程序运行过程中,运行到Prefetch.on以及循环结束后运行Prefetch.off时,会分别开启预取功能以预取数据和关闭预取功能以停止预取数据。上述的set.prefetech.mode2则表示在数据预取时,采用第二种预取模式,set.prefetech.mode2仅为举例,预取模式代码具体可以为set.prefetech.mode i,具体所采用哪种预取模式(i的值)可以根据代码区间中代码访问的数据存储地址中数据流的特征的分析结果进行选择。
上述的根据密集访存的代码区间中代码访问的数据存储地址中数据流的特征,插入预取模式代码或者插入用于指示预取的数据量大小的预取数代码的方式具体可以包括:
判断密集访存的代码区间中代码访问的数据存储地址中数据流的访问模式是否可以确定;
若否,则预取模式为a模式,如命中hit时,预取1个缓存单元中的数据;
若是,判断密集访存的代码区间中代码访问的数据存储地址中数据流是否为连续数据;
若不为连续数据,则进一步判断数据之间的间隔是否可以判定;
若数据之间的间隔不可判定,则预取模式为b模式,如未命中miss时预取一个缓存单元中的数据;
若为连续的数据或者如数据之间的间隔可以判定,则进一步判断本次所述可执行程序需要访问的数据量是否可以判定;
若访问的数据量不可判定,则预取模式为a模式,如命中hit时,预取1个缓存单元中的数据;
若访问的数据量可以判定,则进一步判断数据的长度是否大于一个缓存单元;
若不大于,则预取模式为a模式,如命中hit时,预取1个缓存单元中的数据;
若大于,则预取模式为c模式,如命中hit时,预取N个缓存单元中的数据,N大于1。
进一步的再请参见图6,是本发明实施例的识别确定可执行程序中密集访存的代码区间的其中再一种具体方法的流程示意图,本发明实施例的所述方法包括如下步骤:
S1030:对可执行程序进行预编译;
S1031:判断是否存在预取关键字指示的代码区间;若存在则执行S1034,否则,执行S1032。
S1032:根据为所述可执行程序建立的程序控制流图,判断所述可执行程序中是否存在为循环体的代码区间;若存在则执行S1034,否则执行S1033;
S1033:根据所述可执行程序预编译过程中的数据访问规律,判断是否存在密集访问同一存储单元或者访问存储单元呈线性规律变化的代码区间;若存在则执行S1034,否则执行S1039;
S1034:标记候选密集访存的代码区间;即根据预取关键字标记出密集访存的代码区间、将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间、或者将所述密集访问同一存储单元或者访问存储单元呈线性规律变化的代码区间标记为候选密集访存的代码区间。
S1035:判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间,执行S1036,否则,执行S1039。
S1036:在所述可执行程序中密集访存的代码区间的入口处插入预取开启代码Prefetch.on;
S1037:在所述可执行程序中密集访存的代码区间的入口处插入预取模式代码set.prefetech.mode2;
S1038:在所述可执行程序中密集访存的代码区间的出口处插入预取关闭代码Prefetch.off;
S1039:运行所述可执行程序。
本发明实施例还提供了一种计算机存储介质,所述计算机存储介质可存储有程序,该程序执行时包括如上述图1至图6对应实施例所述的方法。
本发明实施例在可执行程序中插入包括用于指示预取开始和预取结束的代码,当可执行程序的运行过程中,能够根据预取代码实现预取功能开启或者关闭,有效地对数据预取操作进行了开关控制,不仅降低了功耗,节约了成本,并且可在一定程度上避免预取误操作带来的缓存污染问题。并且进一步地还可以根据需要插入预取代码的代码区间判断预取的模式、预取的数据量大小等因素,在这些代码区间中插入相应的预取模式指示的代码以及预取的数据量大小的代码,使得缓存器等预取装置能够根据预取控制指令中关于预取模式以及预取的数据量大小的指示,到内存或者硬盘中直接预取数据,降低了硬件预取的复杂性,在一定程度上提高了预取的效率。
再请参见图7,是本发明实施例的又一种数据预取方法的流程示意图,本发明实施例的所述方法可应用在缓存器中,根据预取控制指令到内存或者硬盘中预取所需数据,具体的,本实施例的所述方法包括:
S301:接收关于所述可执行程序的预取控制指令。
S302:根据所述预取控制指令执行相应的数据预取控制操作。
所述预取控制指令是PPU等用于进行数据预取的控制装置发送的,所述预取控制指令的生成步骤与上述图1至图6对应实施例的方法中的步骤相同,在此不赘述。
在S302中,缓存器等用于进行数据预取的装置根据预取控制指令的指示,开启相应的预取功能,到内存或者硬盘中预取当前运行的可执行程序所需的数据,或者根据预取控制指令的指示,停止到内存或者硬盘中预取数据。
具体的,本发明实施例的所述S302具体可以包括:
若为用于控制缓存器开启预取功能以预取数据的预取控制指令,则开启预取功能以在接收到关于所述可执行程序的数据访问请求时,到数据存储器中预取对应的数据;
若为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令,则关闭预取功能以停止预取数据。
其中,所述若为用于控制缓存器开启预取功能以预取数据的预取控制指令,则开启预取功能以在接收到关于所述可执行程序的数据访问请求时,到数据存储器中预取对应的数包括:
根据所述预取控制指令的预取开启控制位,确定所述预取控制指令所指示的预取状态为预取开启状态时,根据当前接收到的关于所述可执行程序的数据访问请求,到数据存储器中预取数据;
或者,根据所述预取控制指令的预取开启控制位,确定所述预取控制指令所指示的预取状态为预取开启状态时,根据当前接收到的关于所述可执行程序的数据访问请求和所述预取控制指令的预取模式控制位指示的预取模式,到数据存储器中预取数据;
或者,根据所述预取控制指令的预取开启控制位,确定所述预取控制指令所指示的预取状态为预取开启状态时,根据当前接收到的关于所述可执行程序的数据访问请求和所述预取控制指令的预取数控制位指示的预取数据量大小,到数据存储器中预取数据;
而所述若为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令,则关闭预取功能以停止预取数据则包括:根据所述预取控制指令的预取结束控制位,确定所述预取控制指令所指示的预取状态为预取结束状态时,停止到数据存储器中预取数据。
预取到的数据可以直接存储到cache中,也可以先缓存到设置的预取缓冲器中prefetch buffer,预取缓冲器为一个缓冲装置,用于在需要时缓冲预取到的数据。具体可以通过预取控制寄存器配置预取缓存配置信息对预取数据的存储方式进行控制。因此,在预取到数据后,本发明实施例所述的方法缓存这些数据的步骤可以包括:将从数据存储器中预取到的数据缓存到缓存器中或者缓存到预取缓冲器中;其中,当根据预置的预取缓存配置信息将从数据存储器中预取到的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据时,将所述数据存储器中预取到的数据缓存到预取缓冲器中。
具体的,如果配置的缓存目的地址为cache,则将预取到的数据直接缓存到cache中,而如果配置的缓存目的地址为预取缓冲器prefetch buffer,则将预取到的数据直接缓存到prefetch buffer中。另外,如果配置的缓存目的地址为cache,但预取到的数据在遇到缓存冲突时,例如遇到等待缓存器的存储单元cache line(缓存器的存储单元分配超过预设时间值)的分配或prefetch逻辑正在缓存另一条数据到cache中时,则将数据缓存到预取缓冲器prefetch buffer中。
进一步的,对预取的数据进行缓存时,还可以通过设置多级缓存来进一步提高数据的访问效率。例如设置一级缓存器和二级缓存器的两级高速缓存,根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;将获取的数据或者连续存储的数组数据存储到一级缓存器中。所述预设阈值可以是一个值例如80%或90%等值,也可以为一个范围,阈值是可以根据时间应用或经验值灵活设置。
二级缓存器具有包容性,即一级缓存器中的数据都出现在二级缓存器中,以便于I/O和cache之间内容一致性。并且,由于一级缓存器的数据量较小,且为常被访问的数据,可以使得可执行程序需要访问数据时,首先到一级缓存器中访问数据,可以较为有效地提高访问效率。
本发明实施例还提供了另一种计算机存储介质,所述计算机存储介质可存储有程序,该程序执行时包括如上述图7对应实施例所述的方法。
本发明实施例中,缓存器能够根据开关指令进行数据预取功能的开关控制,可以根据代码的实际数据访问需求进行数据的预取操作,不仅降低了功耗,节约了成本,并且可在一定程度上避免预取误操作带来的缓存污染问题。并且进一步地还可以根据预取模式以及预取的数据量大小的指示,到内存或者硬盘中预取数据,降低了硬件预取的复杂性,在一定程度上提高了预取的效率。
下面对本发明实施例的数据预取装置进行详细说明。
请参见图8,是本发明实施例的一种数据预取控制装置的结构示意图,在一种实现方式下,本发明实施例的所述数据预取装置可以为计算机系统中的处理器,本发明实施例的所述装置包括:
程序运行模块11,用于运行可执行程序;
预取控制模块12,用于当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述预取控制模块12具体包括:
预取开启控制单元121,用于若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;
预取关闭控制单元122,用于若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
可执行程序包括各类计算机应用程序,所述程序运行模块11在加载并运行所述可执行程序的过程中,在运行到所述可执行程序的各代码时,会生成相应的计算机指令以控制计算机的其他模块,例如发出访问指令访问内存或者硬盘中的数据,发出显示指令在计算机显示器上显示相应内容,此为现有技术。
预取控制模块12开启的预取功能主要是指:可执行程序被运行的过程中在某段代码需要访问内存等数据存储器中的数据之前,Cache能够将所需指令或数据提前从数据存储器中提取并存储到缓存器Cache中。
所述预取开启代码、预取关闭代码可以是在所述可执行程序的预编译阶段,根据对程序代码所要访问的数据的分析结果,识别出需要预取数据的代码区间后,将相应的预取开启代码和预取关闭代码插入到对应的代码区间,在该代码区间的开始处插入预取开启代码Prefetch.on,在该代码区间的结束位置插入预取关闭代码Prefetch.off,当然还可以在该代码区间的开始处插入用于指示预取模式的预取模式代码。
在包括预取代码插入操作的预编译阶段完成后,用户可以根据需要在任何时候运行该可执行程序。所述程序运行模块11在加载并运行该可执行程序的过程中,当运行到插入其中的预取开启代码、预取关闭代码等预取代码时,所述预取控制模块12会开启预取功能到内存、硬盘等数据存储器中预取数据;或者关闭预取功能停止预取数据。
在开启预取功能后,所述预取开启控制单元121根据处理器当前运行所述可执行程序时发出的数据访问指令,控制到内存或者直接到硬盘中预取数据。而当关闭预取功能后,所述预取关闭控制单元122则控制停止到内存或者硬盘中预取数据。
具体可以是控制开启或关闭内置在处理器中的缓存器的预取功能去预取数据或者停止预取数据。
缓存器在接收开启预取功能的指令后,开启预取功能,根据处理器当前运行所述可执行程序时发出的数据访问请求,去内存或者直接到硬盘中预取数据。而当接收到关闭预取功能的指令后,则关闭预取功能,停止到内存或者硬盘中预取数据。
本发明实施例在可执行程序的运行过程中,当运行到预先插入在所述可执行程序中的包括用于指示预取开始和预取结束的预取代码时,相应地开启预取功能或者关闭预取功能,可以根据代码的实际数据访问需求对数据的预取操作进行控制,不必使一直处于数据预取开启状态,不仅降低了功耗,节约了成本,并且在一定程度上避免了预取误操作带来的缓存污染问题。
进一步的,请参见图9,是本发明实施例的另一种数据预取控制装置的结构示意图,本发明实施例包括上述实施例中的程序运行模块11、预取控制模块12,进一步的,在本发明实施例中的所述装置还可以包括:
区间识别模块13,用于在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间;
代码插入模块14,用于在所述密集访存的代码区间插入预取代码。
在本发明实施例中,所述代码插入模块14插入的开启预取功能的代码可以被标记为prefetch.on,关闭预取功能的代码可以被标记为prefetch.off,预取模式的代码可以被标记为set.prefetch.mode i:i值对应不同的数据预取模式,查询预取模式的代码可以被标记为get.prefetch.mode。
进一步可选的,再请参见图9,在本发明实施例中的所述装置还可以包括:
状态存储模块15,用于在检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
查找模块16,用于在检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
所述预取控制模块12还用于若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
目前的计算机系统一般为多任务系统,可以处理多个任务对应的可执行程序,在将当前运行的所述可执行程序切换为运行其他程序时,所述状态存储模块15将可执行程序在切换前所处的预取状态记录到某一指定的存储器中,具体可以存储到计算机操作系统的任务控制块中。
在所述状态存储模块15完成预取状态的存储之后,还可以关闭数据预取功能;或者,可以到计算机操作系统的任务控制块等指定的存储器中查找并读取切换后的所述其他程序的预取状态,以执行相应的关于所述其他程序数据预取控制操作。
当计算机系统再次运行所述可执行程序时,所述查找模块16到计算机操作系统的任务控制块等指定的存储器中读取所述可执行程序的预取状态,然后执行相应的关于所述可执行程序的预取控制操作。
预取状态包括预取开启状态以及预取结束状态,为预取开始状态时存储预取开始、预取模式、预取数据量大小等信息。当处于预取开启状态时,所述预取控制模块12同样可以对如上述表1的预取指令进行赋值,生成用于控制缓存器开启预取功能以预取数据的预取控制指令、用于控制开启缓存器的预取功能并按模式值所指示的预取模式以预取数据的预取控制指令、或者用于控制缓存器开启预取功能并按数量值所指示的数量以预取数据的预取控制指令以预取数据;而处于预取结束状态时,所述预取控制模块12生成用于控制缓存器关闭预取功能以停止预取数据的预取控制指令以关闭缓存器的预取功能。
具体的,所述预取开启控制单元121,具体用于若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据;
所述预取关闭单元122,具体用于若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
进一步的,本发明实施例的所述预取控制模块12还可以包括:
模式控制单元123,用于若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
预取数控制单元124,用于若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
进一步具体的,请参见图10,本发明实施例的所述区间识别模块13具体可以包括:
第一标记单元131,用于查找预编译过程中所述可执行程序中预置的预取关键字,并根据预取关键字标记出候选密集访存的代码区间;
第一判断单元132,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第一确定单元133,用于在所述第一判断单元132的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
进一步具体的,请参见图11,本发明实施例的所述区间识别模块13还可以包括:
第二标记单元134,用于识别确定出所述可执行程序中为循环体的代码区间;并将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
第二判断单元135,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第二确定单元136,用于在所述第二判断单元135的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
或者,请参见图12,本发明实施例的所述区间识别模块13还可以包括:
第三标记单元137,用于根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
第三判断单元138,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第三确定单元139,用于在所述第三判断单元138的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
需要说明的是,所述区间识别模块13可以同时包括上述图10至图12所示的单元,以便于根据需要执行相应的操作完成可执行程序对应程序的预处理。
上述的所述密集访存的代码区间可以是指:数据读取和存储操作(访存操作)相对于所有操作所占比例相对较大的代码区间,比如该代码区间访存操作占整个操作比例达到50%以上。
本发明实施例的所述代码插入模块14则具体可以包括:
第一插入单元,用于在所述密集访存的代码区间的代码入口处插入预取开启代码;
第二插入单元,用于在所述密集访存的代码区间的代码出口处插入预取关闭代码。
可选地,还可以包括:
第三插入单元,用于在所述密集访存的代码区间的代码入口处插入预取模式代码;或
第四插入单元,用于在所述密集访存的代码区间的代码入口处插入预取数代码。
另外,对于开启预取功能预取到数据之后,再请参见图9,本发明实施例的所述装置还可以包括:
存储模块17,用于将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
转存模块18,用于将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
预取到的数据可以直接存储到cache中,也可以先缓存到预置的一个预取缓冲器prefetch buffer中,预取缓冲器为一个缓冲装置,用于在需要时缓冲预取到的数据。具体可以通过控制寄存器配置预取缓存配置信息对预取数据的存储方式进行控制。
具体的,如果配置的缓存目的地址为cache,所述存储模块17则将预取到的数据直接缓存到cache中,而如果配置的缓存目的地址为预取缓冲器prefetchbuffer,所述存储模块17则将预取到的数据直接缓存到prefetch buffer中。
如果配置的缓存目的地址为cache,但预取到的数据在遇到缓存冲突时,例如遇到等待缓存器的存储单元cache line(缓存器的存储单元分配超过预设时间值)的分配或prefetch逻辑正在缓存另一条数据到cache中时,所述转存模块18则将数据缓存到预取缓冲器prefetch buffer中。
进一步可选地,本发明实施例的所述装置还可以包括:
获取模块,用于根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
提取模块,用于将获取的数据或者连续存储的数组数据存储到一级缓存器中。
对预取的数据进行缓存时,还可以通过设置多级缓存来进一步提高数据的访问效率。可设置一级缓存器和二级缓存器的两级高速缓存,获取模块根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;提取模块将获取的数据或者连续存储的数组数据存储到一级缓存器中。所述预设阈值可以是一个值例如80%或90%等值,也可以为一个范围,阈值是可以根据时间应用或经验值灵活设置。
二级缓存器具有包容性,即一级缓存器中的数据都出现在二级缓存器中,以便于I/O和cache之间内容一致性。并且,由于一级缓存器的数据量较小,且为常被访问的数据,可以使得可执行程序需要访问数据时,首先到一级缓存器中访问数据,可以较为有效地提高访问效率。
本发明实施例在可执行程序中插入包括用于指示预取开始和预取结束的代码,当可执行程序的运行过程中,能够根据预取代码实现预取功能开启或者关闭,有效地对数据预取操作进行了开关控制,不仅降低了功耗,节约了成本,并且可在一定程度上避免预取误操作带来的缓存污染问题。并且进一步地还可以根据需要插入预取代码的代码区间判断预取的模式、预取的数据量大小等因素,在这些代码区间中插入相应的预取模式指示的代码以及预取的数据量大小的代码,使得缓存器等预取装置能够根据预取控制指令中关于预取模式以及预取的数据量大小的指示,到内存或者硬盘中直接预取数据,降低了硬件预取的复杂性,在一定程度上提高了预取的效率。
再请参见图13,是本发明实施例的又一种数据预取装置的结构示意图;本发明实施例的所述装置可应用在缓存器等用于到内存或者硬盘中预取数据的装置中,具体的,所述装置包括:
接收模块21,用于接收关于所述可执行程序的预取控制指令;所述预取控制指令所指示的预取状态包括预取开启状态或预取结束状态;
预取模块22,用于根据所述预取控制指令执行相应的数据预取控制操作。
所述的预取控制指令由上述图8或图9对应实施例中的装置生成并发送。在所述接收模块21接收到预取控制指令后,所述预取模块22根据预取控制指令的指示,开启相应的预取功能,到内存或者硬盘中预取当前运行的可执行程序所需的数据,或者根据预取控制指令的指示,停止到内存或者硬盘中预取数据。其中,所述预取模块具体用于若为用于控制缓存器开启预取功能以预取数据的预取控制指令,则开启预取功能以在接收到关于所述可执行程序的数据访问请求时,到数据存储器中预取对应的数据;若为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令,则关闭预取功能以停止预取数据
具体的,本发明实施例的所述预取模块包括:
第一预取单元,用于根据所述预取控制指令的预取开启控制位,确定为用于控制缓存器开启预取功能以预取数据的预取控制指令时,根据接收到的关于所述可执行程序的数据访问请求,到数据存储器中预取对应的数据;或者,根据所述预取控制指令的预取开启控制位,确定为用于控制缓存器开启预取功能以预取数据的预取控制指令时,根据当前接收到的关于所述可执行程序的数据访问请求和所述预取控制指令的预取模式控制位指示的预取模式,到数据存储器中预取对应的数据;或者,根据所述预取控制指令的预取开启控制位,确定为用于控制缓存器开启预取功能以预取数据的预取控制指令时,根据当前接收到的关于所述可执行程序的数据访问请求和所述预取控制指令的预取数控制位指示的预取数据量大小,到数据存储器中预取对应的数据;
第二预取单元,用于根据所述预取控制指令的预取结束控制位,确定为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令时,停止到数据存储器中预取数据。
所述预取模块22预取到的数据可以直接存储到cache中,也可以缓存到预取缓冲器中prefetch buffer,具体可以通过预取控制寄存器配置。因此,再请参见图16,本发明实施例的所述装置还可以包括:
存储模块23,用于将从数据存储器中预取到的数据缓存到缓存器中或者缓存到预取缓冲器中;
转存模块24,用于在将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据时,将所述数据存储器中预取的数据缓存到预取缓冲器中。
具体的,所述存储模块23具体可以根据预置的预取缓存配置信息来对预取到的数据进行存储,如果预取缓存配置信息中配置的缓存目的地址为cache,所述存储模块23则将预取到的数据直接缓存到cache中,而如果配置的缓存目的地址为预取缓冲器prefetch buffer,所述存储模块23则将预取到的数据直接缓存到prefetch buffer中。
如果配置的缓存目的地址为cache,但预取到的数据在遇到缓存冲突时,例如遇到等待缓存器的存储单元cache line(缓存器的存储单元分配超过预设时间值)的分配或prefetch逻辑正在缓存另一条数据到cache中时,所述转存模块24则将数据缓存到预取缓冲器prefetch buffer中。
进一步的,对预取的数据进行缓存时,还可以通过设置多级缓存来进一步提高数据的访问效率,因此,再请参见图13,本发明实施例的所述装置还可以包括:
获取模块25,用于根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
提取模块26,用于将获取的数据或者连续存储的数组数据存储到一级缓存器中。
所述获取模块25中的预设阈值可以是一个值例如80%或者90%等值,其也可以是一个范围。所述阈值可以根据时间应用或经验值灵活设置。
二级缓存器具有包容性,即一级缓存器中的数据都出现在二级缓存器中,以便于I/O和cache之间内容一致性。并且,由于一级缓存器的数据量较小,且为常被访问的数据,可以使得可执行程序需要访问数据时,首先到一级缓存器中访问数据,可以较为有效地提高访问效率。
本发明实施例中,缓存器能够根据开关指令进行数据预取功能的开关控制,可以根据代码的实际数据访问需求进行数据的预取操作,不仅降低了功耗,节约了成本,并且可在一定程度上避免预取误操作带来的缓存污染问题。并且进一步地还可以根据预取模式以及预取的数据量大小的指示,到内存或者硬盘中预取数据,降低了硬件预取的复杂性,在一定程度上提高了预取的效率。
请参见图14,是本发明实施例的一种处理器的结构示意图,该处理器中包括执行单元Execution Unit、缓存器Cache、可编程预取单元Programmable PrefethUnit,通过通信总线与外部的输入输出适配Input/Output Adapters,以及内存Memory等存储数据的数据存储器相连。
图15描述了本发明实施例提供的一个计算机系统600的结构,该计算机系统600包括:至少一个处理器601,例如CPU,存储器605,至少一个通信总线602。通信总线用于实现这些组件之间的连接通信。存储器605可能包含高速RAM存储器,也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器605可选的可以包含至少一个位于远离前述处理器601的存储装置。该计算机系统HOST600可选的包含至少一个网络接口或者其他用户接口,用户接口包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。
在一些实施方式中,存储器605存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
操作系统6051,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务;
应用模块6052,包含各种应用程序,用于实现各种应用业务。
应用模块6052中包括但不限于程序运行模块11和预取控制模块12。
应用模块6052中各模块的具体实现参见图8至图12所示实施例中的相应模块以及单元,在此不赘述。
具体地,处理器601用于:运行可执行程序;
当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
进一步可选地,所述处理器601在执行所述运行可执行程序之前,还用于:
在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入预取代码。
进一步可选地,所述处理器601还用于:
检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
进一步可选地,所述处理器601在执行所述若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据时,具体用于:
若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据;
所述处理器601在执行所述若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据,具体用于:
若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
进一步可选地,所述处理器601在执行所述根据该预取代码的指示对到数据存储器中预取数据进行控制时,还用于:
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
所述处理器601在执行所述识别确定出所述可执行程序中密集访存的代码区间,具体用于:
查找预编译过程中所述可执行程序中预置的预取关键字;
根据预取关键字标记出候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
进一步具体的,所述处理器601在执行所述识别确定出所述可执行程序中密集访存的代码区间,具体执行如下步骤:
识别确定出所述可执行程序中为循环体的代码区间;
将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
进一步可选的,所述处理器601在执行所述识别确定出所述可执行程序中密集访存的代码区间,具体用于:
根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
进一步可选地,所述处理器601执行所述在所述密集访存的代码区间插入预取代码时,具体用于:
在所述密集访存的代码区间的代码入口处插入预取开启代码;
在所述密集访存的代码区间的代码出口处插入预取关闭代码。
进一步可选地,所述处理器601执行所述在所述密集访存的代码区间插入预取代码时,具体用于:
在所述密集访存的代码区间的代码入口处插入预取模式代码;
在所述密集访存的代码区间的代码入口处插入预取数代码。
进一步可选地,所述处理器601还用于:
将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
其中,将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
进一步可选地,所述处理器601还用于:
根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
将获取的数据或者连续存储的数组数据存储到一级缓存器中。
本发明实施例在可执行程序中插入包括用于指示预取开始和预取结束的代码,当可执行程序的运行过程中,能够根据预取代码实现预取功能开启或者关闭,有效地对数据预取操作进行了开关控制,不仅降低了功耗,节约了成本,并且可在一定程度上避免预取误操作带来的缓存污染问题。并且进一步地还可以根据需要插入预取代码的代码区间判断预取的模式、预取的数据量大小等因素,在这些代码区间中插入相应的预取模式指示的代码以及预取的数据量大小的代码,使得缓存器等预取装置能够根据预取控制指令中关于预取模式以及预取的数据量大小的指示,到内存或者硬盘中直接预取数据,降低了硬件预取的复杂性,在一定程度上提高了预取的效率。
图16描述了本发明实施例提供的另一个计算机系统700的结构,该计算机系统700包括:至少一个处理器701,例如CPU,存储器705,至少一个通信总线702。通信总线702用于实现这些组件之间的连接通信。存储器705可能包含高速RAM存储器,也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器705可选的可以包含至少一个位于远离前述处理器701的存储装置。该HOST700可选的包含至少一个网络接口或者其他用户接口,所述用户接口包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。
在一些实施方式中,存储器705存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
操作系统7051,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务;
应用模块7052,包含各种应用程序,用于实现各种应用业务。
应用模块7052中包括但不限于程序运行模块和预取控制模块等等。
应用模块7052中各模块的具体实现参见图8或图9或图13所示实施例中的相应模块,在此不赘述。
具体地,处理器701用于:接收关于所述可执行程序的预取控制指令;
根据所述预取控制指令执行相应的数据预取控制操作;
其中,所述根据所述预取控制指令执行相应的数据预取控制操作包括:
若为用于控制缓存器开启预取功能以预取数据的预取控制指令,则开启预取功能以在接收到关于所述可执行程序的数据访问请求时,到数据存储器中预取对应的数据;
若为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令,则关闭预取功能以停止预取数据。
所述处理器701在执行若为用于控制缓存器开启预取功能以预取数据的预取控制指令,则开启预取功能以在接收到关于所述可执行程序的数据访问请求时,到数据存储器中预取对应的数据,具体用于:根据所述预取控制指令的预取开启控制位,确定为用于控制缓存器开启预取功能以预取数据的预取控制指令时,根据接收到的关于所述可执行程序的数据访问请求,到数据存储器中预取对应的数据;
或者,根据所述预取控制指令的预取开启控制位,确定为用于控制缓存器开启预取功能以预取数据的预取控制指令时,根据当前接收到的关于所述可执行程序的数据访问请求和所述预取控制指令的预取模式控制位指示的预取模式,到数据存储器中预取对应的数据;
或者,根据所述预取控制指令的预取开启控制位,确定为用于控制缓存器开启预取功能以预取数据的预取控制指令时,根据当前接收到的关于所述可执行程序的数据访问请求和所述预取控制指令的预取数控制位指示的预取数据量大小,到数据存储器中预取对应的数据。
所述处理器701在执行若为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令,则关闭预取功能以停止预取数据时,具体用于:
根据所述预取控制指令的预取结束控制位,确定为用于控制缓存器关闭预取功能以停止预取数据的预取控制指令时,停止到数据存储器中预取数据。
所述处理器701还用于将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
其中,在将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据时,将所述数据存储器中预取的数据缓存到预取缓冲器中。
所述处理器701还用于根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
将获取的数据或者连续存储的数组数据存储到一级缓存器中。
本发明实施例中,缓存器能够根据开关指令进行数据预取功能的开关控制,可以根据代码的实际数据访问需求进行数据的预取操作,不仅降低了功耗,节约了成本,并且可在一定程度上避免预取误操作带来的缓存污染问题。并且进一步地还可以根据预取模式以及预取的数据量大小的指示,到内存或者硬盘中预取数据,降低了硬件预取的复杂性,在一定程度上提高了预取的效率。
再请参见图17,是本发明实施例的一种数据预取系统的结构示意图,本发明实施例的所述系统包括程序运行装置1、可编程预取装置2、缓存器3以及数据存储器4;其中,所述数据存储器4中存储有可执行程序需要访问的数据,其具体可以为内存或者硬盘等;
所述程序运行装置1用于运行所述可执行程序;
所述可编程预取装置2用于当所述程序运行装置运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示控制所述缓存器到所述数据存储器中预取数据;
所述缓存器3用于到所述数据存储器中预取数据;
其中,所述可编程预取装置2具体用于:若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启所述缓存器的预取功能;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭所述缓存器的预取功能;
所述缓存器3具体用于在预取功能被开启后到所述数据存储器中预取数据;以及,在预取功能被关闭后,停止到所述数据存储器中预取数据。
进一步可选地的,所述程序运行装置1还用于在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入预取代码。
进一步可选地的,所述可编程预取装置2还用于检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
本发明实施例在可执行程序的运行过程中,当运行到预先插入在所述可执行程序中的包括用于指示预取开始和预取结束的预取代码时,相应地开启预取功能或者关闭预取功能,可以根据代码的实际数据访问需求对数据的预取操作进行控制,不必使一直处于数据预取开启状态,不仅降低了功耗,节约了成本,并且在一定程度上避免了预取误操作带来的缓存污染问题。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (39)
1.一种数据预取方法,其特征在于,包括:
运行可执行程序;
当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
2.如权利要求1所述的方法,其特征在于,所述运行可执行程序之前,还包括:
在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入所述预取代码。
3.如权利要求1或2所述的方法,其特征在于,还包括:
检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
4.如权利要求1-3任一项所述的方法,其特征在于,
所述若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据,包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据;
所述若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据,包括:
若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
5.如权利要求1-4任一项所述的方法,其特征在于,所述根据该预取代码的指示对到数据存储器中预取数据进行控制,还包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
6.如权利要求2-5任一项所述的方法,其特征在于,所述识别确定出所述可执行程序中密集访存的代码区间,包括:
查找预编译过程中所述可执行程序中预置的预取关键字;
根据预取关键字标记出候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
7.如权利要求2-6任一项所述的方法,其特征在于,所述识别确定出所述可执行程序中密集访存的代码区间,包括:
识别确定出所述可执行程序中为循环体的代码区间;
将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
8.如权利要求2-6任一项所述的方法,其特征在于,所述识别确定出所述可执行程序中密集访存的代码区间,包括:
根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
9.如权利要求2-8任一项所述的方法,其特征在于,所述在所述密集访存的代码区间插入所述预取代码,包括:
在所述密集访存的代码区间的代码入口处插入预取开启代码;
在所述密集访存的代码区间的代码出口处插入预取关闭代码。
10.如权利要求9所述的方法,其特征在于,所述在所述密集访存的代码区间插入所述预取代码,还包括:
在所述密集访存的代码区间的代码入口处插入预取模式代码;或
在所述密集访存的代码区间的代码入口处插入预取数代码。
11.如权利要求1-10任一项所述的方法,其特征在于,还包括:
将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
其中,将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
12.如权利要求1-11任一项所述的方法,其特征在于,还包括:
根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
将获取的数据或者连续存储的数组数据存储到一级缓存器中。
13.一种数据预取控制装置,其特征在于,包括:
程序运行模块,用于运行可执行程序;
预取控制模块,用于当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述预取控制模块具体包括:
预取开启控制单元,用于若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;
预取关闭控制单元,用于若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
14.如权利要求13所述的装置,其特征在于,还包括:
区间识别模块,用于在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间;
代码插入模块,用于在所述密集访存的代码区间插入所述预取代码。
15.如权利要求13或14所述的装置,其特征在于,还包括:
状态存储模块,用于在检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
查找模块,用于在检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
所述预取控制模块还用于若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
16.如权利要求13至15任一项所述的装置,其特征在于,
所述预取开启控制单元,具体用于若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据;
所述预取关闭单元,具体用于若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
17.如权利要求13-16任一项所述的装置,其特征在于,所述预取控制模块还包括:
模式控制单元,用于若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
预取数控制单元,用于若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
18.如权利要求14至17任一项所述的装置,其特征在于,所述区间识别模块包括:
第一标记单元,用于查找预编译过程中所述可执行程序中预置的预取关键字;并根据预取关键字标记出候选密集访存的代码区间;
第一判断单元,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第一确定单元,用于在所述第一判断单元的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
19.如权利要求14至17任一项所述的装置,其特征在于,所述区间识别模块包括:
第二标记单元,用于识别确定出所述可执行程序中为循环体的代码区间;并将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
第二判断单元,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第二确定单元,用于在所述第二判断单元的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
20.如权利要求14至17任一项所述的装置,其特征在于,所述区间识别模块包括:
第三标记单元,用于根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
第三判断单元,用于判断所述被标记为候选密集访存的代码区间是否满足预取条件;
第三确定单元,用于在所述第三判断单元的判断结果为满足时,将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
21.如权利要求16至20任一项所述的装置,其特征在于,所述代码插入模块包括:
第一插入单元,用于在所述密集访存的代码区间的代码入口处插入预取开启代码;
第二插入单元,用于在所述密集访存的代码区间的代码出口处插入预取关闭代码。
22.如权利要求21所述的装置,其特征在于,所述代码插入模块还包括:
第三插入单元,用于在所述密集访存的代码区间的代码入口处插入预取模式代码;或
第四插入单元,用于在所述密集访存的代码区间的代码入口处插入预取数代码。
23.如权利要求14-22任一项所述的装置,其特征在于,还包括:
存储模块,用于将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
转存模块,用于将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
24.如权利要求14-23任一项所述的装置,其特征在于,还包括:
获取模块,用于根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
提取模块,用于将获取的数据或者连续存储的数组数据存储到一级缓存器中。
25.一种计算机系统,其特征在于,包括:
总线;
与所述总线相连的处理器;
与所述总线相连的存储器;
其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于:
运行可执行程序;
当运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示对到数据存储器中预取数据进行控制;
其中,所述根据该预取代码的指示对到数据存储器中预取数据进行控制包括:
若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据。
26.如权利要求25所述的计算机系统,其特征在于,所述处理器在执行所述运行可执行程序之前,还用于:
在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入所述预取代码。
27.如权利要求25或26所述的计算机系统,其特征在于,所述处理器还用于:
检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;
检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;
若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
28.如权利要求25-27任一项所述的计算机系统,其特征在于,
所述处理器在执行所述若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启预取功能到数据存储器中预取数据时,具体用于:
若所述预取代码包括用于指示开启预取功能的预取开启代码,设置预取指令中的预取开启控制位为有效得到控制指令,以控制开启缓存器的预取功能以到数据存储器中预取数据;
所述处理器在执行所述若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭预取功能停止到数据存储器中预取数据时,具体用于:
若所述预取代码包括用于指示关闭预取功能的预取关闭代码,设置预取指令中的预取结束控制位为有效得到控制指令,以控制关闭缓存器的预取功能以停止到数据存储器中预取数据。
29.如权利要求25-28任一项所述的计算机系统,其特征在于,所述处理器在执行所述根据该预取代码的指示对到数据存储器中预取数据进行控制时,还用于:
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取模式的预取模式代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取模式的预取模式控制位的模式值得到控制指令,以控制开启缓存器的预取功能并按模式值所指示的预取模式到数据存储器中预取数据的预取控制指令;
若所述预取代码包括用于指示开启预取功能的预取开启代码和用于指示预取的数据量大小的预取数代码,设置预取指令中的预取开启控制位为有效,并设置用于指示预取的数据量大小的预取数控制位的数量值得到控制指令,以控制开启缓存器的预取功能并按数量值所指示的数量到数据存储器中预取数据。
30.如权利要求26-29任一项所述的计算机系统,其特征在于,所述处理器在执行所述识别确定出所述可执行程序中密集访存的代码区间时,具体用于:
查找预编译过程中所述可执行程序中预置的预取关键字;
根据预取关键字标记出候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序的密集访存的代码区间。
31.如权利要求26-29任一项所述的计算机系统,其特征在于,所述处理器在执行所述识别确定出所述可执行程序中密集访存的代码区间时,具体用于:
识别确定出所述可执行程序中为循环体的代码区间;
将所述可执行程序中被识别为循环体的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
32.如权利要求26-29任一项所述的计算机系统,其特征在于,所述处理器在执行所述识别确定出所述可执行程序中密集访存的代码区间时,具体用于:
根据所述可执行程序被预编译过程中的数据访问规律,将以呈线性规律变化的方式密集访问同一存储单元的代码区间或者以呈线性规律变化的方式访问存储单元的代码区间标记为候选密集访存的代码区间;
判断所述被标记为候选密集访存的代码区间是否满足预取条件;
若满足,则将所述被标记为候选密集访存的代码区间确定为所述可执行程序中密集访存的代码区间。
33.如权利要求26-32任一项所述的计算机系统,其特征在于,所述处理器执行所述在所述密集访存的代码区间插入所述预取代码时,具体用于:
在所述密集访存的代码区间的代码入口处插入预取开启代码;
在所述密集访存的代码区间的代码出口处插入预取关闭代码。
34.如权利要求33所述的计算机系统,其特征在于,所述处理器执行所述在所述密集访存的代码区间插入所述预取代码时,具体还用于:
在所述密集访存的代码区间的代码入口处插入预取模式代码;或
在所述密集访存的代码区间的代码入口处插入预取数代码。
35.如权利要求25-34任一项所述的计算机系统,其特征在于,所述处理器还用于:
将从数据存储器中预取的数据缓存到缓存器中或者缓存到预取缓冲器中;
其中,将从数据存储器中预取的数据缓存到缓存器中时,若缓存器的存储单元分配超过预设时间值、或者缓存器正在存入其他数据,则将所述数据存储器中预取的数据缓存到预取缓冲器中。
36.如权利要求25至35任一项所述的计算机系统,其特征在于,所述处理器还用于:
根据对缓存器中缓存的数据的命中率,获取缓存器中命中率超过预设阈值的数据或者连续存储的数组数据;
将获取的数据或者连续存储的数组数据存储到一级缓存器中。
37.一种数据预取系统,其特征在于,包括程序运行装置、可编程预取装置、缓存器以及数据存储器,其中,所述数据存储器中存储有可执行程序需要访问的数据;
所述程序运行装置用于运行所述可执行程序;
所述可编程预取装置用于当所述程序运行装置运行到插入在所述可执行程序中的预取代码时,根据该预取代码的指示控制所述缓存器到所述数据存储器中预取数据;
所述缓存器用于到所述数据存储器中预取数据;
其中,所述可编程预取装置具体用于:若所述预取代码包括用于指示开启预取功能的预取开启代码,控制开启所述缓存器的预取功能;若所述预取代码包括用于指示关闭预取功能的预取关闭代码,控制关闭所述缓存器的预取功能;
所述缓存器具体用于在预取功能被开启后到所述数据存储器中预取数据;以及,在预取功能被关闭后,停止到所述数据存储器中预取数据。
38.如权利要求37所述的系统,其特征在于,
所述程序运行装置,还用于在所述可执行程序的预编译过程中,识别确定出所述可执行程序中密集访存的代码区间,并在所述密集访存的代码区间插入预取代码。
39.如权利要求37或38所述的系统,其特征在于,
所述可编程预取装置,还用于检测到从所述可执行程序切换至其他程序时,存储当前所述可执行程序所处的预取状态,所述预取状态包括预取已开启的状态和预取已关闭的状态;检测到由所述其他程序切换回所述可执行程序时,查找存储的所述可执行程序所处的预取状态;若预取状态包括预取已开启的状态,控制开启预取功能到数据存储器中预取数据;若预取状态包括预取已关闭的状态,控制关闭预取功能停止到数据存储器中预取数据。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013073569 | 2013-04-01 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103608768A true CN103608768A (zh) | 2014-02-26 |
CN103608768B CN103608768B (zh) | 2017-03-01 |
Family
ID=50126067
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201380001332.5A Active CN103608768B (zh) | 2013-04-01 | 2013-04-01 | 一种数据预取方法、相关装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103608768B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105426322A (zh) * | 2015-12-31 | 2016-03-23 | 华为技术有限公司 | 一种数据的预取方法及装置 |
CN106293792A (zh) * | 2015-06-02 | 2017-01-04 | 腾讯科技(深圳)有限公司 | 软件启动方法和装置 |
CN108139977A (zh) * | 2015-12-08 | 2018-06-08 | 上海兆芯集成电路有限公司 | 具有可编程预取器的处理器 |
CN111158907A (zh) * | 2019-12-26 | 2020-05-15 | 深圳市商汤科技有限公司 | 数据处理方法及装置、电子设备和存储介质 |
US20210357928A1 (en) * | 2018-10-22 | 2021-11-18 | Chikara MATSUNAGA | Blockchain system, and data transaction system in which blockchain system is used |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1306246A (zh) * | 1999-12-10 | 2001-08-01 | 国际商业机器公司 | 预取由转移历史引导的指令/数据 |
CN1349160A (zh) * | 2001-11-28 | 2002-05-15 | 中国人民解放军国防科学技术大学 | 流水线控制相关延迟消除方法 |
US20040193807A1 (en) * | 2003-03-27 | 2004-09-30 | Kazuhiko Mogi | Data prefetching method |
CN1894664A (zh) * | 2003-12-19 | 2007-01-10 | 英特尔公司 | 基于编译器和无用单元收集器的分析来动态地插入预取指令的方法和装置 |
CN101149704A (zh) * | 2007-10-31 | 2008-03-26 | 中国人民解放军国防科学技术大学 | 微处理器中分段高速缓存的设计方法及分段高速缓存 |
-
2013
- 2013-04-01 CN CN201380001332.5A patent/CN103608768B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1306246A (zh) * | 1999-12-10 | 2001-08-01 | 国际商业机器公司 | 预取由转移历史引导的指令/数据 |
CN1349160A (zh) * | 2001-11-28 | 2002-05-15 | 中国人民解放军国防科学技术大学 | 流水线控制相关延迟消除方法 |
US20040193807A1 (en) * | 2003-03-27 | 2004-09-30 | Kazuhiko Mogi | Data prefetching method |
CN1894664A (zh) * | 2003-12-19 | 2007-01-10 | 英特尔公司 | 基于编译器和无用单元收集器的分析来动态地插入预取指令的方法和装置 |
CN101149704A (zh) * | 2007-10-31 | 2008-03-26 | 中国人民解放军国防科学技术大学 | 微处理器中分段高速缓存的设计方法及分段高速缓存 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106293792A (zh) * | 2015-06-02 | 2017-01-04 | 腾讯科技(深圳)有限公司 | 软件启动方法和装置 |
US10747550B2 (en) | 2015-06-02 | 2020-08-18 | Tencent Technology (Shenzhen) Company Limited | Method, terminal and storage medium for starting software |
CN108139977A (zh) * | 2015-12-08 | 2018-06-08 | 上海兆芯集成电路有限公司 | 具有可编程预取器的处理器 |
CN105426322A (zh) * | 2015-12-31 | 2016-03-23 | 华为技术有限公司 | 一种数据的预取方法及装置 |
CN105426322B (zh) * | 2015-12-31 | 2019-05-28 | 华为技术有限公司 | 一种数据的预取方法及装置 |
US20210357928A1 (en) * | 2018-10-22 | 2021-11-18 | Chikara MATSUNAGA | Blockchain system, and data transaction system in which blockchain system is used |
CN111158907A (zh) * | 2019-12-26 | 2020-05-15 | 深圳市商汤科技有限公司 | 数据处理方法及装置、电子设备和存储介质 |
CN111158907B (zh) * | 2019-12-26 | 2024-05-17 | 深圳市商汤科技有限公司 | 数据处理方法及装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103608768B (zh) | 2017-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20130086564A1 (en) | Methods and systems for optimizing execution of a program in an environment having simultaneously parallel and serial processing capability | |
US8490065B2 (en) | Method and apparatus for software-assisted data cache and prefetch control | |
Lin et al. | Reducing DRAM latencies with an integrated memory hierarchy design | |
US6564313B1 (en) | System and method for efficient instruction prefetching based on loop periods | |
US20190004916A1 (en) | Profiling asynchronous events resulting from the execution of software at code region granularity | |
US7424578B2 (en) | Computer system, compiler apparatus, and operating system | |
CN1306418C (zh) | 从存储装置中检索信息的方法和系统 | |
CN103608768A (zh) | 一种数据预取方法、相关装置及系统 | |
CN101539853B (zh) | 信息处理单元、执行方法和指令序列生成方法 | |
CN102981807B (zh) | 一种基于cuda并行环境的gpu程序优化方法 | |
US6782454B1 (en) | System and method for pre-fetching for pointer linked data structures | |
CN101158925B (zh) | 用于支持跟踪和标准高速缓存行的同时存储的装置和方法 | |
EP0752645A2 (en) | Tunable software control of Harvard architecture cache memories using prefetch instructions | |
US7243195B2 (en) | Software managed cache optimization system and method for multi-processing systems | |
US6668307B1 (en) | System and method for a software controlled cache | |
CN109461113B (zh) | 一种面向数据结构的图形处理器数据预取方法及装置 | |
US11231933B2 (en) | Processor with variable pre-fetch threshold | |
CN101589373A (zh) | 硬件触发的数据高速缓存行预分配 | |
CN113934431A (zh) | 一种量子程序编译方法、装置及电子设备 | |
CN112130848B (zh) | 一种面向便笺式存储器的带宽感知循环分块优化方法、编译系统、设备及存储介质 | |
CN105487989A (zh) | 一种降低响应延时提高系统效率的中断控制器及控制方法 | |
CN112148366A (zh) | 一种芯片降低功耗提升性能的flash加速方法 | |
Siddique et al. | Lmstr: Local memory store the case for hardware controlled scratchpad memory for general purpose processors | |
US11403082B1 (en) | Systems and methods for increased bandwidth utilization regarding irregular memory accesses using software pre-execution | |
US20050050534A1 (en) | Methods and apparatus to pre-execute instructions on a single thread |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |