一种将内存中的指令提前预取到高速缓存的方法和装置
技术领域
本发明涉及数据存储技术领域,特别是涉及一种将内存中的指令提前预取到高速缓存的方法和装置。
背景技术
由于内存的访问速度较慢,因此,大部分芯片都增加了高速缓存,如果CPU需要读取指令,先将指令从内存中取出来,并放入高速缓存中,进而,CPU无需再通过访问内存读取指令,而是直接通过访问高速缓存读取指令。由于高速缓存的访问速度比内存快,因此,这种基于高速缓存的指令读取方法提升了CPU的性能。为了保证CPU需要读取的每条指令都能提前出现在高速缓存中,从而使CPU无需任何等待就能够直接从高速缓存中读取指令,需要提供一种合理的指令预取方案,以便可以在CPU读取即将要读取的指令之前,提前将指令从内存中读取出来,并放入高速缓存中。
目前,现有技术中提供了一种在CPU从高速缓存中读取指令时实施的指令预取方案,具体为:每当CPU获得了当前待读取指令的地址,在CPU根据当前待读取指令的地址从高速缓存中读取该当前待读取指令的同时,CPU还会通过查询BTB(Branch Target Buffer,分支目标缓冲器)获得当前待读取指令的下一条指令的地址,然后根据当前待读取指令的下一条指令的地址,进一步检查高速缓存中是否已经存在当前待读取指令的下一条指令,如果不存在,CPU触发预取单元将当前待读取指令的下一条指令从内存中提前预取到高速缓存中。
其中,在BTB中记录有每个跳转指令的地址以及该跳转指令的目标指令的地址,如果经查询发现BTB中包含当前待读取指令的地址,说明该当前待读取指令为跳转指令,CPU再从BTB中获得当前待读取指令的目标指令的地址(当前待读取指令的目标指令即为当前待读取指令的下一条指令);如果经查询发现BTB中不包含当前待读取指令的地址,说明当前待读取指令不是跳转指令,CPU自动将当前待读取指令的地址递加即可得到当前待读取指令的下一条指令的地址。
为了更好地保证CPU即将要读取的指令一定出现在高速缓存中,从而提高高速缓存的命中率,在获得当前待读取指令的下一条指令的地址的同时,CPU还会从BTB中查找距离当前待读取指令最近的跳转指令,并获得距离当前待读取指令最近的跳转指令的目标指令的地址,然后再根据距离当前待读取指令最近的跳转指令的目标指令的地址,检查高速缓存中是否已经存在距离当前待读取指令最近的跳转指令的目标指令的地址,如果不存在,CPU还会触发预取单元将距离当前待读取指令最近的跳转指令的目标指令从内存中提前预取到高速缓存中。但是,这种处理方式会出现一个问题,即,针对同一个跳转指令的目标指令的地址会重复检查高速缓存。
例如,假设在高速缓存中连续存储有10条指令,分别为:指令1-10,指令5为一条跳转指令,其目标指令为指令20。当指令1为当前待读取指令时,CPU在获得指令1的地址后,通过查询BTB确定距离指令1最近的跳转指令为指令5,并且,其目标指令为指令20,CPU就会检查高速缓存中是否存在指令20,如果不存在,就会提前预取。当指令2成为当前待读取指令时,CPU通过查询BTB确定距离指令2最近的跳转指令也是指令5(其目标指令为指令20),CPU还会检查高速缓存中是否存在指令20,同样的问题也会出现在指令3和4上。因此,CPU会执行大量的重复检查工作,这势必浪费了CPU的开销或功耗。
作为上述方案的改进方案,现有技术中还提出了另一种也是实施在取指阶段的指令预取方案,与上述方案不同的是,CPU仅对每几个指令中的一个指令按照上述方式进行检查。仍旧以上述10条指令为例,CPU只在指令1为当前待读取指令时,检查高速缓存中是否存在指令20,而在指令2-10为当前待读取指令时,都不进行检查。显然,这种处理方式可以避免由于重复检查而导致的浪费CPU开销和功耗的问题,但是,这种处理方式也同时漏掉了对一些指令的检查,而在这些漏掉检查的指令中可能存在跳转指令,在不检查的情况下,这些跳转指令的目标指令就不会被提前预取到高速缓存中,这样就会降低了高速缓存的命中率。
例如,指令8为一条距离指令7最近的跳转指令,其目标指令为指令35,由于未经检查,指令8的目标指令35不会被提前预取到高速缓存中。可见,该预取方案仅仅是通过牺牲命中率来换取低开销和低功耗。
综上所述,现有技术中的指令预取方案中,无法实现高命中率和低开销、低功耗上的兼得。
发明内容
为了解决上述技术问题,本发明实施例提供了一种将内存中的指令提前预取到高速缓存的方法和装置,既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
根据本发明实施例的第一方面,公开了一种将内存中的指令提前预取到高速缓存的方法,包括:
在被编译指令集中查找跳转指令;
在查找到的所述跳转指令前插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在目标指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
结合本发明的第一方面,本发明还具有第一种可能,即在查找到的所述跳转指令前插入一条预取指令之前,还包括:
计算查找到的所述跳转指令的跳转距离;
判断所述跳转距离是否大于所述跳转指令与所述跳转指令所在高速缓存块中的最后一条存储指令之间的距离;
则所述在查找到的所述跳转指令前插入一条预取指令具体为:
当查找到的所述跳转指令的跳转距离大于在高速缓存中所述跳转指令与最后一条存储指令之间的距离时,在查找到的所述跳转指令前插入一条预取指令,否则,不在查找到的所述跳转指令前插入预取指令。
结合本发明的第一方面,以及本发明第一方面的第一种可能,本发明还具有第二种可能,即所述在查找到的所述跳转指令前插入一条预取指令,包括:
从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近插入一条预取指令。
结合本发明的第一方面,以及本发明第一方面的第一种可能,本发明还具有第三种可能,即所述在查找到的所述跳转指令前插入一条预取指令,包括:
从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近查找可与即将插入的预取指令并行执行的指令;
在查找到的可与即将插入的预取指令并行执行的指令处插入所述预取指令。
根据本发明实施例的第二方面,公开了一种将内存中的指令提前预取到高速缓存的方法,包括:
接收预取指令的译码结果,所述译码结果为一个跳转指令的地址,在编译时所述预取指令插在所述跳转指令之前;
在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址;
检查高速缓存中所述目标指令的地址处是否存在目标指令;
如果高速缓存中所述目标指令的地址处不存在目标指令,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
结合本发明的第二方面,本发明还具有第一种可能,即所述将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中,包括:
在内存中查找所述目标指令的地址所在的高速缓存块;
从内存中读取查找到的所述高速缓存块,并放入高速缓存中。
根据本发明实施例的第三方面,公开了一种将内存中的指令提前预取到高速缓存的装置,包括:
查找单元,用于在被编译指令集中查找跳转指令;
指令插入单元,用于在查找到的所述跳转指令前插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在目标指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
结合本发明的第三方面,本发明还具有第一种可能,即还包括:
计算单元,用于在所述指令插入单元在查找到的所述跳转指令前插入一条预取指令之前,计算查找到的所述跳转指令的跳转距离;
判断单元,用于判断所述跳转距离是否大于所述跳转指令与所述跳转指令所在高速缓存块中的最后一条存储指令之间的距离;
则所述指令插入单元,用于当所述判断单元的判断结果为是时,在查找到的所述跳转指令前插入一条预取指令,否则,不在查找到的所述跳转指令前插入预取指令。
结合本发明的第三方面,以及本发明第三方面的第一种可能,本发明还具有第二种可能,即所述指令插入单元包括:
遍历子单元,用于从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
第一设置子单元,用于当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近插入一条预取指令。
结合本发明的第三方面,以及本发明第三方面的第一种可能,本发明还具有第三种可能,即所述查找单元包括:
遍历子单元,用于从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
查找子单元,用于当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近查找可与即将插入的预取指令并行执行的指令;
第二设置子单元,用于在查找到的可与即将插入的预取指令并行执行的指令处插入所述预取指令。
根据本发明实施例的第四方面,公开了一种将内存中的指令提前预取到高速缓存的装置,包括:
译码结果接收单元,用于接收预取指令的译码结果,所述译码结果为一个跳转指令的地址,在编译时所述预取指令插在所述跳转指令之前;
查询单元,用于在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址;
检查单元,用于检查高速缓存中所述目标指令的地址处是否存在目标指令;
预取单元,用于当所述检查单元检查出高速缓存中所述目标指令的地址处不存在指令时,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
结合本发明的第四方面,本发明还具有第一种可能,即所述预取单元包括:
查找子单元,用于在内存中查找所述目标指令的地址所在的高速缓存块;
读取子单元,用于从内存中读取查找到的所述高速缓存块,并放入高速缓存中。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案提供了一种将内存中的指令提前预取到高速缓存的方法,具体实施在指令执行阶段的预取方案,预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一种将内存中的指令提前预取到高速缓存中的方法的一个实施例的流程图;
图2为本发明一种将内存中的指令提前预取到高速缓存的方法的另一个实施例的流程图;
图3为本发明中基于一种高速缓存块计算距离的示意图;
图4为本发明中基于另一种高速缓存块计算距离的示意图;
图5为本发明一种将内存中的指令提前预取到高速缓存的方法的另一个实施例的流程图;
图6为本发明一种将内存中的指令提前预取到高速缓存中的方法的一个实施例的流程图;
图7为本发明一种将内存中的指令提前预取到高速缓存的装置的一个实施例结构图;
图8为本发明一种将内存中的指令提前预取到高速缓存的装置的另一个实施例结构图;
图9为本发明中指令插入单元的一个优选结构示意图;
图10为本发明一种将内存中的指令提前预取到高速缓存的装置的另一个实施例结构图;
图11为本发明中预取单元的一个优选结构示意图。
具体实施方式
本发明实施例提供了一种将内存中的指令提前预取到高速缓存的方法和装置。
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明实施例进行详细描述。
实施例一
请参阅图1,其为本发明一种将内存中的指令提前预取到高速缓存中的方法的一个实施例的流程图,该方法包括以下步骤:
步骤101:在被编译指令集中查找跳转指令;
编译器在对被编译指令集中的各条指令进行编译时,可以识别出哪条指令为跳转指令,当编译器识别出跳转指令后,可对该跳转指令进行标记。
步骤102:在查找到的所述跳转指令前插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
例如,编译器在被编译的指令集中查找到第10条指令(为了方便描述,我们把它简称为“指令10”)为一条跳转指令,在指令10前插入一条预取指令,如,设定该预取指令为“ipf.btb pc”,其中,ipf.btb是操作码,pc是操作数,pc指示了指令10(其为一条跳转指令)的地址,当CPU执行到该预取指令时,该预取指令会触发硬件系统中的预取单元在BTB中根据pc所指示的指令10的地址查询指令10的目标指令的地址,如果经查询发现指令10的目标指令为指令25,并获得了指令25的地址为0x10000000后,检查高速缓存中0x10000000处是否存在指令,如果不存在,将内存中位于0x10000000处的指令25提前预取到高速缓存中。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
实施例二
如果在正常执行的指令中插入过多的预取指令,同样也会增加CPU的开销,甚至也会影响指令的正常流水,为了缓解该类问题,本实施例与实施例一的区别在于,仅在符合特定条件的跳转指令前插入一条预取指令,进而减少所插入的预取指令的个数。请参阅图2,其为本发明一种将内存中的指令提前预取到高速缓存的方法的另一个实施例的流程图,包括如下步骤:
步骤201:在被编译指令集中查找跳转指令;
步骤202:计算查找到的所述跳转指令的跳转距离;
例如,编译器查找到被编译指令集中第10条指令(即,指令10)为一条跳转指令,指令10的目标指令为被编译指令集中的第25条指令(即,指令25),可计算出跳转距离为15条指令的长度,也就是说,CPU需要从指令10开始跳转15条指令的长度才能到达指令10的目标指令,即,指令25。
步骤203:判断所述跳转距离是否大于所述跳转指令与所述跳转指令所在高速缓存块中的最后一条存储指令之间的距离,如果是,进入步骤204,否则,执行步骤205;
由于内存是以高速缓存块为单位来存储指令的,因此,在将指令从内存中提前预取到高速缓存时,也是以高速缓存块为单位进行指令预取的,并且,高速缓存也是以高速缓存块为单位来存储指令的。如图3所示,其为高速缓存中包含跳转指令(即指令10)的一个高速缓存块,假设该高速缓存块最多可以一次性存储20条指令,即,该高速缓存块可以一次性顺序存储第1-20条指令(即,指令1-指令20),在该高速缓存块中,指令10与该高速缓存块中的最后一条存储指令(即,指令20)之间的距离为10条指令的长度,而计算出的跳转距离为15条指令的长度,通过判断可知,指令10的跳转距离超出了指令10与该高速缓存块中的最后一条存储指令之间的距离,说明受到存储能力的限制,该高速缓存块中一定不会存储有指令10的目标指令,此时编译器需要在指令10前插入一条预取指令,以便CPU通过执行该预取指令,可以将执行到指令10之前,将指令10的目标指令提前预取到高速缓存中,进而提高高速缓存的命中率。
如图4所示,假设该高速缓存块最多可以存储30条指令,即,该高速缓存块可以一次性地顺序存储第1-30条指令(即,指令1-指令30),在该高速缓存块中指令10与该高速缓存块中的最后一条存储指令(即,指令30)之间的距离为20条指令的长度,而计算出的跳转距离为15条指令的长度,通过判断可知,指令10的跳转距离没有超出指令10与该高速缓存块中的最后一条存储指令之间的距离,说明该高速缓存块会存储有指令10的目标指令,而无需预取指令触发预取单元进行提前预取,此时,为了减少插入预取指令的数量,编译器可以不在指令10前插入预取指令。
步骤204:在查找到的所述跳转指令前插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中,结束流程;
步骤205:不在查找到的所述跳转指令前插入预取指令,结束流程。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
一方面,本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
另一方面,本发明方案还减少了所插入的预取指令的个数,进一步降低了CPU的开销。
实施例三
如果预取指令过早地触发预取单元将目标指令预取到高速缓存中,而CPU在之后的一段时间内都没有执行到提前预取的目标指令的话,过早预取的目标指令很有可能会被其它的缓存指令覆盖,进而造成缓存污染。反之,如果预取指令过晚地触发预取单元将目标指令预取到高速缓存中,致使CPU在需要读取目标指令时,目标指令仍然未完全地读取到高速缓存中,也会降低高速缓存的命中率。为了缓解该类问题,本实施例与实施例一的区别在于,仅在跳转指令前的特定位置处插入一条预取指令,进而避免过早地或过晚地将跳转指令的目标指令预取到高速缓存中。请参阅图5,其为本发明一种将内存中的指令提前预取到高速缓存的方法的另一个实施例的流程图,包括如下步骤:
步骤501:在被编译指令集中查找跳转指令;
步骤502:从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
步骤503:当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在目标指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
例如,当查找到的一个跳转指令为第10条指令(即,指令10),且指令10的目标指令为指令25时,从指令10开始倒序遍历指令:
在第一次遍历时,遍历指令10,计算指令10的执行时间,并判断指令10的执行时间是否大于或等于指令25的预取时间,如果小于,继续第二次遍历;
在第二次遍历时,遍历指令10和指令9,计算指令10和指令9的执行时间总和,并判断指令10和指令9的执行时间总和是否大于或等于指令25的预取时间,如果仍旧小于,继续第三次遍历;
在第三次遍历时,遍历指令10、9和8,计算指令10、9和8的执行时间总和,并判断指令10、9和8的执行时间总和是否大于或等于指令25的预取时间,如果大于,停止第三次遍历,并在指令8附近设置一条预取指令,如,在指令7和指令8之间插入一条预取指令。
需要说明的是,在内存中,指令是以高速缓存块为单元进行存储的,例如,一个内存共包含有10个高速缓存块,而每个高速缓存块又分别存储有100条指令。因此,在实际的预取过程中,预取单元也是以高速缓存块为单位进行预取的,即,预取单元从所有高速缓存块中查找包含目标指令的地址的高速缓存块,并将该高速缓存块一并提前预取到高速缓存中,此时,预取时间不仅仅是一条目标指令的预取时间,而是整个高速缓存块中所有指令的预取时间。
进一步优选的,为了使新插入的预取指令不影响其它指令的正常流水,在停止遍历后,在停止遍历的结束指令附件查找可与即将插入的预取指令并行执行的指令,如果可以查找到这样的指令,在可与即将插入的预取指令并行执行的指令处插入一条预取指令。
需要说明的是,也可以在实施例二所描述的技术方案的基础上,实施本实施例中的方案。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
一方面,本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
另一方面,本发明方案还在适当的位置插入预取指令,进一步避免出现缓存污染,以及提高高速缓存的命中率。
实施例四
请参阅图6,其为本发明一种将内存中的指令提前预取到高速缓存中的方法的另一个实施例的流程图,该方法包括以下步骤:
步骤601:接收预取指令的译码结果,所述译码结果为一个跳转指令的地址,在编译时所述预取指令插在所述跳转指令之前;
步骤602:在BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址;
步骤603:检查高速缓存中所述目标指令的地址处是否存在目标指令;
步骤604:如果高速缓存中所述目标指令的地址处不存在目标指令,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
一种优选的实现方式是,在内存中查找所述目标指令的地址所在的高速缓存块;从内存中读取查找到的所述高速缓存块,并放入高速缓存中。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
实施例五
与上述一种将内存中的指令提前预取到高速缓存的方法相对应,本发明实施例还提供了一种将内存中的指令提前预取到高速缓存的装置。请参阅图7,其为本发明一种将内存中的指令提前预取到高速缓存的装置的一个实施例结构图,该装置包括查找单元701和指令插入单元702。下面结合该装置的工作原理进一步介绍其内部结构以及连接关系。
查找单元701,用于在被编译指令集中查找跳转指令;
指令插入单元702,用于在查找到的所述跳转指令前插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在目标指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
作为一种优选的结构,如图8所示,在图7所示的结构基础上,该装置还包括:计算单元703和判断单元704;
计算单元703,用于在所述指令插入单元在查找到的所述跳转指令前插入一条预取指令之前,计算查找到的所述跳转指令的跳转距离;
判断单元704,用于判断所述跳转距离是否大于所述跳转指令与所述跳转指令所在高速缓存块中的最后一条存储指令之间的距离;
则指令插入单元702,用于当所述判断单元的判断结果为是时,在查找到的所述跳转指令前插入一条预取指令,否则,不在查找到的所述跳转指令前插入预取指令。
作为另一种优选的结构,如图9所示,在图7所示的结构基础上,指令插入单元702包括:遍历子单元7021和第一设置子单元7022,其中,
遍历子单元7021,用于从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
第一设置子单元7022,用于当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近插入一条预取指令。
或者,一种优选的替换方式为:指令插入单元702包括:
遍历子单元,用于从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;
查找子单元,用于当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近查找可与即将插入的预取指令并行执行的指令;
第二设置子单元,用于在查找到的可与即将插入的预取指令并行执行的指令处插入所述预取指令。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
进一步的,还减少了所插入的预取指令的个数,进一步降低了CPU的开销。还在适当的位置插入预取指令,进一步避免出现缓存污染,以及提高高速缓存的命中率。
实施例六
与上述一种将内存中的指令提前预取到高速缓存的方法相对应,本发明实施例还提供了一将内存中的指令提前预取到高速缓存的装置。请参阅图10,其为本发明一种将内存中的指令提前预取到高速缓存的装置的另一个实施例结构图,该装置包括译码结果接收单元1001、查询单元1002、检查单元1003和预取单元1004。下面结合该装置的工作原理进一步介绍其内部结构以及连接关系。
译码结果接收单元1001,用于接收预取指令的译码结果,所述译码结果为一个跳转指令的地址,在编译时所述预取指令插在所述跳转指令之前;
查询单元1002,用于在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址;
检查单元1003,用于检查高速缓存中所述目标指令的地址处是否存在目标指令;
预取单元1004,用于当所述检查单元检查出高速缓存中所述目标指令的地址处不存在指令时,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
优选的,如图11所示,预取单元1004包括:
查找子单元10041,用于在内存中查找所述目标指令的地址所在的高速缓存块;
读取子单元10042,用于从内存中读取查找到的所述高速缓存块,并放入高速缓存中。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
实施例七
本发明实施例还提供了一种将内存中的指令提前预取到高速缓存的装置。该装置包括一个处理器,该处理器用于在被编译指令集中查找跳转指令;在查找到的所述跳转指令前插入一条预取指令,所述预取指令指示了所述跳转指令的地址,所述预取指令用于控制预取单元在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址,检查高速缓存中所述目标指令的地址处是否存在目标指令,如果不存在,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
优选的,该处理器还用于,在查找到的所述跳转指令前插入一条预取指令之前,计算查找到的所述跳转指令的跳转距离;判断所述跳转距离是否大于所述跳转指令与所述跳转指令所在高速缓存块中的最后一条存储指令之间的距离;
则所述在查找到的所述跳转指令前插入一条预取指令具体为:当查找到的所述跳转指令的跳转距离大于在高速缓存中所述跳转指令与最后一条存储指令之间的距离时,在查找到的所述跳转指令前插入一条预取指令,否则,不在查找到的所述跳转指令前插入预取指令。
优选的,该处理器具体用于,从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近插入一条预取指令。
优选的,该处理器具体用于,从查找到的所述跳转指令开始倒序遍历指令,计算所有遍历过的指令的执行时间总和;当所有遍历过的指令的执行时间总和大于或等于指令预取时间时停止遍历,在停止遍历的结束指令附近查找可与即将插入的预取指令并行执行的指令;在查找到的可与即将插入的预取指令并行执行的指令处插入所述预取指令。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
进一步的,还减少了所插入的预取指令的个数,进一步降低了CPU的开销。还在适当的位置插入预取指令,进一步避免出现缓存污染,以及提高高速缓存的命中率。
实施例八
本发明实施例还提供了一种将内存中的指令提前预取到高速缓存的装置。该装置包括一个处理器,该处理器用于接收预取指令的译码结果,所述译码结果为一个跳转指令的地址,在编译时所述预取指令插在所述跳转指令之前;在分支目标缓冲器BTB中根据所述跳转指令的地址查询所述跳转指令的目标指令的地址;检查高速缓存中所述目标指令的地址处是否存在目标指令;如果高速缓存中所述目标指令的地址处不存在目标指令,将内存中位于所述目标指令的地址处的目标指令提前预取到高速缓存中。
优选的,该处理具体用于,在内存中查找所述目标指令的地址所在的高速缓存块;从内存中读取查找到的所述高速缓存块,并放入高速缓存中。
由上述实施例可以看出,与现有技术相比,本发明的优点在于:
本发明方案预先在跳转指令前插入自定义的预取指令,只有在CPU执行该自定义的预取指令时才会触发硬件系统中的预取单元检查一次高速缓存,CPU执行非预取指令的其它指令时不会触发硬件系统中的预取单元检查高速缓存,不仅不会出现重复检查,还明显地减少了检查次数。并且,由于BTB能够提前预测跳转指令的目标地址,且预测的准确率一般高达95%以上,因此,在预取指令的控制下所执行的指令预取也可以更加准确地将CPU即将要执行的指令提前预取到高速缓存中,提高高速缓存的命中率。可见,本发明方案既可以降低CPU的开销和功耗,又可以提高高速缓存的命中率。
需要说明的是,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上对本发明所提供的一种将内存中的指令提前预取到高速缓存的方法和装置进行了详细介绍,本文中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。