基于重命名寄存器恢复的寄存器上下文还原转让专利

申请号 : CN201880025664.X

文献号 : CN110520837A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : M·K·克施温德岑中龙T·什莱格尔V·萨拉普拉

申请人 : 国际商业机器公司

摘要 :

获得加载请求以还原多个架构寄存器。基于获得所述加载请求,还原所述多个架构寄存器中的一个或多个架构寄存器。所述还原使用将架构寄存器映射到物理寄存器的快照,以用对应于所述一个或多个架构寄存器的快照的一个或多个物理寄存器替换当前分配给所述一个或多个架构寄存器的一个或多个物理寄存器。

权利要求 :

1.一种用于促进计算环境中的处理的计算机程序产品,该计算机程序产品包括:计算机可读存储介质,可由处理电路读取并存储用于执行方法的指令,该方法包括:获得加载请求以还原多个架构寄存器;以及

基于获得所述加载请求,还原所述多个架构寄存器中的一个或多个架构寄存器,其中所述还原使用将架构寄存器映射到物理寄存器的快照,以用对应于所述一个或多个架构寄存器的快照的一个或多个物理寄存器替换当前分配给所述一个或多个架构寄存器的一个或多个物理寄存器。

2.如权利要求1所述的计算机程序产品,其中所述方法还包括:基于获得所述加载请求,确定对应于所述一个或多个架构寄存器的快照是否可用;以及基于所述确定指示所述快照可用,使用所述快照执行所述还原。

3.如权利要求2所述的计算机程序产品,其中所述方法还包括:基于所述确定指示对应于一个或多个架构寄存器的快照不可用,通过将来自存储器的值加载到所述一个或多个架构寄存器中来还原所述一个或多个架构寄存器。

4.如权利要求2所述的计算机程序产品,其中所述确定包括:使用快照堆栈来确定对应于所述一个或多个架构寄存器的快照是否可用。

5.根据权利要求4所述的计算机程序产品,其中所述快照堆栈包括多个条目,并且其中所述快照栈的条目包括标识所述快照的快照标识符。

6.如权利要求5所述的计算机程序产品,其中所述快照堆栈的条目包括附加信息,所述附加信息包括从包括以下各项的组中选择的至少一项:所述一个或多个架构寄存器的内容的存储器中的地址,与所述快照相关联的所述一个或多个架构寄存器的指示,以及指示快照是否有效的有效性指示符。

7.如权利要求1所述的计算机程序产品,其中所述方法还包括:创建快照以保存所述一个或多个物理寄存器到所述一个或多个架构寄存器的映射。

8.如权利要求7所述的计算机程序产品,其中基于获得请求保存所述一个或多个架构寄存器的保存请求来执行创建所述快照。

9.如权利要求8所述的计算机程序产品,其中所述加载请求包括加载多个指令,并且所述保存请求包括存储多个指令。

10.如权利要求1所述的计算机程序产品,其中在不从存储器复制所述一个或多个架构寄存器的值的情况下还原所述一个或多个架构寄存器。

11.一种用于促进计算环境内的处理的计算机系统,所述计算机系统包括:存储器;以及

与所述存储器通信的处理器,其中所述计算机系统被配置为执行一种方法,所述方法包括:获得加载请求以还原多个架构寄存器;以及

基于获得所述加载请求,还原所述多个架构寄存器中的一个或多个架构寄存器,其中,所述还原使用将架构寄存器映射到物理寄存器的快照,以用对应于所述一个或多个架构寄存器的快照的一个或多个物理寄存器替换当前分配给所述一个或多个架构寄存器的一个或多个物理寄存器。

12.如权利要求11所述的计算机系统,其中所述方法还包括:基于获得所述加载请求,确定对应于所述一个或多个架构寄存器的快照是否可用;以及基于所述确定指示所述快照可用,使用所述快照执行所述还原。

13.如权利要求12所述的计算机系统,其中所述方法还包括:基于所述确定指示对应于一个或多个架构寄存器的快照不可用,通过将来自存储器的值加载到所述一个或多个架构寄存器中来还原所述一个或多个架构寄存器。

14.如权利要求12所述的计算机系统,其中,所述确定包括使用快照堆栈来确定对应于所述一个或多个架构寄存器的快照是否可用。

15.如权利要求11所述的计算机系统,其中在不从存储器复制所述一个或多个架构寄存器的值的情况下还原所述一个或多个架构寄存器。

16.一种在计算环境中促进处理的计算机实现的方法,该计算机实现的方法包括:由处理器获得加载请求以还原多个架构寄存器;以及

基于获得所述加载请求,还原所述多个架构寄存器中的一个或多个架构寄存器,其中,所述还原使用将架构寄存器映射到物理寄存器的快照,以用对应于所述一个或多个架构寄存器的快照的一个或多个物理寄存器替换当前分配给所述一个或多个架构寄存器的一个或多个物理寄存器。

17.如权利要求16所述的计算机实现的方法,还包括:基于获得所述加载请求,确定对应于所述一个或多个架构寄存器的快照是否可用;以及基于所述确定指示所述快照可用,使用所述快照执行所述还原。

18.如权利要求17所述的计算机实现的方法,还包括:基于所述确定指示对应于一个或多个架构寄存器的快照不可用,通过将来自存储器的值加载到所述一个或多个架构寄存器中来还原所述一个或多个架构寄存器。

19.如权利要求17所述的计算机实现的方法,其中所述确定包括:使用快照堆栈来确定对应于所述一个或多个架构寄存器的快照是否可用。

20.如权利要求16所述的计算机实现的方法,其中在不从存储器复制所述一个或多个架构寄存器的值的情况下还原所述一个或多个架构寄存器。

说明书 :

基于重命名寄存器恢复的寄存器上下文还原

背景技术

[0001] 一个或多个方面一般地涉及计算环境内的处理,尤其涉及促进这种处理。
[0002] 计算机程序通常调用函数来提供特定操作,例如打印,各种数学运算等。调用该函数的程序被称为调用方,并且被调用的函数被称为被调用方。这些函数中的许多函数非常短,或者由于它们的净静态长度(即,函数不包括许多指令),或者它们的短动态长度(例如,由于早期状态)。
[0003] 与任何其他函数一样,短函数存储它们在堆栈上修改的被调用方保存的寄存器作为函数的序言的一部分并将它们恢复为结语的一部分。堆栈(也称为调用堆栈)由计算机程序用于存储关于计算机程序的活跃函数的信息。类似地,这些函数的调用方将调用方保存的寄存器保存在堆栈中作为函数调用序列的一部分,并在返回时还原它们,如果值存在于函数调用中。保存这些寄存器是调用函数的重要开销。
[0004] 此外,对于短函数,与保存然后还原这些寄存器相关联的开销甚至更高,因为还原只能在保存完成之后发生,并且不能保证发生。在这种情况下,可能会产生额外的处罚,例如引发加载命中存储(load-hit-store)和转发处罚。

发明内容

[0005] 通过提供用于促进计算环境内的处理的计算机程序产品,克服了现有技术的缺点并提供了额外的优点。该计算机程序产品包括可由处理电路读取并存储用于执行方法的指令的存储介质。该方法包括,例如,由处理器获得还原多个架构寄存器的加载请求;基于获得所述加载请求,还原所述多个架构寄存器的一个或多个架构寄存器。所述还原使用将架构寄存器映射到物理寄存器的快照,以用与所述一个或多个架构寄存器对应的所述快照的一个或多个物理寄存器替换当前分配给所述一个或多个架构寄存器的一个或多个物理寄存器。通过使用快照来还原一个或多个架构寄存器,可以通过避免存储器访问来执行还原来提高性能。
[0006] 在一个方面,基于获得所述加载请求,确定对应于所述一个或多个架构寄存器的快照是否可用。基于所述确定指示所述快照可用,使用所述快照执行所述还原。
[0007] 在另一方面,基于所述确定指示对应于所述一个或多个架构寄存器的快照不可用,通过来自存储器的值加载到所述一个或多个架构寄存器中来还原所述一个或多个架构寄存器。
[0008] 作为一个示例,所述确定包括使用快照堆栈来确定对应于所述一个或多个架构寄存器的快照是否可用。
[0009] 所述快照堆栈包括例如多个条目。在一个示例中,快照堆栈的条目包括标识快照的快照标识符。在进一步的示例中,所述快照堆栈的条目包括附加信息,所述附加信息包括从由以下各项组成的组中选择的至少一个:所述一个或多个架构寄存器的内容的存储器中的地址,与所述快照相关联的所述一个或多个架构化寄存器的指示,以及指示快照是否有效的有效性指示符。
[0010] 在另一方面,创建所述快照以保存所述一个或多个物理寄存器到所述一个或多个架构寄存器的映射。
[0011] 在一个示例中,基于获得请求保存所述一个或多个架构寄存器的保存请求来执行所述创建快照。
[0012] 作为示例,所述加载请求包括加载多个指令,并且所述保存请求包括存储多个指令。
[0013] 此外,在一个实施例中,在不从存储器复制所述一个或多个架构寄存器的值的情况下,还原所述一个或多个架构寄存器。
[0014] 本文还描述并要求保护与一个或多个方面有关的方法和系统。此外,还描述了与一个或多个方面有关的服务,并且可以在此要求保护。
[0015] 通过本文描述的技术实现了额外的特征和优点。在此详细描述了其他实施例和方面,并且这些实施例和方面被认为是所要求保护的方面。

附图说明

[0016] 在说明书结论的权利要求中作为示例特别指出并清楚地要求保护一个或多个方面。通过以下结合附图的详细描述,一个或多个方面的前述和目的,特征和优点是显而易见的,其中:
[0017] 图1A示出了结合和使用本发明的一个或多个方面的计算环境的一个示例;
[0018] 图1B示出了根据本发明的一个或多个方面的图1的处理器的进一步细节;
[0019] 图1C描绘了根据本发明的一个或多个方面使用的指令执行流水线的一个示例的进一步细节;
[0020] 图1D示出了根据本发明的一个方面的图1A的处理器的一个示例的进一步细节;
[0021] 图2A示出了根据本发明的一个方面的存储调用方保存的寄存器的一个示例;
[0022] 图2B示出了根据本发明的一个方面的存储被调用方保存的寄存器的一个示例;
[0023] 图3示出了根据本发明的一个方面的架构寄存器到物理寄存器的映射的一个示例;
[0024] 图4A示出了根据本发明的一个方面的与批量保存请求相关联的处理的一个示例;
[0025] 图4B示出了根据本发明的一个方面的与批量还原请求相关联的处理的一个示例;
[0026] 图5A示出了根据本发明的一个或多个方面使用的寄存器重命名表,多个快照和物理重命名文件的一个示例;
[0027] 图5B是根据本发明的一个或多个方面使用的寄存器重命名表、多个快照和物理重命名文件的另一示例;
[0028] 图5C示出了根据本发明的一个方面的回滚快照的一个示例;
[0029] 图5D示出了根据本发明的一个方面的回滚快照的另一个例子;
[0030] 图6示出了根据本发明的一个或多个方面使用的快照堆栈的一个示例;
[0031] 图7A示出了根据本发明的一个方面的溢出多个指令的一个示例;
[0032] 图7B示出了根据本发明的一个方面的重新加载多个指令的一个示例;
[0033] 图8A示出了根据本发明的一个方面的与批量还原请求相关联的处理的另一示例;
[0034] 图8B示出了根据本发明的一个方面的与批量还原请求相关联的处理的又一个示例;
[0035] 图9示出了根据本发明的一个方面的重用快照的一个示例;
[0036] 图10A-10E示出了根据本发明的一个或多个方面的与管理还原快照相关联的处理的示例;
[0037] 图10F示出了根据本发明的一个方面的使用共享快照执行恢复以进行恢复和/或还原的一个示例;
[0038] 图11A-11C示出了根据本发明的一个或多个方面的检查存储器改变和可选地恢复的实施例;
[0039] 图12示出了根据本发明的一个方面的与不匹配的溢出多个/重新加载多对相关联的处理的一个示例;
[0040] 图13A描绘了根据本发明的一个方面的具有相关指示符的数据高速缓存中的条目的一个示例;
[0041] 图13B-13D示出了根据本发明的一个或多个方面的与图13A中示出的指示符相关联的处理的示例;
[0042] 图14A-14B示出了根据本发明的一个或多个方面的与寄存器还原相关的处理的示例;
[0043] 图15A描绘了根据本发明的一个或多个方面的与事务存储器和还原相关联的处理的示例;
[0044] 图15B描绘了根据本发明的一个或多个方面的事物开始指令的一个示例;
[0045] 图15C-15E描绘了根据本发明的一个或多个方面的与事务存储器和还原相关的处理的各方面;
[0046] 图16A-16D描绘了根据本发明的一个或多个方面的用于跟踪存储器改变的技术的示例;
[0047] 图17描绘了根据本发明的一个方面的处理还原请求的一个示例;
[0048] 图18A-18C描绘了根据本发明的一个方面的与上下文切换相关联的处理的示例;
[0049] 图19A示出了根据本发明的一个方面与基于执行事务开始指令来管理快照相关联的处理的一个示例;
[0050] 图19B示出了根据本发明的一个方面的与寄存器保存指示相关联的处理的一个示例;
[0051] 图20A-20B示出了根据本发明的一个或多个方面的与合并存储/加载指令相关联的处理的示例;
[0052] 图21A示出了根据本发明的一个方面使用的包括回写逻辑的存储队列的一个示例;
[0053] 图21B-21C示出了根据本发明的一个或多个方面的回写逻辑处理的示例;
[0054] 图22A示出了根据本发明的一个方面的恢复缓冲器的一个示例;
[0055] 图22B示出了根据本发明的一个方面的包括恢复缓冲器的处理器的一个示例;
[0056] 图23A-23B示出了根据本发明的一个或多个方面的与寄存器分配请求相关联的处理的示例;
[0057] 图24A-24B示出了根据本发明的一个方面的促进计算环境内的处理的一个方面的一个示例;
[0058] 图25A示出了结合和使用本发明的一个或多个方面的计算环境的另一示例;
[0059] 图25B示出了图25A的存储器的进一步细节;
[0060] 图26示出了云计算环境的一个实施例;
[0061] 图27示出了抽象模型层的一个示例。

具体实施方式

[0062] 根据一个或多个方面,提供了一种能力以优化寄存器在功能调用上的保存和还原,从而改善处理并降低与其相关的成本。在一个示例中,该能力使用寄存器重命名来进行保存/还原。
[0063] 参考图1A描述结合和使用本发明的一个或多个方面的计算环境的一个实施例。在一个示例中,计算环境基于由纽约Armonk的国际商业机器公司提供的z/Architecture。z/Architecture的一个实施例在“z/Architecture Principles of Operation”,IBM公开号SA22-7832-10,2015年3月中描述,其全部内容通过引用合并于此。Z/ARCHITECTURE是美国纽约Armonk的国际商业机器公司的注册商标。
[0064] 在另一个示例中,计算环境基于由纽约Armonk的国际商业机器公司提供的Power Architecture。Power Architecture的一个实施例在2015年4月9日国际商业机器公司的“Power ISATM Version  2.07B”中描述,其全部内容通过引用合并于此。POWER ARCHITECTURE是美国纽约Armonk的国际商业机器公司的注册商标的注册商标。
[0065] 计算环境还可以基于其他架构,包括但不限于Intel x86架构。其他例子也存在。
[0066] 如图1A所示,计算环境100包括例如以通用计算设备的形式示出的计算机系统102。计算机系统102可以包括但不限于一个或多个处理器或处理单元104(例如,中央处理单元(CPU)),存储器106(作为示例称为主存储器或存储器),以及一个或多个输入/输出(I/O)接口108,经由一个或多个总线和/或其他连接110彼此耦合。
[0067] 总线110表示几种类型的总线结构中的任何一种或多种,包括存储器总线或存储器控制器、外围总线、加速图形端口,以及使用各种总线架构中的任何总线架构的处理器或本地总线。作为示例而非限制,这样的架构包括工业标准架构(ISA),微通道架构(MCA),增强型ISA(EISA),视频电子标准协会(VESA)本地总线和外围组件互连(PCI)。
[0068] 存储器106可以包括例如高速缓存120,例如共享高速缓存,其可以耦合到处理器104的本地高速缓存122。此外,存储器106可以包括一个或多个程序或应用程序130,操作系统132和一个或多个计算机可读程序指令134。计算机可读程序指令134可以被配置为执行本发明的方面的实施例的功能。
[0069] 计算机系统102还可以经由例如I/O接口108与一个或多个外部设备140,一个或多个网络接口142和/或一个或多个数据存储设备144通信。示例外部设备包括用户终端、磁带驱动器、指示设备、显示器等。网络接口142使计算机系统102能够与一个或多个网络通信,例如局域网(LAN),通用广域网(WAN)和/或公共网络(例如,因特网),提供与其他计算设备或系统的通信。
[0070] 数据存储设备144可以存储一个或多个程序146,一个或多个计算机可读程序指令148和/或数据等。计算机可读程序指令可以被配置为执行本发明的方面的实施例的功能。
[0071] 计算机系统102可以包括和/或耦合到可移动/不可移动,易失性/非易失性计算机系统存储介质。例如,它可以包括和/或耦合到不可移动的非易失性磁介质(通常称为“硬盘驱动器”),用于读取和写入可移动的非易失性磁盘(例如“软盘”)的磁盘驱动器,和/或用于读取或写入可移动的非易失性光盘(例如CD-ROM,DVD-ROM或其他光学介质)的光盘驱动器。应当理解,其他硬件和/或软件组件可以与计算机系统102结合使用。示例包括但不限于:微代码,设备驱动程序,冗余处理单元,外部磁盘驱动器阵列,RAID系统,磁带驱动器和数据存档存储系统等。
[0072] 计算机系统102可以与许多其他通用或专用计算系统环境或配置一起操作。可适用于计算机系统102的众所周知的计算系统,环境和/或配置的示例包括但不限于个人计算机(PC)系统,服务器计算机系统,瘦客户端,胖客户端,手持设备或者膝上型设备,多处理器系统,基于微处理器的系统,机顶盒,可编程消费电子产品,网络PC,小型计算机系统,大型计算机系统,以及包括任何上述系统或设备的分布式云计算环境等。
[0073] 参考图1B描述关于处理器104的一个示例的进一步细节。处理器104包括用于执行指令的多个功能组件。这些功能组件包括,例如,指令获取组件150,用于获取要执行的指令;指令解码单元152,用于解码所取出的指令并获得解码指令的操作数;指令执行组件154,执行解码指令;存储器访问组件156,如果需要,访问存储器以执行指令;以及写回组件
160,用于提供执行指令的结果。根据本发明的一个方面,这些组件中的一个或多个可用于执行一个或多个寄存器还原操作和/或指令166,和/或与其相关联的其他操作/指令。
[0074] 在一个实施例中,处理器104还包括由一个或多个功能组件使用的一个或多个寄存器168。处理器104可以包括比本文提供的示例更多、更少和/或其他组件。
[0075] 参考图1C描述关于处理器104的执行流水线的进一步细节。尽管在此描绘和描述了流水线的各种处理阶段,但是应当理解,在不脱离本发明的方面的精神的情况下,可以使用额外的,更少的和/或其他的阶段。
[0076] 参照图1C,在一个实施例中,从指令队列获取170指令,并且可以执行指令的分支预测172和/或解码174。可以将解码的指令添加到要一起处理的一组指令176。分组的指令被提供给映射器178,映射器178确定任何依赖性,分配资源并将指令/操作组分派给适当的发布队列。存在用于不同类型的执行单元的一个或多个发布队列,包括例如分支,加载/存储,浮点,定点,向量等。在发布阶段180期间,向适当的执行单元发出指令/操作。读取任何寄存器182以检索其源,并且在执行阶段184期间执行指令/操作。如所指示的,执行可以用于分支,加载(LD)或存储(ST),定点操作(FX),浮点运算(FP)或矢量运算(VX),作为示例。在写回阶段186期间将任何结果写入适当的寄存器。随后,指令完成188。如果存在中断或刷新190,则处理可返回到指令获取170。
[0077] 此外,根据本发明的一个或多个方面,耦合到解码单元的是寄存器重命名单元192,其用于寄存器的保存/还原中的一个或多个方面。
[0078] 参考图1D描述关于处理器的其他细节。在一个示例中,诸如处理器104的处理器是流水线处理器,作为示例其可以包括预测硬件、寄存器、高速缓存、解码器,指令序列单元和指令执行单元。预测硬件包括例如本地分支历史表(BHT)105a,全局分支历史表(BHT)105b和全局选择器105c。通过指令获取地址寄存器(IFAR)107访问预测硬件,IFAR 107具有用于下一指令获取的地址。
[0079] 还向指令高速缓存109提供相同的地址,指令高速缓存109可以获取被称为“获取组”的多个指令。与指令高速缓存109相关联的是目录111。
[0080] 使用相同的地址几乎同时访问高速缓存和预测硬件。如果预测硬件具有可用于获取组中的指令的预测信息,则该预测被转发到指令排序单元(ISU)113,ISU 113又向执行单元发出指令以供执行。该预测可以用于结合分支目标计算115和分支目标预测硬件(诸如链路寄存器预测堆栈117a和计数寄存器堆栈117b)来更新IFAR107。如果没有预测信息可用,则一个或多个指令解码器119在获取组中找到分支指令,为该获取组创建预测。预测分支存储在预测硬件中,例如存储在分支信息队列(BIQ)125中,并转发到ISU 113。
[0081] 分支执行单元(BRU)121响应于由ISU 113向其发出的指令而操作。BRU 121具有对条件寄存器(CR)文件123的读访问权。分支执行单元121还可访问分支信息队列125中的分支扫描逻辑存储的信息以确定分支预测的成功,并且可操作地耦合到与微处理器支持的一个或多个线程相对应的指令获取地址寄存器(IFAR)107。根据至少一个实施例,BIQ条目与标识符相关联并由标识符(例如分支标记BTAG)进行标识。当与BIQ条目关联的分支完成时,它将被标记。BIQ条目保留在队列中,并且当最早的队列条目(多个条目)被标记为包含与完成的分支相关联的信息时,它们被顺序地解除分配。当BRU 121发现分支错误预测时,BRU 121进一步可操作地耦合以引起预测器更新。
[0082] 当执行指令时,BRU 121检测预测是否错误。如果预测错误,则预测将要被更新。为此目的,处理器还包括预测器更新逻辑127。预测器更新逻辑127响应来自分支执行单元121的更新指示,并配置成更新本地BHT 105a,全局BHT 105b和全局BMP选择器105c中的一个或多个中的阵列条目。预测器硬件105a,105b和105c可以具有与由指令获取和预测操作使用的读取端口不同的写入端口,或者可以共享单个读取/写入端口。预测器更新逻辑127还可以可操作地耦合到链路堆栈117a和计数寄存器堆栈117b。
[0083] 现在参考条件寄存器文件(CRF)123,CRF 123可由BRU 121读取,并且可由执行单元写入,包括但不限于固定点单元(FXU)141,浮动点单元(FPU)143和矢量多媒体扩展单元(VMXU)145。条件寄存器逻辑执行单元(CRL执行)147(也称为CRU)和专用寄存器(SPR)处理逻辑149已读取和对条件寄存器文件(CRF)123进行写访问。CRU 147对存储在CRF 123中的条件寄存器执行逻辑运算。FXU141能够对CRF 123执行写更新。
[0084] 处理器104还包括加载/存储单元151,以及各种多路复用器109和缓冲区155,以及地址转换表157和其他电路。
[0085] 在处理器104内执行的程序(也称为应用程序)使用硬件寄存器来存储信息。例如,调用例程的程序,例如函数,子例程或其他类型的例程,负责保存调用方使用的寄存器,并在从被调用方返回时还原这些寄存器。同样,被调用方负责保存/还原它使用的寄存器,如下面的代码所示。
[0086] 首先,下面是调用方的示例代码,其保存一组寄存器并稍后还原它们:
[0087] 例1:
[0088]
[0089]
[0090] 在上述调用方的代码并参考图2A中,在步骤200,存储了调用方保存的寄存器,这包括,例如,使用例如存储多个指令(STMG)批量保存调用方保存的寄存器。在步骤202,可选地,(例如,使用加载指令LGFI)加载函数参数并且在步骤204(即,被调用方被调用)使用例如分支指令(BRASL)来执行函数调用。在步骤206,在从函数返回时,还原调用方保存的寄存器。在一个示例中,这是使用加载多个指令(LMG)的批量还原。(如本文所使用的,批量保存或批量存储包括一个或多个寄存器的存储,并且批量还原或批量重新加载包括一个或多个寄存器的加载。在一个示例中,批量保存(存储)和批量还原(重新加载)与保存/还原与函数调用相关的寄存器有关。作为一个特例,批量保存(存储)和批量还原(重新加载)与在程序堆栈上保存值和从程序堆栈到已存储所述值的相同寄存器还原所述值有关。
[0091] 在存储多个指令的一个示例中,以指令指定的通用寄存器R1开始并且以指令指定的通用寄存器R3结束的通用寄存器组的位位置的内容被放置在存储区域中,所述存储区域从由第二操作数地址指定的位置(例如,由B2指定的寄存器的内容加上D2的内容;B2和D2都由指令指定)开始并且根据需要继续通过多个位置。在一个例子中,通用寄存器的位位置32-63的内容存储在从第二操作数地址开始的连续四字节字段中。通用寄存器以其寄存器号的升序存储,从通用寄存器R1开始并一直到并包括通用寄存器R3,通用寄存器0在通用寄存器15之后。
[0092] 在加载多个指令的一个示例中,由指令指定的通用寄存器R1开始和由指令指定的通用寄存器R3结束的通用寄存器组的位位置从由第二操作数地址(例如,由B2指定的寄存器的内容加上D2的内容;B2和D2都由指令指定)指定的位置开始的存储器加载并且根据需要继续通过多个位置。在一个示例中,通用寄存器的位位置32-63从在第二操作数地址处开始的连续四字节字段加载并且位0-31保持不变。
[0093] 接下来,下面是保存一组寄存器并随后还原它们的被调用方的示例代码:
[0094] 示例1:
[0095]
[0096] 在上面的被调用方的代码并且参考图2B,在步骤220,存储一组被调用方保存的寄存器。这例如在序言(prolog)中发生,并且包括通过例如存储多个指令(例如,STMG)对被调用方保存的寄存器批量保存。然后,在步骤222,作为函数体的一部分执行处理,包括将返回地址加载回调用方。随后,在步骤224,还原被调用方保存的寄存器。在一个示例中,这发生在结语(epilog)中,并且包括通过例如加载多个指令(LMG)批量还原被调用方保存的寄存器。被保存/还原的寄存器可以是架构的或者是映射到物理寄存器的逻辑寄存器,如图3所示。参照图3,基于例如涉及架构寄存器300的指令,该架构寄存器与物理寄存器302相关联。具体地,寄存器重命名逻辑用于查找表(或其他数据结构)以确定什么物理寄存器对应于架构寄存器。例如,对于读访问,架构寄存器被替换为表中发现的物理寄存器;并且对于写访问,从空闲列表中分配新的物理寄存器。
[0097] 根据一个或多个方面,重命名逻辑可以包括处理器的一个或多个单元。例如,处理器解码单元接收指令;通过例如更新将一组架构寄存器与从空闲列表获得的物理寄存器相关联的查找表来重命名目标指令;更新寄存器重命名表以获取源指令;当指令或指令组可以触发回滚时(例如,由于该指令能够引发异常或者对于可能被错误预测的分支指令)获取回滚快照(例如,寄存器重命名表的副本);并且包括回滚逻辑,其适于恢复对应于需要回滚的事件的快照,例如,用于异常处理程序或新的分支目标,或者导致重新执行。
[0098] 此外,重命名逻辑可以包括执行单元,该执行单元包括:由解码单元接收的物理寄存器号访问的物理寄存器文件;执行指令并将结果写入指定物理寄存器的逻辑;和表示在例如分支错误预测或异常的情况下成功完成或回滚的逻辑。
[0099] 另外,使用指令完成单元,其接收指示指令已完成的报告;将快照标记为不再需要;将物理寄存器添加到空闲列表中;以及更新有序程序计数器或其他有序状态。
[0100] 虽然已经关于使用通用寄存器的示例描述了调用方保存和被调用方保存的寄存器的保存和还原,但是其他寄存器类型,例如浮点寄存器,向量寄存器,向量标量寄存器,条件寄存器,控制寄存器和/或专用寄存器,以及
[0101] 可以通过调用方函数,被调用方函数或两者来保存和还原其他类型的寄存器。可以使用其他、附加和/或更少的单元和/或逻辑。
[0102] 在调用方和被调用方中的一个或两个中保存和还原寄存器是昂贵的,因为它们涉及使用存储器。因此,根据本发明的一个方面,提供了降低该成本的能力。该能力包括,例如,使用寄存器快照来保存和还原寄存器,从而在至少一个方面避免使用存储器来还原(并且可选地,保存)寄存器。
[0103] 在一个示例中,当存储批量寄存器被识别时,快照从寄存器状态的至少一部分(例如,寄存器重命名映射的至少一部分,其他寄存器还原信息或完整寄存器状态)获取。参考图4A,在步骤400,获得批量保存的请求(例如,接收,确定,提供,检索,具有等)。批量存储可以是例如存储多个寄存器的存储多个指令。在步骤402,执行批量保存,并且将多个寄存器的内容写入存储器。基于此,在步骤404,创建快照。(在另一实施例中,不执行对存储器的存储。)
[0104] 如图5A所示的快照的示例。如图所示,创建将物理寄存器502a映射到架构寄存器504的快照500a。在该示例中,物理寄存器45被分配给架构寄存器0;物理寄存器88被分配给架构寄存器11;物理寄存器96被分配给架构寄存器12;物理寄存器67被分配给架构寄存器
13;物理寄存器38被分配给架构寄存器14;以及物理寄存器22被分配给架构寄存器15。快照
500a捕获这些物理寄存器到架构寄存器的映射。
[0105] 物理寄存器文件506为每个物理寄存器502指示存储在该寄存器内的值505。
[0106] 在一个实施例中,快照标识符508(例如,ID 4)被分配给快照500a。此外,在一个示例中,还可以存在多个较旧的快照510(例如,快照2和3)。
[0107] 如上所述,基于识别要执行的批量保存,创建参与批量保存的寄存器的快照(例如,快照500a)。然后,处理继续,并且如图5B所示,分配新的物理寄存器502b,并执行该功能。
[0108] 此后,当功能完成时,快照可以被恢复。参考图4B描述批量还原处理的一个示例。最初,在一个示例中,在步骤450,获得(例如,接收,确定,提供,具有,检索等)批量还原请求。批量还原请求可以是例如加载多个寄存器的加载多个(Load Multiple)指令。查询452,确定对应的快照是否可用。如果对应的快照不可用,则在步骤454从存储器重新加载值。但是,如果对应的快照可用,则查询456进一步确定批量还原是否与批量保存匹配。即,要被还原的寄存器是否是保存的相同的寄存器。如果是,则还原快照(步骤458)。另外,在一个示例中,在步骤460验证还原的快照。这在图5C-5D中以图形方式示出。
[0109] 如图5C所示,通过恢复520快照来还原物理寄存器的映射,从而产生还原的快照。还原的快照530映射到先前保存的相同的架构寄存器。因此,参见图5B-5C中,分配给r0的p123被替换为p45;分配给r11的p23代替为p88;分配给r12的p58替换为p96;分配给r13的p67替换为p67(或者不执行替换);分配给r14的p245替换为p38;分配给r15的p14替换为p22。
[0110] 在一个示例中,如图5D所示,仅恢复了寄存器的子集。例如,架构寄存器11-15被恢复,而架构寄存器0则没有。
[0111] 如上所述,在恢复快照(revovering snapshot)的一个实施例中,确定是否存在相应的快照。为了确定哪个快照对应于给定的保存/还原对,可以使用许多技术。一种技术包括记住最后创建的快照。例如,基于存储多个,创建快照,记住该快照的标识符,并将快照标记为可用。然后,如果执行另一个存储多个,则创建另一个快照,增加快照ID并记住该标识符等。此外,基于批量还原,恢复上一个批量保存的快照ID并标记该快照不可用。
[0112] 单个快照的跟踪提供了简化的设计,并且能够实现叶子函数的快速基于快照的寄存器还原(即,不调用另一个函数的那些函数)。叶子函数是所有函数的相当大的一部分(通常约50%),它们也在最短函数中,因此,保存和还原处理代表了这些函数的执行时间的很大一部分,这可以通过使用快照来减少。
[0113] 另一种技术是维护可以记住许多快照的快照堆栈。如图6所示,快照堆栈600包括一个或多个快照标识符(快照ID)602,其中每个快照标识符针对顶部最新创建的每个快照,如堆栈顶部(TOS)指针604所指示的。除了快照ID之外,在一个或多个实施例中,快照堆栈可以可选地包括附加信息。例如,对于许多情况寄存器的值被保存到存储器(步骤402),包括例如在快照丢失的情况下(步骤454),或者如果需要确认快照是否包含最新值(步骤460)。因此,附加信息可以包括快照寄存器的一个或多个值存储在存储器中的地址或地址范围
606。
[0114] 另外,在另一实施例中,快照可能对该快照中包含的所有寄存器无效,而是仅对寄存器的子集有效。因此,在一个示例中,快照堆栈可以包括针对每个快照的寄存器来源(register from)指示608和寄存器目的地(register to)指示610,用于提供对该快照有效的寄存器。
[0115] 此外,可以可选地提供有效指示符612以指示快照是否有效。在其他实施例中可以提供其他,附加和/或更少的信息。
[0116] 为了管理快照堆栈,调整堆栈顶部指针。例如,基于创建快照,将新条目添加到堆栈,并且堆栈顶部指针递增。此外,当还原快照时,从堆栈中移除对应于堆栈顶部指针的条目,并且递减堆栈顶部指针。例如,如果存在分支错误预测或异常,则可以移除多个条目并且适当地调整堆栈顶部指针。
[0117] 可以使用用于确定对应的存储多个/加载多对的其他技术。
[0118] 在一个方面,寄存器的保存和还原基于执行存储多个或加载多个指令(或类似指令)。然而,这些指令可以用于许多目的,因此,可以使用检查和/或启发法来确保保持正确的执行。也就是说,确定存储/加载对,然后可以使用本发明的保存和还原方面来优化存储/加载对。使用本发明的保存/还原方面不优化不匹配的存储/加载对。因此,为了便于处理和减少与例如找到匹配对以确保正确执行相关联的检查或启发法,定义了与加载多个/存储多个指令不同的新指令。例如,定义了在此称为溢出多个(Spillm)和重新加载多个(Reloadm)的新指令,使得它们不考虑在溢出和重新加载之间发生的对存储器的修改。也就是说,根据这些指令的一个架构定义,Spillm/Reloadm的用户不会修改与溢出和重新加载之间的那些寄存器相对应的内存中值。因此,如果修改了内存中图像,则新指令没有义务考虑该值。
[0119] 参考图7A描述溢出多个指令的一个示例。在一个示例中,溢出多个(Spillm)指令700包括至少一个操作码字段702,该操作码字段702包括:指示溢出多个操作的操作码(opcode);第一寄存器(R1)字段704;第二寄存器(R3)字段706;基本字段(B2)708;位移字段(D2)710(例如12位无符号二进制整数)。在另一个实施例中,位移字段可以包括多个字段(例如,DL2和DH2),并且可以是例如20位无符号二进制整数(其他大小也是可能的)。在一个示例中,每个字段彼此分开。但是,在其他示例中,可以组合一个或多个字段。此外,在一个示例中,与字段相关联的下标编号指定该字段所对应的操作数。例如,下标编号为1的字段对应于第一操作数;下标编号为2的字段对应于第二操作数;等等。
[0120] 在操作中,从通用寄存器R1开始并以通用寄存器R3结束的通用寄存器集合的位位置的内容被保留以供以后还原。从第二个操作数地址指定的位置开始(例如,由B2指定的寄存器的内容加上D2或DL2加上DH2的内容提供)并根据需要连续通过所需的多个位置的存储区域可以用作缓冲区存储一些或全部寄存器。将为相应的恢复地址指定相应的缓冲区存储地址。在一个示例中,通用寄存器的位位置32-63的内容被存储在从第二操作数地址开始的连续四字节字段中。通用寄存器会保留下来,以便以后还原。在Spillm的另一种格式中,将保留通用寄存器的位位置0-63的内容以供以后还原。可以使用对应于每个寄存器4个字节(或在另一个实施例中为8个字节)的缓冲区,并且该缓冲区是可访问的。缓冲区的内容是不确定的,并且可能在系统世代之间改变。在另一个实施例中,根据相应的存储多个指令的定义,缓冲区被定义并包含与存储区域的值相对应的值。
[0121] 此外,根据一方面,在操作中,采取由指令指示的一个或多个寄存器的快照以具有物理寄存器到指定的架构寄存器的映射。
[0122] 参考图7B描述重新加载多个指令的一个示例。在一个示例中,重载多(Reloadm)指令750包括:至少一个操作码字段752,包括指示重载多操作的操作码(opcode);第一寄存器(R1)字段754;第二寄存器(R3)字段756;基本字段(B2)758;以及位移字段(D2)760(例如12位无符号二进制整数)。在另一个实施例中,位移字段可以包括多个字段(例如,DL2和DH2),并且可以是例如20位无符号二进制整数(其他大小是可能的)。在一个示例中,每个字段彼此分开。但是,在其他示例中,可以组合一个或多个字段。此外,在一个示例中,与该字段相关联的下标编号指定该字段所对应的操作数。例如,下标编号为1的字段对应于第一操作数;下标编号为2的字段对应于第二操作数;等等。
[0123] 在操作中,根据本发明的一个方面,从通用寄存器R1开始并以通用寄存器R3结束的通用寄存器集合的位位置从最新快照还原,移除最新快照并使其前面可用的快照作为最新的快照,以供后续的重新加载多个指令使用。在一个示例中,从先前存储的值重新加载通用寄存器的位位置32-63,并且位0-31保持不变。在另一个实施例中,从先前存储的值还原通用寄存器的位位置0-63。通用寄存器按其寄存器编号的升序加载,从通用寄存器R1开始并且一直到包括通用寄存器R3,通用寄存器0跟随通用寄存器15。
[0124] 如果快照不可用,则从第二个操作数地址指定的位置开始的寄存器存储中加载寄存器(例如,由B2指定的寄存器的内容加上D2的内容(或DL2加上DH2)提供)。
[0125] 由于多种原因,该操作的结果可能不确定,包括:前面的溢出多个指令未指定要准备进行还原的相同寄存器范围。(在另一个实施例中,当先前的溢出多个指令未指定要准备还原的寄存器范围的超集时,结果是不确定的);重新加载多个指令没有指定相同的缓冲器(在一个实施例中,这将是相同的地址。在另一实施例中,当寄存器的子集被还原时,这将是调整后的地址);或已通过干预指令修改了缓冲区。
[0126] 在一个实施例中,使用Reloadm,不验证快照(如图4B所示),因为根据Reloadm的体系结构定义,用户不修改与那些寄存器相对应的存储数据。因此,如图8A所示,在还原快照之后没有验证快照。
[0127] 例如,如参考图8A所描述的,在步骤800,获得(例如,接收,确定,提供,具有,检索等)批量还原请求(例如,Reloadm指令)。在查询802,确定对应的快照是否可用。可以使用上述技术来进行该确定,例如记住最后的快照id,使用快照堆栈和/或其他技术。
[0128] 如果相应的快照不可用,则使用例如加载多个或类似指令,在步骤804,从存储器重新加载值。但是,如果对应的快照可用,则查询806进一步确定是否批量还原与批量保存(例如,由Spillm执行)匹配。即,要还原的寄存器是否与保存的寄存器相同。如果是,则在步骤808还原快照。例如,改变物理寄存器到架构寄存器的映射以反映最后的快照。由于在还原中使用了Reloadm,因此不会像使用加载多个时一样验证快照。
[0129] 此外,在一个示例中,由于在结构上保证了Reloadm指令与先前的Spillm指令相匹配,所以也可以抑制匹配验证,如图8B所示。更具体地说,程序员有责任匹配相应的Spillm和Reloadm对,如果程序员不能保证这样的匹配,则会受到不确定结果的惩罚。在该实施例中,在步骤820,获得(例如,接收,确定,提供,具有,检索等)批量还原请求(例如,Reloadm),并在查询822确定对应快照是否可用。如果对应的快照不可用,则在步骤824从存储器中重新加载值(例如,使用加载多个)。否则,在步骤826,还原快照(不执行与查询806相对应的查询)。
[0130] 在一个实施例中,根据常规存储多个/加载多个批量请求的支持批量保存/还原(例如,根据z/Architecture使用STMG和LMG指令,或者在示例性实施例中,在Power ISA中分别使用STM和LM–或STMW和LMW和STMD和LMD指令)可以与至少一个实施例中的新的Spillm/Reloadm设备组合在一起。根据这样的实施例,可以加速根据常规ISA(指令集体系结构)定义的代码,但是使用附加检查来确保遵守常规指令定义的体系结构遵从性,由于根据本发明的方面使用新的Spillm/Reloadm指令减少了对代码的检查而提供了更高的性能。
[0131] 根据本发明的另一方面,快照可以在相邻的寄存器还原点之间共享。作为示例,这些快照是从寄存器重命名映射,其他寄存器还原信息或完整寄存器状态的至少一部分中获取的。
[0132] 函数调用通常与两组匹配的寄存器溢出和寄存器重新加载对(例如,STMG和LMG或Spillm和Reloadm)相关联,其中之一与在调用位置保存调用方保存的寄存器相关,并且另一个与在被调用函数中保存被调用方保存的寄存器相关联。溢出(即多个架构的寄存器的保存)通常在接近动态的情况下执行,并且类似地,寄存器的还原或重新加载通常也动态地关闭。此外,寄存器是互斥的,并且第二溢出操作要保存的寄存器通常不通过第一溢出和第二溢出之间的代码来修改。下面的示例代码采用伪代码表示法:
[0133]
[0134]
[0135] 基于前述内容,根据本发明的一方面,可以在溢出操作的动态相邻实例(例如,Spillm指令)之间共享寄存器还原快照的至少一部分。在一个示例中,处理器可以创建还原快照,该还原快照包括用于还原调用方函数的r10-r15和被调用方函数的r16-r20两者的寄存器状态的单个快照。应当注意,已保存寄存器的范围不必相邻。
[0136] 为此,在一个实施例中,还原快照包括两个单独的记录:发生溢出的地址和要在还原中使用的寄存器快照。寄存器快照是共享的,但是为每个Spillm/Reloadm对保留单独的地址值:<地址,快照-ID>。
[0137] 根据本发明的一个方面,处理器结合自上次还原快照(restoration snapshot)以来尚未写入寄存器值的位图来维护对所创建的最后还原快照的引用(其包括可以由多个溢出操作引用的寄存器)。因此,当要创建新的还原快照时,如果自上次恢复快照以来未更改要被快照的寄存器范围,则当前的溢出操作可以重用先前的还原快照。否则,可以创建一个新的还原快照。
[0138] 下面提供了用于共享快照的指令解码和快照逻辑的一个示例:
[0139]
[0140]
[0141] 如图9所示,由于可能的快照4与快照3相同,所以在一个实施例中,不创建快照4并且重复使用快照3。这由快照4周围的虚线表示,并指示最后一次创建的快照(批量保存快照900)被设置为3。
[0142] 根据本发明的一个或多个方面,关于管理还原快照的更多细节参考图10A-10E进行了描述。在图10A-10E中,快照是指还原快照;即基于执行一个或多个批量保存(例如溢出和/或存储多个)创建的快照。首先,参考图10A描述共享还原快照的一个实施例。在该实施例中,步骤1000,将snapshot_regs设置为要包括在还原快照中的那些寄存器。例如,确定要包括的寄存器,诸如要包括在一个或多个溢出或存储多个指令中的那些寄存器,并且这些寄存器的指示在snapshot_regs中提供。
[0143] 在步骤1002中检查先前快照是否可用。这包括确定为当前快照指定的寄存器是否仅包括自从先前快照被创建以来来自先前快照的未修改的寄存器。
[0144] Unmodified_regs用于跟踪自上次快照以来尚未修改哪些寄存器。在一个示例中,prev_snapshot_usable被设置指示当前快照的快照寄存器与未修改的寄存器,即(snapshot_regs和unmodified_regs))的交集是否包含当前快照的所有寄存器,即是否与(即==)snapshot_regs相同。如果snapshot_regs中没有包含修改的寄存器,则可以使用先前的快照。如果前一个快照可用(查询1004),则在步骤1006将this_snapshot_ID设置为等于前一个快照标识符prev_snapshot_ID的标识符。
[0145] 然而,如果先前的快照不可用(查询1004),则在步骤1010,然后创建另一个快照,并且更新this_snapshot_ID(例如,递增1)。此外,在步骤1012,unmodified_regs被设置为包括所有寄存器,因为它是在没有修改任何寄存器的情况下被初始化的。此外,在步骤1014,将prev_snapshot_ID设置为等于this_snapshot_ID,以便记住该快照以供进一步使用。
[0146] 在另一实施例中,参考图10B,跟踪由指令修改的寄存器。在一个示例中,查询1020,确定指令是否改变了一个或多个寄存器的内容。如果通过指令修改了一个或多个寄存器,则在步骤1022中跟踪那些寄存器。例如,unmodified_regs是设置为排除那些被修改的一个或多个寄存器(例如,unmodified_regs:=unmodified_regs AND NOT regs_changed_by instruction)。在更新unmodified_regs之后,或者如果指令未更改任何寄存器(查询1020),则在步骤1024完成此处理。
[0147] 除了上述之外,在另一实施例中,如果指令流水线由于事件(例如,刷新,分支错误预测,异常等)而倒退到先前的点,则强制新快照。参照图10C描述与由于刷新/分支错误预测/异常而强制快照相关联的处理的一个示例。在此示例中,将prev_snapshot_id设置为NONE,指示不存在可以共享的先前快照(步骤1030),将unmodified_regs设置为no_regs(步骤1032)。即,没有迹象表明可用的先前快照,并且没有认为未修改的寄存器。
[0148] 此外,在一个示例中,如果指令由于事件(例如,刷新,分支错误预测,异常等)而倒退到先前的点,则可以执行回退到先前的快照,如参考图10D描述的。最初,确定是否应将处理回滚到快照(查询1040)。也就是说,是否发生了建议回滚的事件并且存在要回滚到的适当快照。如果要回滚到快照,则将prev_snapshot_ID设置为等于rollback_snapshot_ID,这是将处理回滚到的快照(步骤1042)。此外,将unmodified_regs设置到所有寄存器,因为此时,没有寄存器已被修改(步骤1044)。
[0149] 返回到查询1040,如果没有回滚到快照,则将prev_snapshot_ID设置为NONE(步骤1046),并且将未修改的寄存器设置为没有寄存器(步骤1048)。
[0150] 参照图10E描述与由于事件(例如刷新,分支错误预测,异常)而回滚到快照相关联的处理的另一示例。最初,确定处理是否要回滚到最后一个快照或超出最后一个快照,即查询1050。如果否,则该处理完成,并且可以使用最后一个快照(步骤1052)。在一个实施例中,在处理回滚指令时,未修改寄存器的集合可以包含真正未修改寄存器的子集,因为根据图10B的技术的回滚指令的处理可能已经从未修改的寄存器集中移除了寄存器。但是,这是对子集的保守定义,即,在最坏的情况下,可能会创建比需要数量更多的快照,从而保持正确性。同时,可以创建的快照集合少于根据图10C至图10D的快照集合,其中根据图10C的技术并且根据图10D的选择步骤1046和1048每个快照请求触发创建的快照。
[0151] 否则,确定是否要回滚到快照(查询1054)。如果要回滚到快照,则将prev_snapshot_ID设置为等于rollback_snapshot_ID,这是处理要回滚到的快照(步骤1056)。此外,将unmodified_regs设置到所有寄存器,因为在这一点上,尚未修改任何寄存器(步骤1058)。
[0152] 返回到查询1054,如果没有回滚到快照,则将prev_snapshot_ID设置为NONE(步骤1060),并且将未修改的寄存器设置为没有寄存器(步骤1062)。
[0153] 尽管以上提供了各种实施例,但是其他实施例也可以用于管理在特定情况下要使用哪个快照。
[0154] 在本发明的另一方面,除了使用共享快照进行还原之外,共享快照还可以用于恢复中。如本文所使用的,用于还原的快照是基于批量保存(例如,存储多个,溢出等)而创建的那些快照;并且用于恢复的快照是基于执行流的变化而创建的快照,例如分支或地址可能被错误预测的情况。
[0155] 考虑以下示例函数:
[0156]
[0157]
[0158] 在以上示例中,为分支条件(bcond)指令和跳转(jsr)指令创建恢复快照(recovery snapshot),为Spillm指令创建还原快照。在该示例中,可以共享恢复快照(例如,针对分支条件和跳转),类似于共享快照以进行还原(例如,多次溢出操作)。参照图10F进一步描述。
[0159] 参考图10F描述共享恢复快照的一个示例。在一个示例中,当要进行恢复快照时图10F的处理可以被执行,例如,以为分支错误预测恢复创建回滚点以实现精确异常,处理流水线清空或其他此类事件。最初,将要用作恢复快照的快照的寄存器集snapshot_regs设置为等于所有寄存器(all_regs()),例如,在发生精确异常,分支错误预测或其他此类事件(例如,在此示例中,与条件分支bcond和子例程调用jsr相关联的寄存器)的情况下,将保存用于恢复的所有寄存器(步骤1070)。检查先前的快照是否可用(步骤1072)。这包括自先前快照被创建以来确定用于当前快照的寄存器(在一个示例中,根据步骤1070对应于所有寄存器)是否仅包括未修改的寄存器。在一个示例中,指示符prev_snapshot_usable被设置为是否unmodified_regs==all_regs的指示。如果snapshot_regs中没有修改的寄存器,则可以使用先前的快照。如果先前的快照可用,即INQURIY 1074,则在步骤1076中,将this_snapshot_ID设置为等于prev_snapshot_ID(即,先前的快照可用于为当前快照请求提供快照)。否则,如果先前的快照不可用,则创建快照,并在步骤1078中更新this_snapshot_ID(例如,将其递增1)。此外,将unmodified_regs设置为等于所有寄存器(步骤1080),并将prev_snapshot_ID设置为等于this_snapshot_ID(步骤1082),使得当前快照可以重用于将来的快照请求,例如根据本发明的各方面的实施例的恢复请求和还原请求中的一个或多个。
[0160] 在一个实施例中,用于共享恢复快照而实现的图10F的处理可以结合用于共享还原快照而实现的图10A-10E中的一个或多个处理来操作。在一方面,快照可以被共享以用于恢复,用于还原或者用于恢复与还原的组合。作为示例,无论类型如何,图10F的技术均可用于共享快照。
[0161] 根据本发明各方面的实施例,虽然已经针对寄存器文件的单个快照描述了图10A-10F,本文所述的寄存器快照技术可以针对多种寄存器类型执行,包括但不限于通用寄存器,整数寄存器,地址寄存器,数据寄存器,定点寄存器,浮点寄存器,向量寄存器,向量标量寄存器,条件寄存器,谓词寄存器,控制寄存器,专用寄存器等。根据一个实施例,多寄存器类型可以在单个实现中支持,以便为例如通用寄存器和向量寄存器(或寄存器类型的其他组合)提供快照。此外,根据一个或多个实施例,多种寄存器类型可以共享快照机制。在一个示例实施例中,例如根据z/Architectur提供共享矢量和浮点寄存实现中可以共享浮点寄存器和矢量寄存器的快照。在另一个示例实施例中,例如根据Power ISA提供共享的矢量-标量、矢量和浮点寄存器实现中可以共享用于浮点,矢量寄存器和矢量-标量寄存器的快照。其他示例也是可能的。
[0162] 在本发明的另一方面,跟踪存储器的变化,以便在需要时确定恢复的寄存器是否正确(即,用于恢复寄存器的快照是否具有最新信息)。例如,在使用存储多个和加载多个指令(或其他此类指令)的一个实施例中,当寄存器从寄存器还原快照而不是从存储器被还原时,捕获在加载和存储之间发生的对存储器的改变,以便根据由存储多请求先前存储的并由加载多条指令重新加载的值能够确定(如果需要)恢复的寄存器中的正确性。(使用Spillm/Reloadm在此提供了一个好处,其中针对存储器中缓冲区寄存器还原快照的正确性与该处理无关紧要,因为根据体系结构定义,存储器更改不必由程序员做出并且表示导致未定义行为的编程错误。因此,如果在Spillm和Reloadm之间对这些指令所使用的存储缓冲区存储器进行存储器更改,则根据体系结构定义,这种更改被视为编程错误,程序员负责处理此类错误,而不是与Spillm/Reloadm指令相关的处理。)
[0163] 包括保存和还原操作的代码的一个示例如下所示:
[0164]
[0165] 该还原在进入函数并保存被调用方保存的寄存器被保存处恢复被调用方保存寄存器的值。但是,STM和LM之间的指令可能会更改存储器,这会在还原时影响被调用方保存的寄存器。在以下示例中进行了展示:
[0166]
[0167]
[0168] 基于从快照接收到加载多个(Load Multiple)而不是从存储器中加载寄存器来还原寄存器将还原在与STM指令中的值相对应的快照点处的寄存器中的原始值,而不是存储到对应于寄存器r16的存储器中寄存器还原缓冲区位置的修改后的值99。因此,提供了一个或多个方面来确定存储器是否已经改变而损害了快照的完整性。
[0169] 根据本发明的各方面,提供了各种实施例来解决保存和还原操作之间的可能的存储器改变,包括例如:(1)必要时进行还原,检查和恢复;(2)使用Spillm/Reloadm,其中根据定义,在保存和还原之间不修改存储器;(3)无需明确检查即可跟踪任何更改。这些方面的每一个将在下面进一步描述。
[0170] 如上所述,解决根据本发明的一个方面的其中存储器中的寄存器值在存储和加载之间改变的的情形的一个实施例是使用还原,检查和恢复技术。根据该方面,基于接收寄存器还原请求来还原寄存器快照。此外,基于请求和从快照还原寄存器,通过从对应于寄存器保存/还原对的存储缓冲区中加载相应的寄存器值,并比较从寄存器快照中还原的值和从存储缓冲区加载的值,来检查从寄存器快照还原的每个寄存器。如果检测到不匹配,则从存储缓冲区中恢复还原的寄存器。否则,将使用从快照还原的寄存器。有利地,可以使用还原的值执行计算并行地执行寄存器的检查,从而即使检查尚未完成,也使应用程序能够进行计算。
[0171] 如本文所述,在一个示例中,如果检查失败,则使用存储器值恢复所有寄存器。参照图11A进一步描述。
[0172] 最初,在步骤1100中获得(例如,接收,提供,确定,检索,具有等)还原操作。例如,接收加载多个指令。确定还原操作是否与先前的保存操作匹配(例如,加载多个的寄存器是否与与加载多个配对的存储多个的寄存器匹配;地址是否相同;是寄存器的子集还是地址相同)(查询1102)。如果要还原的寄存器与已保存的寄存器相对应,则获取最后的快照并将其用于还原寄存器(步骤1104)。
[0173] 执行后续检查以确定还原值的正确性。提供用于后续检查的序列化,以确保在还原快照之后检查开始(步骤1106),以及指示是否将其中要从存储器中恢复值的不匹配的指示符(称为不匹配)初始化为FALSE(步骤1108)。使用例如内部操作(IOP)从存储器中加载与选定寄存器对应的存储值(步骤1110)。将该加载值与被检查的选定寄存器的还原值进行比较(步骤1112)。如果比较失败,即加载的值与还原的值不匹配,则将不匹配设置为TRUE。处理器检查不匹配指示符,如果它指示比较失败(查询1114),则刷新流水线,并在还原操作之后执行重新启动(步骤1116)。此外,从存储器重新加载被还原的寄存器的值(步骤1118)。
[0174] 在一个示例中,执行刷新以使得当检测到不匹配时,可能使用从存储器中获得的值来重新执行可能使用从还原的快照中的值推测执行的所有指令。在至少一个实施例中,刷新可以是更具选择性的,例如根据所还原的寄存器仅引起指令的刷新和重新执行。
[0175] 返回到查询1114,但是,如果不匹配表示比较成功,则确定是否还有更多还原的寄存器要被检查(查询1120)。如果还有更多还原的寄存器要被检查,则进行处理继续到步骤1110。否则,处理完成。
[0176] 返回到查询1102,如果还原请求与存储请求不匹配,则从存储器重新加载寄存器的值(步骤1118)。
[0177] 在一个实施例中,通过将还原操作扩展为与图11A的一个或多个步骤相对应的一个或多个多个内部操作(iops)来实现图11A的一个或多个步骤,可以相对于其他指令和/或与其他指令相对应的内部操作无序执行的图11A的一个或多个步骤。在本发明的另一方面,可以相对于彼此无序地执行对应于本指令生成的iops。根据该实现,乱序执行逻辑提供适当的互锁,以确保仅在快照已还原后才执行后续操作,并且进一步使基于还原的值已被执行的任何推测性执行的指令无效,在检测到不匹配时刷新并重新执行。
[0178] 在另一个实施例中,图11A的步骤被实现为用于寄存器恢复和验证的专用电路的步骤。在至少一个实施例中,对应于图11A的逻辑与使用还原的值执行后续指令并行地执行,同时实现本文技术的电路继续验证还原的寄存器。此外,提供了合适的互锁,以确保仅在已还原快照后才执行后续操作,并且在检测到不匹配时,基于还原的值已执行的任何推测执行的指令也将无效,刷新并重新执行。
[0179] 参照图11B描述还原,检查和恢复技术的另一实施例。在该实施例中,有可能从快照还原一个或多个寄存器,但是从存储器还原一个或多个其他寄存器参照图11B,在步骤1130中获得(例如,接收,提供,检索,确定,具有等)还原操作,例如,加载多个。确定还原操作是否与先前的保存操作相匹配(例如,加载多个的寄存器是否与加载多个配对的存储多个的寄存器匹配;地址是否相同;是寄存器的子集还是地址相同;等等)(查询1132)。如果要还原的寄存器对应于已存储的寄存器,则获取最后的快照并将其用于还原寄存器(步骤
1136)。
[0180] 此后,执行后续检查以确定还原的值的正确性。提供用于后续检查的序列化,以确保在快照已还原后开始检查(步骤1138),并将first_mismatch设置为NONE(步骤1140)。使用例如微操作从存储器中加载与所选寄存器对应的存储值(步骤1142)。将该加载值与要检查的所选寄存器的还原的值进行比较(步骤1144)。如果比较失败,即,加载值与还原的值不匹配,则将first_mismatch设置为比较失败的寄存器。如果first_mismatch不再等于NONE,则处理器确定存在不匹配(查询1146),并且刷新流水线,并在还原操作之后执行重新启动(步骤1150)。此外,比较失败的寄存器中的值和后续寄存器中的值从存储器中重新加载(步骤1152)。
[0181] 在一个示例中,执行刷新以使得当检测到不匹配时,可能使用从存储器中获得的值来重新执行可能使用从还原的快照中的值推测执行的所有指令。在至少一个实施例中,刷新可以是更具选择性的,根据还原的寄存器或者根据从存储器中恢复的并从first_mismatch寄存器开始的还原的寄存器引起例如仅刷新和重新执行指令。
[0182] 返回到查询1146,但是,如果比较成功,则确定是否还有更多要检查的还原寄存器,即查询1148。如果还有更多要检查的还原寄存器,则处理继续转到步骤1142。否则,处理完成。
[0183] 返回到查询1132,如果还原请求与存储请求不匹配,则从存储器重新加载寄存器的值(步骤1134)。
[0184] 在一个实施例中,通过将还原操作扩展为对应于图11B的一个或多个步骤的一个或多个多个内部操作(iops)来实现图11B的一个或多个步骤,其中图11B的一个或多个步骤可以相对于其他指令和/或与其他指令相对应的内部操作乱序地执行。在本发明的另一方面,对应于本指令相生成的iops可以相对于彼此乱序地执行。根据该实现,乱序执行逻辑提供适当的互锁,以确保仅在还原快照后才执行后续操作,并且进一步在检测到不匹配时基于还原的值已被执行的任何推测性执行指令被无效、刷新并重新执行。
[0185] 在另一个实施例中,图11B的步骤被实现为用于寄存器还原和验证的专用电路的步骤。在至少一个实施例中,对应于图11B的逻辑与使用恢复的值执行后续指令并行地执行,同时实现本文技术的电路继续验证还原的寄存器。此外,提供了合适的互锁,以确保仅在已还原快照后才执行后续操作,并且在检测到不匹配时,基于还原的值已被执行的任何推测性执行的指令被无效,刷新并重新执行。
[0186] 参照图11C描述了还原、检查和恢复的另一实施例。在该示例中,单个寄存器被跟踪并且可以使用快照来还原,而其他寄存器可以从存储器中还原。
[0187] 参考图11C,首先,在步骤1160中获得(例如,接收,提供,确定,检索,具有等)还原操作(例如,加载多个)。确定还原操作是否与先前的保存操作(例如,加载多个的寄存器是否与加载多个配对的存储多个的寄存器匹配;地址是否相同;是寄存器的子集还是地址相同;等等)相匹配(查询1162)。如果要还原的寄存器与已保存的寄存器相对应,那么获取最后的快照并将其用于还原寄存器(步骤1166)。此后,执行后续检查以确定还原的值的正确性。提供用于后续检查的序列化(serialization),以确保在还原快照后开始检查(步骤1168),并且将不匹配集设置为空集(步骤1170)。
[0188] 使用例如微操作从存储器中加载对应于选定寄存器的存储值(步骤1172)。将该加载值与被检查的选定寄存器的还原的值进行比较(步骤1174)。如果比较失败,即加载的值与还原的值不匹配(查询1176),则将比较不匹配的寄存器添加到不匹配集合(步骤1178)。
[0189] 此后,或者如果比较成功(查询1176),然后确定是否还有更多要检查的还原寄存器,即查询1180。如果还有更多要检查的还原寄存器,则处理继续进行到步骤1172。否则,确定不匹配集合是否为空(查询1182)。如果不匹配集合为空,则处理完成。否则,将不匹配集中的寄存器重新加载存储器中的值(步骤1184)。
[0190] 在一个示例中,根据步骤1184的重新加载可以导致在还原指令之后或者根据还原的值之一而重新执行一些或所有指令。在一个实施例中,这是通过引起全部或部分刷新来实现的,以使得当检测到不匹配时,可能使用从存储器中获得的值来重新执行可能使用从还原的快照中的值已推测执行的所有指令。在至少一个实施例中,刷新是选择性的,例如,仅引起指令的刷新和重新执行,这取决于指令的还原寄存器,或者取决于从存储器中恢复的还原寄存器,如在不匹配集中的寄存器所表示的那样。
[0191] 返回到查询1162,如果还原请求与存储请求不匹配,则从存储器重新加载寄存器的值(步骤1164)。
[0192] 在一个实施例中,通过将还原操作扩展为对应于图11C的一个或多个步骤的一个或多个多个内部操作(iops)来实现图11C的一个或多个步骤,其中图11C的一个或多个步骤可以相对于其他指令和/或与其他指令相对应的内部操作乱序地执行。在本发明的另一方面,可以相对于彼此无序地执行对应于本指令生成的iops。根据该实现,乱序执行逻辑提供适当的互锁,以确保仅在还原快照后才执行后续操作,并且进一步在检测到不匹配时基于还原的值已被执行的任何推测执行的指令被无效、刷新并重新执行。
[0193] 在另一个实施例中,将图11C的步骤实现为用于寄存器还原和验证的专用电路的步骤。在至少一个实施例中,对应于图11C的逻辑与使用还原的值执行后续指令并行地执行,同时实现本文技术的电路继续验证还原的寄存器。此外,提供了合适的互锁,以确保仅在还原快照后才执行后续操作,并且在检测到不匹配时,基于还原的值执行的任何推测执行的指令也将被无效,刷新并重新执行。
[0194] 尽管上面描述了各种技术,但是可以在不脱离本发明的各方面的精神的情况下对那些技术进行变型。
[0195] 根据另一方面,因为使用Spillm和Reloadm指令(或类似指令)执行了保存和还原,所述指令在体系结构上被定义为不允许在Spillm和Reloadm之间对存储在存储器中的寄存器值进行存储器改变,所以没有执行在存储器改变的检查。在这种方法中,指令定义指示如果修改存储器,则还原的寄存器值未定义。根据指令的定义,用户不得修改相应的存储区域。如果用户确实修改了该区域,则将其视为编程错误并且不能保证正确性。
[0196] 上面描述了Spillm和Reloadm指令的示例定义。但是,本文提供了进一步的细节。在一个实施例中,Spillm将寄存器值保存到存储器中,使得它们可以用作例如快照无效的情况下的后备。快照无效可能发生,例如,如果处理器用尽了物理寄存器,处理器用尽了快照存储空间,存在上下文切换等。
[0197] 在一个实施例中,当使用Spillm和Reloadm时,在体系结构上定义为图4B的验证快照不需要。因此,如图8A所示,没有执行快照验证。类似地,根据另一方面,由于可以在架构上定义Reloadm将与Spillm匹配,因此可以在不使用匹配查询(例如,查询806)的情况下执行批量还原。参考图8B上面描述了这样的一个示例,其中没有执行匹配查询。
[0198] 尽管Spillm/Reloadm的体系结构定义允许跳过匹配查询,但是可能会有Spillm和Reloadm变得不匹配的情况。例如,根据setjump和longjump函数的C/C++和POSIX定义和/或响应于结构化异常处理(例如,根据以C++和Java表示的异常处理为例),基于程序中的setjump/longjump函数,所述对可能变得不匹配。异常处理和产生的Spillm/Reloadm指令不匹配的示例如下所示:
[0199]
[0200] 基于本文的示例,当在被调用方函数callee()中引发异常时,被调用方函数的序言的Reloadm指令可能不会执行,从而导致调用方中的后续Reloadm与最新的被调用方的Spillm不匹配。
[0201] 类似地,Setjump/Longjump可能发生不匹配,如下所示:
[0202]
[0203] 由于某些编程可能导致Spillm/Reloadm指令不匹配,因此,一方面,提供了确保特定Reloadm与特定Spillm匹配的能力。该功能包括在必要时使用于恢复的快照无效和/或确保使用被调用方的Spillm快照不满足调用方的Reloadm。为了使快照无效,根据本发明的方面,可以使用多种技术,包括对例如单个寄存器简单地移除快照来执行Reloadm。使用例如无效快照Invsnap指令来分解Spillm快照;否则,请从快照堆栈中删除快照或忽略快照。
[0204] 在一个示例中,通过扫描函数的代码来确定被跳过的Reloadm指令的数量,然后使该数量的快照无效。在一个实施例中,可以结合常规展开处理例如以在存在结构化异常处理的情况下还原寄存器来执行针对无效快照和快照无效的代码分析。下列代码以伪代码表示法示出:
[0205]
[0206] 参考图12,并参考伪代码表示法进行描述,处理器扫描寻找Spillm/Reloadm对的函数代码(步骤1200)。计数跳过Reloadm指令的数量(步骤1202),并且使相应的快照数量无效(步骤1204)。
[0207] 尽管提供了管理失配对的一个示例,但是可以使用其他技术。
[0208] 根据本发明的另一方面,在变化发生时对其进行跟踪,而不是如参考图11A-11C所描述的执行恢复和检查。在这方面,每次处理器更新存储器时,进行检查以确定更新是否影响快照的有效性。如果是这样,则从存储器而不是快照寄存器中获取请求的值。
[0209] 在一个示例中,受存储多个约束的高速缓存行被标记为处于写集(write-set)中。当诊断出来自另一个处理器的干扰时,则表明已对要进行寄存器还原的存储缓冲区进行存储。在一实施例中,干扰被用于使飞行中的转发机会无效。在另一个实施例中,写集的高速缓存行可以与对应的标识符相关联,以指示哪个存储/负载对将从寄存器还原中排除。在至少一个实施例中,直到所有中间存储存储器操作(或其他同步操作)完成才清除写设置指示。在另一个实施例中,直到相应的加载完成才清除缓冲器的写集。在至少一个弱存储器排序实施例中,当加载完成时立即清除写集保留。
[0210] 在一个实施例中,例如在强存储器排序中,这可能会延迟完成第一保存/恢复序列的能力,两个寄存器还原序列对于相同的存储位置可能正在进行中。例如,调用一个函数,为被调用方保存的寄存器执行存储多个,使用加载多个重新加载被调用方保存的寄存器,函数返回,立即再次调用该函数,并在相同的地址发生另一个存储多个和加载多个。
[0211] 在一个示例中,保持第二对直到第一对完成。在一个实施例中,写集高速缓存行可以与多对关联。在另一个实施例中,当多个高速缓存行被关联时,单个位被用于强制清除所有存储/加载寄存器还原对。存在各种示例。
[0212] 另外,在另一方面,要考虑来自本地访问的对存储的寄存器存储器中(in-memory)缓冲区的干扰。可以通过获取与快照关联的内存缓冲区的基地址和范围(长度或结尾地址),然后将后续存储操作的地址与该内存缓冲区的范围进行比较以检测干扰来实现此目的。在一个实施例中,针对诸如存储多个批量保存的指令执行该干扰测试,而使用与高速缓存行或高速缓存子行相关联的指示符来跟踪对各个存储的干扰。在一个实施例中,最新存储/加载对的单个快照和相关联的内存中缓冲区范围被维持。在其他实施例中,支持附加快照和关联的内存中缓冲区范围,以允许维护更多对。
[0213] 在一个实施例中,由于将针对每个活跃寄存器还原快照针对缓冲去地址范围来检查本地和远程访问以检测缓冲区修改,因此在处理请求时可能会导致排队延迟的风险下通过执行并发检查逻辑或通过强制对干扰进行串行检查地址检查会导致大量的面积,功率和/或延迟成本。为了减少这些成本,可以结合本发明的各方面的实施例使用各种方法。在一个实施例中,当包含L1高速缓存时,仅将命中第一级数据高速缓存中的远程访问与跟踪的存储器范围进行比较。在另一个实施例中,例如通过使用标记位,通过跟踪特定高速缓存行中的缓冲区的存在来提供附加过滤。在又一个实施例中,可以使用标记位来指示活跃缓冲区,并且可以响应于对多个访问类型的响应而对高速缓存行和子高速缓存行的写入而无需与对应于快照的跟踪地址范围进行比较,缓冲器可以被停用(deactive),从而使快照无效而不会引起比较所有快照对应的跟踪范围的开销。在又一个实施例中,可以通过缓存目录或单独的表来标识与缓存行相对应的快照,从而进一步减少了要执行的比较的数量。
[0214] 在又一个或多个其他实施例中,可以使用存储器地址过滤器来过滤存储器地址,以减少要比较的存储器访问的数量。各种地址过滤器(例如,地址范围过滤器,布隆过滤器等)可以与本发明的一个或多个方面结合用于地址过滤。通过使用地址过滤,可以跟踪更多的地址范围,而不会在面积,功耗和用于存储器检查的延迟方面花费相应的成本。因此,例如,可以使用各种过滤器和摘要来跟踪例如对应于调用层次结构的更深级别的多个范围的更多快照,以给出保守的答案。在一个实施例中,这是通过跟踪第一个缓冲区到最后一个缓冲区的地址来实现的。该范围可以例如对应于保持用于在函数调用中进行寄存器保存和还原的存储器缓冲区的许多堆栈帧,同时过滤出与堆,静态变量,文件缓冲区等相对应的存储器请求。在另一个实施例中,过滤器可以捕获附加信息以区分缓冲区访问和局部变量访问,并且过滤局部变量访问以进一步减少与对应于存储器中寄存器溢出缓冲区的跟踪存储缓冲区范围进行比较的访问次数。在至少一个实施例中,可以结合无效挂起的寄存器还原快照或者当没有寄存器还原快照处于活跃状态时,周期性地重置一个或多个过滤器。在另一实施例中,根据一个或多个已知的探听滤波器架构采用范围滤波器。
[0215] 在一个实施例中,用于检测用于存储/加载指令的缓冲存储器的修改的事务写集的干扰确定被用作过滤器,然后将有问题的远程访问与核心中使用的确切缓冲器边界进行比较以进行检查来自线程本身存储的干扰。
[0216] 在一个特定示例中,如图13A所示,数据高速缓存1300包括多个高速缓存线1302,并且标记每个高速缓存行1302(或在另一实施例中,高速缓存线的选定部分)。例如,在那些标记高速缓存行部分的实施例中,每个高速缓存行或高速缓存行的一部分具有地址标签(TAG)1304,该地址标签指示高速缓存行或高速缓存行部分所对应的存储器地址。有效性(V)指示符1306,其指示高速缓存行或部分是否有效;脏(D)指示符1308,指示是否将来自高速缓存行或部分的数据写回到存储器;以及标记(M)指示符1310,根据本发明的一个方面,用于指示快照对于高速缓存行或高速缓存行部分是否有效。此外,高速缓存行或高速缓存行部分包括数据1312。
[0217] 设置或重置包括有效指示符1306、脏指示符1308和标记指示符1310在内的各种指示符,如参考图13B-13D所描述的示例技术所描述的。
[0218] 例如,参考图13B描述了在高速缓存重新加载期间更新指示符的一个示例。。最初,获得(例如,接收、提供、检索、拥有、确定等)请求以将数据从存储器中提取到数据高速缓存中(步骤1320)。基于该请求,从存储器中获取数据并将其存储到高速缓存行中(步骤1322)。针对从存储器获得的数据计算地址标签,并将其存储在相应的地址标签字段1304中(步骤
1324)。另外,由于高速缓存行现在是有效的,因此将有效指示符1306设置为1;因为数据刚刚被加载,因此不脏,脏指示符1308被设置为零;由于没有存储具有对应快照的寄存器,因此标记指示符1310被设置为零(步骤1326)。
[0219] 除了在高速缓存重新加载期间更新指示符之外,还在存储在高速缓存期间来更新指示符,如参考图13C所述。最初,在步骤1330中获得(例如,接收,提供,检索,拥有,确定等)数据和地址。确定存储是否对应于高速缓存中的现有高速缓存行,即查询1332。如果不是,则执行图13B的高速缓存重新加载过程(步骤1334)。但是,如果存储确实对应于高速缓存行,则在步骤1336中存储数据,并且在步骤1338中将相应的脏指示符设置为1。此外,如果这是批量保存,例如将多个调用方保存的或被调用方保存的寄存器溢出到堆栈帧的STMG指令(查询1340),然后在步骤1342,将标记指示符设置为1。否则,它为零。
[0220] 此外,可以基于从另一处理器接收到更新请求来更新一个或多个指示符,如参考图13D所描述的。最初,在步骤1350中获得(例如,接收,提供,检索,具有,确定等)数据和存储器地址。确定存储是否对应于高速缓存内的现有高速缓存行(查询1352)。如果不是,则执行图13B的高速缓存重新加载过程(步骤1354)。但是,如果存储确实对应于高速缓存行,则在步骤1356中存储数据,并且在步骤1358中将标记指示符设置为零。由于来自远程处理器的写访问可能已经修改了存储器中的寄存器缓冲区,从而使寄存器快照相对于存储器内缓冲区已过时。
[0221] 在另一个实施例中,当在存储到高速缓存期间检测到指示高速缓存行或高速缓存行的一部分中存在缓冲器的标记时,可以将请求范围与快照的跟踪地址进行比较以确定特定访问是否干扰快照。在至少一个实施例中,当更新对应于存储器缓冲区的高速缓存行的不对应于存储器缓冲区的一部分时,这减少了快照无效的次数。在又一个实施例中,可以使用高速缓存目录或与其相关联的逻辑来识别多个活跃快照中与高速缓存行相对应的特定快照,以减少要执行的干扰检查的次数。在又一个实施例中,使用标记位作为过滤器以减少干扰检查的次数被用于过滤来自本地处理器的更新。还存在其他可能性。
[0222] 以上缓存技术中的一种或多种与寄存器还原结合工作。参照图14A描述寄存器还原技术的一个示例。最初,在步骤1400中获得(例如,接收,确定,检索,提供,具有等)加载多个(LM)指令(或类似指令)。确定加载多个指令是否对应于还原请求(查询1402)。这可以通过例如检查快照堆栈的附加字段(例如地址字段)以确定是否正在还原先前存储的寄存器。如果加载多个指令不对应于还原请求,则执行加载多次操作(步骤1404)。如果加载多个指令确实对应于还原请求,则恢复一个或多个寄存器映射(步骤1406)。例如,一个或多个快照用于恢复指定的寄存器。之后,或并行地,从与由加载多个指示的寄存器相对应的高速缓存行(或高速缓存行部分)获得标记指示符(M)(步骤1408),并确定是否将高速缓存行标记为未修改(查询1410)。如果标记为未修改,则进一步确定是否还有更多的高速缓存行或高速缓存子行要处理(查询1412)。如果是,则处理继续到步骤1408。否则,寄存器还原处理完成。
[0223] 返回到查询1410,如果标记指示符被标记为已修改(例如,M设置为0),则执行恢复步骤(例如,从高速缓存重新加载),即步骤1414。即,从内存中加载值并替换快照的值。
[0224] 参照图14B描述寄存器还原的另一示例。在此示例中,对要用于还原的快照的有效性进行检查。例如,一个存储多个可能已覆盖另一个存储多个。发生这种情况时,第一个存储多个不再是用于寄存器还原的存储多个/加载多个的有效还原候选对象。为了确定这一点,响应于存储多个请求,可以遍历快照堆栈以确定当前快照是否与先前的快照重叠。在其他实施例中,针对其他存储器更新操作执行该检查,或者当一个或多个过滤器准则指示要执行检查时针对其他存储器更新操作执行该检查。如果找到匹配项,则先前快照的堆栈中的条目无效。因此,在一个实施例中,对于堆栈上的每个条目,如果快照上的堆栈地址与当前存储请求重叠,则将该快照堆栈条目的有效指示符设置为无效。然后在还原过程中检查该指示符。参照图14B描述该处理的一个示例。
[0225] 首先,在步骤1420中获得(例如,接收,检索,确定,提供,具有等)加载多个指令(或类似指令)。确定加载多个指令是否对应于还原请求(查询1422)。这可以通过例如检查快照堆栈的附加字段(例如地址字段)以确定是否正在还原先前存储的寄存器。如果加载多个指令不对应于还原请求,则通过从存储器加载要由加载多个指令加载的多个寄存器来执行加载多次操作(步骤1424)。如果加载多次指令确实对应于还原请求,然后确定要使用的一个或多个还原快照是否有效(即,确认存储器内缓冲区未被覆盖),即查询1426。如果一个或多个有效指示符指示一个或多个还原快照有效,然后恢复一个或多个寄存器映射(步骤1428)。例如,一个或多个快照用于恢复指定的寄存器。之后,或并行地,从对应于加载多次的寄存器的高速缓存行(或高速缓存行部分)获得标记指示符(M)(步骤1430),并确定是否将该高速缓存行标记为未修改(查询1432)。如果标记为未修改,则进一步确定是否还有更多的高速缓存行或高速缓存部分要处理(查询1434)。如果是,则处理继续到步骤1430。否则,寄存器恢还原处理完成。
[0226] 返回到查询1432,如果标记指示符被标记为已修改(例如,M设置为0),则执行恢复步骤(例如,从高速缓存重新加载),即步骤1436。也就是说,从存储器中加载值并替换快照的值。
[0227] 根据另一方面,用于跟踪对存储器的修改的另一机制包括使用事务存储硬件来跟踪对存储器的改变。事务存储器具有跟踪干扰,跟踪对与事务状态相对应的一系列存储位置的访问的能力,并且该能力可以用于跟踪与保存的寄存器的存储器中映像相对应的缓冲区是否正在被修改。事务存储工具可以跟踪存储器中的更改是否影响特定快照中包含的寄存器。
[0228] 在一方面,提供了一种功能,该功能用于使用共享寄存器还原功能来保存用于事务存储器回滚恢复和功能调用寄存器保存的寄存器。该工具由批量保存指示事件初始化,例如接收批量保存指示指令。在一个实施例中,TBegin(开始事物性执行指令)是第一指示指令,而存储多个或溢出多个指令是第二指示指令。
[0229] 如果在一个实施例中接收到存储多个,则立即执行存储,但是还执行增量寄存器检查点。在一个示例中,对于溢出多个,仅可以执行核内检查点。
[0230] 基于接收到指示事件,测试当前请求是否与预先存在的请求兼容。当确定兼容性时,处理进行。否则,如果初始请求对应于事务存储器回滚请求,则直接执行批量保存,并且内核内寄存器保留专门用于事务存储器。如果第一个请求是寄存器保存请求,则终止函数调用批量还原的内核寄存器保存,并启动事务内存保存。
[0231] 当发生还原事件时,还原已保存的跟踪寄存器的子集。在一个实施例中,仅保存修改后的寄存器。在另一个实施例中,保存所有被跟踪的寄存器被。
[0232] 根据一个实施例,寄存器还原被实现为修改的事务执行寄存器回滚操作。例如,当识别了批量存储时,将对要溢出到事务存储器(TM)寄存器还原状态的寄存器进行快照。此外,在一个示例中,当识别到批量还原时,在事务中止期间以其他还原方式还原寄存器快照。
[0233] 在一个示例中,当不支持多个寄存器快照时,在识别新的批量存储时,将丢弃先前的TM寄存器快照,并且可以使用TM寄存器还原来接收最新的批量存储。在另一个实施例中,例如,在支持嵌套事务的实施例中,多个溢出快照被存储在与多个嵌套事务相对应的寄存器还原快照中。
[0234] 当遇到事务,并且用于另一寄存器恢复状态的存储器可用时(例如,当支持嵌套事务时),使用下一个寄存器恢复级别。否则,对应于批量存储的先前寄存器快照(例如,最新快照或最近快照)将无效,以代替保存TM寄存器还原状态。在另一个实施例中,嵌套事务可以被平整为外部事务,以避免取消分配批量存储快照。
[0235] 在一个实施例中,当启用TM工具时,禁用将TM寄存器恢复机制用于溢出寄存器还原。其他变化也是可能的。
[0236] 在一个实施例中,当发起事件是TBegin时,事务回滚,事务失败,事务干扰,事务中止或其他终止操作并使该操作无效的操作触发还原事件。此外,当发起事件是存储多个、溢出多个请求或类似请求时,加载多个或重新加载多个被视为还原事件。
[0237] 当批量保存已被TBegin启动,状态修改的跟踪结束,并且当事务失败(事务回滚,事务失败,事务干扰,事务中止,或其他操作终止并使该操作无效)或成功时(Tend-transaction结束发生)状态保存操作终止。当通过存储多个、溢出多个或类似请求启动了寄存器批量保存时,将执行寄存器批量重新加载。
[0238] 在至少一种情况下,寄存器的保存以增量方式发生,并且可以还原增量保存的寄存器。
[0239] 参考图15A-15E描述与事务存储器和寄存器还原有关的更多细节。
[0240] 首先参考图15A,描述与基于TBegin指令启动快照相关的处理。在一个实施例中,在步骤1500中获得(例如,接收,提供,确定,检索,具有等)TBegin指令。TBegin指令发起事务,并且在一个示例中,如图15B所示,例如包括:操作码(opcode)字段1510,其包括指定事物开始操作的opcode;基本字段(B1)1512;位移字段(D1)1514;和立即数字段(I2)1516。
[0241] 当B1字段为非零时,将由B1 1512指定的通用寄存器的内容添加到D1 1514以获得第一操作数地址。
[0242] 在一个示例中,当B1字段为非零时,以下内容适用:
[0243] *当事务嵌套深度最初为零(事务可以被嵌套)时,第一个操作数地址指定256字节事务诊断块的位置,称为TBEGI-specified TDB,如果事务中止,则可在其中存储各种诊断信息。
[0244] 在一个示例中,I2字段1516的比特定义如下:
[0245] 通用寄存器保存掩码(GRSM):I2字段的位0-7包含通用寄存器保存掩码(GRSM)。GRSM的每个位代表通用寄存器的奇偶对,其中位0代表寄存器0和1,位1代表寄存器2和3,依此类推。当最外部的TBegin指令的GRSM中的位为零时,不会保存相应的寄存器对。当最外部的TBegin指令的GRSM中的位为1时,对应的寄存器对将保存在程序无法直接访问的与模型相关的位置。
[0246] 如果事务中止,则当执行最外部的TBegin指令时,已保存的寄存器对将还原为其内容。当事务中止时,不会还原所有其他(未保存的)常规寄存器的内容。
[0247] 除了最外部的TBegin所有TBegins上的通用寄存器保存掩码被忽略。
[0248] 允许AR修改(A):A控件(I2字段的位12)控制是否允许事务修改访问寄存器。
[0249] 允许浮点操作(F):F控件(I2字段的位13)控制是否允许事务执行指定的浮点指令。
[0250] 程序中断过滤控制(PIFC):I2字段的位14-15是程序中断过滤控制(PIFC)。PIFC控制在CPU处于事务执行模式时发生的某些类别的程序异常情况(例如,寻址异常,数据异常,操作异常,保护异常等)是否导致中断。
[0251] I2字段可以包括比这里描述的更多,更少或不同的控件。
[0252] 返回图15A,基于获得TBegin指令,确定是否正在活跃使用(active use)寄存器还原工具(register restoration facility)(例如,寄存器还原快照工具)(查询1502)。这可以基于例如工具指示设置为特定值(例如1)或者通过检查是否正在使用此类快照等来确定。如果该工具正在活跃使用中,则停用寄存器还原,并禁用存储器中寄存器还原缓冲区跟踪(步骤1504)。在此示例中,因为TBegin具有优先权。此后,或者如果寄存器还原工具未活跃使用,则创建事务回滚快照(步骤1506)。例如,创建由TBegin指令(例如,由GRSM指定)指示的要保存的寄存器的快照。此外,在步骤1508,开始跟踪事务状态干扰。例如,跟踪事务状态缓冲区和TBegins。
[0253] 在另一方面,如参考图15C所述,可以基于寄存器保存请求来创建快照。在步骤1520中获得(例如,接收,提供,具有,检索,确定等)寄存器保存指示(例如,存储多个)。确定寄存器还原工具是否用于事务执行(例如,通过检查指示器)(查询1522)。如果将其用于事务执行,则将寄存器状态存储在存储器中(步骤1530)。但是,如果寄存器还原工具不用于事务执行,则进一步确定是否将寄存器还原工具用于(例如,不同寄存器的寄存器)不兼容请求的寄存器还原(查询1524)。如果它用于不兼容请求,则处理继续到步骤1530,在此寄存器状态被存储在存储器中。
[0254] 然而,如果未将寄存器还原工具用于事务执行或不兼容请求的寄存器还原,则创建寄存器还原快照(例如,由存储多个指定的寄存器的快照)(步骤1526),以及使用例如适于识别对存储器中的事务的事务状态的干扰的事务工具的逻辑来开始跟踪存储器中的寄存器还原缓冲区的干扰(步骤1528)。此外,在步骤1530中将寄存器状态存储在存储器中。
[0255] 根据本发明的一方面,根据用于跟踪存储器缓冲区的改变的事务状态干扰跟踪逻辑的使用,干扰检查逻辑跟踪步骤1530的存储器中寄存器缓冲区的干扰。因此,当接收到对包含已保存的寄存器副本的存储器中缓冲区的远程访问时,就会注册干扰。根据本发明的一个方面,当注册了干扰时,当使用干扰跟踪逻辑来确定寄存器保存缓冲器的修改时,不会发生回滚。根据本发明的这个方面,当检测到干扰时,在寄存器正在被还原时不使用处理器内寄存器快照,而是从存储器中寄存器保存缓冲区取回寄存器。根据至少一个实施例,通过处理器本地存储器写指令例如,根据本发明的一个方面,通过比较对一个或多个存储器缓冲器的地址范围的写入执行另外的跟踪以来跟踪存储器中寄存器保存缓冲器的修改。
[0256] 另外,在一方面,如参考图15D所述,基于事务回滚来恢复快照。在步骤1540中获得(例如,接收,具有,提供,检索,确定等)回滚请求(例如,响应于对事务的事务状态的干扰或事务中止(TAbort)指令的执行)。状态回滚到事务的开始点(步骤1542)。根据事务的回滚,寄存器状态还原到事务开始时的状态(即,根据图15A执行TBegin来创建事务的回滚快照)。执行事务回滚包括,例如,根据事务存储器的已知实现,还原程序计数器并取消中止的事务的存储器内的影响。在步骤1544中,事务回滚被指示为不活跃,在步骤1546中,事务存储器干扰跟踪被停用。
[0257] 此外,在一方面,如参考图15E所述的,基于寄存器还原请求来恢复快照。在步骤1550中获得(例如,接收,提供,具有等)寄存器还原还原请求(例如,加载多个),并确定核内寄存器还原工具是否处于活跃使用中(查询定1552)。如果未处于活跃使用中,则从存储器状态执行恢复(步骤1554)。但是,如果核内寄存器还原是活跃的,则进一步确定是否存在或已经干扰了存储器中寄存器还原缓冲区(查询1556)。如果有干扰,则取消寄存器还原存储器中的跟踪(步骤1558),并且处理继续到步骤1554。
[0258] 如果没有对存储器中寄存器还原缓冲器的干扰,则在步骤1560中从内核内状态(例如,快照)恢复所指示的寄存器。在一个示例中,程序计数器和存储器中影响回滚被排除在外。在步骤1562,停用寄存器还原存储器中的跟踪。如上所述,事务存储工具可用于跟踪变化。一方面,通过镜像用于事务执行的动作而重用事务状态来实现寄存器还原的目标。但是,事务回滚处理和寄存器还原是由不同的指令触发的;它们是互斥的,因为当一个活跃用于还原时,另一个则不是。例如,如事物回滚处理,(例如,基于LM)的寄存器还原不会恢复程序计数器或撤消内存中的更改。
[0259] 在一个或多个其他方面,结合快照堆栈来执行对存储器变化的跟踪。如上所述,快照堆栈提供缓冲区列表,因为每个条目都包括其缓冲区的地址或地址范围。因此,每次进行写操作时,都会将写操作的地址或地址范围与堆栈中缓冲区的地址或地址范围进行比较。根据至少一个实施例,用于跟踪存储器保存改变的快照堆栈对应于根据图6的快照堆栈并与之共享,根据图6的快照堆栈用于存储对应的根据本发明的方面的寄存器还原操作的由寄存器保存操作创建的快照ID。参考图16A-16D描述用于跟踪存储器变化的各种技术的示例。
[0260] 参考图16A描述的第一技术涉及创建新快照。例如,在一个实施例中,在步骤1600由处理器获得(例如,接收,提供,具有,检索,确定等)存储多个(STM)指令(或类似指令),并且确定快照堆栈中是否存在可用条目(查询1602)。如果没有可用条目,则在步骤1604中执行快照堆栈溢出。例如,指示错误。如果存在可用条目,则在步骤1606中更新栈顶指针(例如,将其递增1)。
[0261] 此外,在步骤1608中创建快照,并且在步骤1610中将快照标识符存储在条目中。此外,由存储多个指定的寄存器的内容被存储在存储器中(步骤1612),以及在步骤1614中将其内容被存储的存储器地址范围包括在条目(例如,地址)中。此外,在步骤1616,在条目中设置有效指示符(例如,为1),并且在步骤1618还更新其他字段(如果有的话)。
[0262] 除上述之外,参考图16B描述用于在执行单独的存储请求时跟踪变化的技术。在该实施例中,对于该处理器的每个存储,执行堆栈检查以确定是否存在任何重叠。最初,由该处理器获得(例如,接收,提供,确定,检索等)具有存储地址的存储器写请求,步骤1620。然后,对于快照堆栈中的每个条目(步骤1622),确定该条目的地址范围是否与存储地址相匹配(查询1624)。如果是,则在步骤1626中重置当前条目的有效位(例如,重置为零)。之后,或者如果该条目的地址范围与存储地址不匹配,检查快照堆栈中是否有更多条目要处理(查询1628)。如果有更多条目,则处理继续到步骤1622。否则,处理结束。
[0263] 类似地,参考图16C,对从其他处理器接收的写请求执行检查。最初,处理器从另一个请求排他访问或数据更新的处理器获取(例如,接收,提供,检索,确定,具有等)具有存储地址的远程存储器写请求(步骤1640)。然后,对于快照堆栈中的每个条目(步骤1642)中,确定该条目的地址范围是否与存储请求的地址匹配(查询1644)。如果是,则将当前条目的有效位重置(例如,重置为零)(步骤1646)。此后,或者如果该条目的地址范围与存储请求的地址不匹配,则检查快照堆栈中是否有更多条目要处理(查询1648)。如果有更多条目,然后处理继续到步骤1642。否则,处理结束。
[0264] 虽然参照检查快照堆栈中的所有条目的地址来描述图16B和16C中的技术,在优化的实施例中,可以减少要比较的写入次数和快照堆栈上的条目的数目,以减少执行用于快照无效的测试成本。例如,将各种过滤技术(例如探听过滤器)与快照堆栈条目进行比较。一些示例过滤器可以是范围过滤器,其通过与数据高速缓存相关联的标记位例如结合根据图13A的高速缓存等来过滤。在另一个优化的实施例中,可以例如通过基于接收到的地址确定要测试哪些条目来识别堆栈条目的子集。在一个这样的实施例中,快照条目可以具有与包含相应存储器缓冲器的高速缓存行相关联的条目指示符。
[0265] 在另一个实施例中,参考图16D描述了基于批量还原的接收来执行寄存器还原的技术。最初,由处理器获得(例如,接收,提供,检索,具有,确定等)加载多个(LM)指令或类似指令(步骤1660)。获得请求的处理器确定加载多个操作是否对应于还原请求(查询1662)。如果它不与还原请求相对应,则执行加载多个操作(步骤1664)。但是,如果加载多个操作与还原请求相对应,则确定是否相应的还原快照有效(查询1666)。如果有效,则使用快照恢复一个或多个寄存器映射(步骤1668)。如果无效,则使用另一种技术执行恢复,例如从高速缓存或系统存储器中的存储缓冲区加载值(步骤1670)。尽管本文提供了用于跟踪存储器变化的各种实施例和技术,但是在不背离本发明的方面的精神的情况下可以提供其他变型、实施例和/或技术。
[0266] 根据本发明的另一方面,提供一种管理快照的一部分丢失的能力。从核内值的寄存器还原代表了一种从核内数据存储中恢复值的技术。在一个示例中,这些数据存储与用于实现其他处理器机制(例如,分支错误预测恢复和精确异常)的微体系结构共享。核内数据存储的示例是恢复文件和寄存器重命名映射(例如快照)。然而,在一个实施例中,并非所有值都可以被还原。例如,某些寄存器可能不再可用于恢复,因为它们已被重新分配以容纳新的架构值。在一个实施例中,例如通过分配时间跟踪或跟踪活跃度来跟踪已被覆盖的值。
[0267] 在一个示例中,对于最后一次分配(或在另一实施例中,写时间)时间跟踪,每个物理寄存器与最近一次分配(写入)以保持体系结构值的时间相关联。然后,如果分配的时间(标记)晚于创建的还原点的时间(tag),则该值不可用。
[0268] 在另一个实施例中,创建所有(或其子集)值的位图,或者更新寄存器重命名映射。每次寄存器不可用时,都会将其从位图或寄存器重命名映射中删除,以便在恢复期间知道不可恢复的寄存器。在一个实施例中,位图或寄存器重命名映射对应于寄存器还原快照。
[0269] 根据本发明的一方面,提供了一种用于寄存器还原的混合技术。根据存活性(liveness)/可用性跟踪机制,当可以确定核内值可用时,可以从核内值还原寄存器。其余值从存储器中加载。
[0270] 参考本发明的一方面,参照图17描述了处理还原请求的一个实施例。最初,在步骤1700中获得(例如,接收,提供,检索,确定,具有等)还原请求(例如,加载多个指令),并基于此,处理器确定对应于要被还原的寄存器快照是否有效(查询1702)。如果快照无效,则从存储器中还原值(步骤1704)。但是,如果快照有效,则对于要还原的每个寄存器(步骤1706),例如通过时间跟踪、位图等确定是否可以从快照还原特定的寄存器(查询1708)。如果可以从快照中还原该寄存器,则通过例如中更新重命名映射从快照中还原该寄存器(步骤
1710)。但是,如果无法从快照中还原寄存器,则例如通过将新的重命名寄存器分配给相应的架构寄存器并从存储器中加载其值来从存储器中还原寄存器(步骤1712)。
[0271] 在一个实施例中,确定是否有更多的寄存器要还原(查询1714)。如果有一个或更多个寄存器要还原,则处理继续到步骤1706。
[0272] 如上所述,在还原寄存器的这一方面,如果存在核内值,则检索核内值,并且如果核内值不存在,则从存储器中加载该值。
[0273] 寄存器重命名还原基于显式或推断的还原点指示符(例如,Spillm指令,存储多个指令,使用诸如帧指针或堆栈指针之类的定义良好的基本寄存器之一的加载多个指令)捕获处理器状态,以供以后还原。此外,根据明确的或推断的还原请求(例如,Reloadm指令,加载多个指令,使用诸如帧指针或堆栈指针之类的定义良好的基本寄存器之一的加载多个指令)执行寄存器还原。
[0274] 然而,在上下文切换之后,一个应用程序使用的还原点可能被另一应用程序错误地使用。特别地,这可能甚至在快照位置的标识标识特定的二进制文件时发生,例如甚至使用二进制文件的详细指纹,因为同一二进制文件或库的多个实例可能正在执行,或者指纹可能匹配,并且来自一个上下文中的函数的还原点可以用于在与指纹匹配的相同二进制文件或库的另一过程的函数中执行还原。因此,根据本发明的一方面,显式和/或推断的上下文切换(例如,从一个应用程序或函数切换到另一应用程序或函数等)认知包括在处理器内。在一个实施例中,基于对可能的上下文切换的检测,还原点的全部或子集无效。
[0275] 在一个示例中,提供了一种无效指令,该无效指令用于使例如作为上下文切换例程的一部分的一个或多个恢复点无效。在一个实施例中,该指令由操作系统的上下文切换代码执行。在另一实施例中,基于指示切换到另一应用程序模块(例如,内核)的许可级别改变,并且因此可能将来切换到另一应用程序,使至少一个恢复点无效。在另一个实施例中,当这样的系统调用可能很短时(例如,POSIX getpid系统调用),这不会发生,从而允许在存在进行系统调用的函数的情况下使用寄存器还原点。
[0276] 在又一实施例中,指示过程(例如,LPID(逻辑分区ID)和PID(过程ID)中的一个或两者)的寄存器中的值的改变被用于识别任务切换。在另一个实施例中,寄存器快照可以与指示特定过程的标记值相关联,并且与快照ID相关联的标记和请求寄存器恢复的当前过程的标记之间的标记匹配将在使用寄存器还原快照还原寄存器之前被确认。在实施例中可以使用各种标记,例如在一个示例实施例中的LPID和PID。
[0277] 此外,在一个实施例中,无效指令还可以用于程序中的非传统控制流,例如用于setjump/longjump处理或C++/Java结构化异常处理。还存在其他示例。
[0278] 下面参考图18A-18C描述关于用于识别上下文切换并使一个或多个快照(或其一部分)无效的示例技术的更多细节。
[0279] 在图18A的示例中,使用了无效还原快照指令。例如,该指令是一种架构指令,其具有指示其为无效还原快照指令的操作代码,以及用于指示或确定要被无效的一个或多个快照的一个或多个字段。由于这是一条新指令,因此在一个示例中,操作系统被修改为可以识别和使用该指令。
[0280] 参照图18A,处理器获得(例如,接收,提供,检索,确定,具有等)无效还原快照指令(步骤1800)。如本文所述,可以基于确定上下文切换来发起该指令。基于获得该指令,处理器基于由要无效的一个或多个快照的指令的指示,清除快照堆栈上的至少一个条目(步骤1802)。另外,在一个示例中,清除与在无效的一个或多个快照中指示的地址相对应的高速缓存条目中的一个或多个标记位(例如,设置为零)(步骤1804)。
[0281] 在图18B中,不是使用需要更新操作系统的架构指令,而是使用试探法来确定是否存在上下文切换,因此,要使一个或多个快照无效。参考图18B,首先确定处理器是否检测到处理器状态的变化,该变化指示上下文切换(查询1820)。例如,程序状态字(PSW)是否已改变,或者指向地址转换表的指针是否更改,两者都可能指示上下文切换。如果通过这些机制中的一种或另一种机制指示了上下文切换,则处理器清除要被无效一个或多个快照的快照堆栈上的至少一个条目(步骤1822)。另外,在一个示例中,清除与在无效的一个或多个快照中指示的地址相对应的高速缓存条目中的一个或多个标记位(例如,设置为零)(步骤1824)。否则,如果未指示上下文切换,则该处理结束。
[0282] 在又一实施例中,可以由处理器动态地选择无效指令或启发式的使用。参考图18C,处理器动态地选择无效还原快照指令或启发式技术,以确定是否存在上下文切换(步骤1830)。例如,如果操作系统处于无法识别该指令的版本级别,则选择启发式方法。但是,如果操作系统确实识别了该指令,则它可以等待指令的发出或使用试探法来确定快照是否无效。如果通过接收指令或启发式地确定要执行无效(查询1832),则处理器清除要无效的快照堆栈上的至少一个条目(步骤1834)。另外,在一个示例中,清除与在无效的一个或多个快照中指示的地址相对应的高速缓存条目中的一个或多个标记位(例如,设置为零)(步骤
1836)。否则,如果未指示上下文切换,则该处理结束。
[0283] 在一方面,对于函数调用批量状态保存,寄存器保存以增量方式发生,并且寄存器在接收到例如寄存器溢出多个指令后不会立即保存到存储器中。相应地,当内核保存由于例如切换到事务存储器保存而终止时,寄存器被保存。这可以例如使用转变的状态机来实现。
[0284] 在另一方面,例如,当对存储多个执行增量状态保存时,通过例如将其标记为写入集的一部分来监视存储多个的存储范围,即使该存储范围还没有被写入。
[0285] 在一个或多个方面,可以接收多个批量保存请求,因此,将确定给定请求是否与正在执行的处理兼容。例如,如果不存在预先存在的批量保存请求,则接收到的新请求是兼容的。如果存在预先存在的批量保存请求并且收到批量保存请求,则进一步确定:如果寄存器是互斥的,则可以认为它们是兼容的。如果它们引用一个或多个寄存器,并且进行了中间修改,则可以认为它们是兼容的。如果硬件支持多个批量保存/还原,则可以认为它们是兼容的。
[0286] 如果存在预先存在的事务存储器回滚请求,并且接收到事务存储器回滚请求,则进一步确定:如果嵌套事务被实现为扁平化事务,则它们是兼容的。如果嵌套事务是真正的嵌套事务,并且有上下文(例如快照或状态的其他保存)可用,则它们是兼容的。如果没有更多的存储空间可以保存其他状态,则可以选择拼合嵌套事务以实现兼容性。
[0287] 如果存在预先存在的事务存储器回滚请求,并且接收到寄存器保存请求,则执行进一步的测试:如果支持多个批量请求,并且存储器可用于其他状态,则可以认为它们是兼容的。如果事务存储器回滚集和存储多个集之间共享的寄存器没有发生中间修改,则它们是兼容的。
[0288] 如果存在预先存在的批量保存请求,并且接收到事务存储器回滚请求,则执行进一步的测试:如果支持多个批量保存,并且存储器可用于其他状态,则可以认为它们是兼容的。如果事务存储器回滚集和存储多个集之间共享的寄存器没有发生中间修改,则它们是兼容的。
[0289] 参考图19A描述与基于接收TBegin指令来管理一个或多个快照相关联的处理的一个示例。在步骤1900,获得(例如,接收,提供,具有,检索,确定)TBegin指令。确定是否正在活跃使用寄存器还原工具(查询1902)。如果未活跃使用寄存器还原工具,则创建事务回滚快照(例如,创建指示由TBegin指令保存的寄存器的快照)(步骤1912),并开始跟踪事务状态干扰(例如,跟踪存储器中写入是否对应于快照的寄存器之一)(步骤1914)。
[0290] 返回到查询1902,如果正在活跃使用寄存器还原工具,则确定是否存在与事务请求兼容的快照(例如,寄存器是否相同)(查询1904)。如果快照与请求兼容,则将寄存器还原快照用于事务执行(步骤1906)。但是,如果快照与请求不兼容,则进一步检查是否可以制作更多快照(例如,在快照堆栈中是否有空间)(查询1908)。如果可以制作更多快照,则处理继续到步骤1912。否则,在步骤1910停用寄存器还原快照,并且可选地,如果例如先前没有被存储,则将该快照存储在存储器中。在另一个实施例中,有用于恢复快照和还原快照的单独的堆栈。
[0291] 参照图19B描述与管理一个或多个快照相关联的处理的另一示例。在该示例中,在步骤1920中获得(例如,接收,提供,确定,检索,具有等)寄存器保存指示请求(例如,存储多个)。确定寄存器还原工具是否用于不兼容请求(查询1922)。如果工具正在用于此类请求,则进一步确定存储器是否存储可用于其他快照(在此称为快照上下文)(查询1924)。如果不是,将寄存器状态存储在存储器中(步骤1932)。但是,如果有更多可用的快照上下文或者寄存器还原工具不用于不兼容的请求,则将创建寄存器还原快照(步骤1926)。进一步,在步骤1928,开始存储器内寄存器还原缓冲区的干扰跟踪。可选地,在步骤1932,将寄存器状态存储在存储器中。
[0292] 在另一方面,提供一种合并多个加载和存储指令以确定要还原的寄存器范围的能力。例如,处理器适于识别可以分别合并为单个还原和保存操作的一系列单独的加载和存储操作。可以使用多种技术来执行合并。
[0293] 根据本发明的方面的一个或多个实施例,加载和存储的合并序列被用于使得能够结合遗留代码序列来使用本文所述的寄存器还原技术,而无需批量保存和还原指令,例如用于z/Architecture通用寄存器的STMG和LMG,或用于Power ISA定点寄存器为STMW和LMW。特别地,这包括z/Architecture和Power ISA中的某些寄存器类型的批量保存,例如,z/Architecture和Power ISA中的浮点寄存器以及Power ISA中的向量寄存器(不存在存储多个和加载多个浮点指令)。此外,某些架构不提供针对任何寄存器类型的存储多个指令和加载多个指令
[0294] 在一个实施例中,每个存储请求可以开始存储可以被识别的多个合并序列。在另一个实施例中,仅某些存储请求触发可以被识别的合并序列。例如,这是为了避免与操作附加逻辑相关的电源和其他开销。在一个或多个实施例中,仅通过使用某个寄存器(例如,帧点,堆栈指针或其他可区分的寄存器)作为基址寄存器的存储请求来开始合并序列。在另一个实施例中,具有相邻地址(基于指令映射,即,相同基数和与数据大小相对应的位移差)的至少第一和第二指令开始一个序列。其他示例也是可能的。
[0295] 在一个实施例中,当发生合并序列的第一存储时,寄存器文件的状态(例如,寄存器文件映射等)是快照。在一个示例中,初始化位掩码,以反映可以从快照恢复哪些寄存器。随后的寄存器写程序在位掩码中指示特定的寄存器不再对应于快照中的值。因此,当后续存储引用此类寄存器时,可以独立于合并顺序单独执行此操作,也可以启动新的合并顺序,或两者兼而有之。类似地,一个实施例可以要求存储在与连续存储相对应的偏移量(例如,如果第一存储发生在寄存器r1的位移d1处,则寄存器r2使用相同的基数将以位移d2=d1+(字长)*(r2-r1)存储。在其他实施例中,可以对指令序列施加严格的顺序,例如,如果先前的指令存储的寄存器R(N),则每个存储将存储寄存器R(N+1),使得单个计数器能够跟踪该实施例。其他变化是可能的。在一实施例中,试探法用于限制可能触发快照创建的存储。
[0296] 在另一实施例中,结合组形成来执行根据本发明的一个方面的将单个存储和加载合并为存储和加载的组,然后可以触发状态快照和寄存器还原。根据一个方面,指令被分组以保持相邻的存储而不干预存储范围内的寄存器的修改。作为一个示例,控制逻辑确保存储以连续的方式发生,例如,对于与公共(未修改)基数相关联的位移d1和d2,以d2=d1+(字长)*(r2-r1)(在一个示例中,没有索引,或相同的未修改索引)。
[0297] 在一个实施例中,以与存储相似的方式合并加载。在另一实施例中,加载被单独执行,其中对于每个加载,分别从寄存器快照中检索对应的重命名寄存器,因为在至少一个实施例中,寄存器还原的开销主要与存储和维护用于检索存储值用于核内还原的机制相关联。
[0298] 识别是在预解码、组形成和解码阶段之一中执行的。在具有跟踪高速缓存,循环高速缓存或其他这样的高速缓存的其他实施例中,可以可操作地耦合到适于创建和/或优化循环,跟踪或ipo(内部操作)高速缓存的逻辑。
[0299] 在一方面,一种用于从核内值池还原寄存器的技术包括:识别相邻寄存器的相邻单独存储指令的序列;创建和维护用于还原的单个快照;以及使用单个快照来绕过来自单个快照的寄存器。
[0300] 参照图20A描述了合并单独的寄存器存储请求以创建快照的一个实施例。在步骤2000中获得(例如,接收,具有,提供,检索,确定等)单个存储请求。确定这是否是存储序列的可能开始(例如,多个存储/寄存器溢出顺序)(查询2002)。这可能包括检查寄存器的子集,寻址模式,寻址范围或寄存器溢出序列的另一种指示。如果确定不是存储序列的可能开始,则执行一个或多个存储(步骤2004)。但是,如果是存储序列的可能开始,则跟踪具有当前存储请求的预期寄存器还原快照请求(步骤2006)。
[0301] 确定下一条指令是否是存储请求的延续,即查询2008。如果下一条指令是存储请求的延续,则将下一条指令添加到存储请求中(步骤2010)。检查是否还有更多指令要处理(查询2012)。如果是,则处理继续到查询2008。
[0302] 如果下一条指令不是存储请求的继续,即查询2008,则确定是否需要寄存器还原快照,即查询2014。也就是说,预期的快照是否具有足够的寄存器来创建快照?如果需要快照,则执行寄存器还原快照技术以创建快照(步骤2016)。然而,如果不需要快照,则执行一个或多个存储(步骤2018)。根据至少一个实施例,需要保存一定最小数量的快照的寄存器,以便分摊创建和管理快照的成本。因此,在至少一个实施例中,当预期快照具有多于设置的寄存器阈值时,被认为是期望的。在另一个实施例中,基于可能的运行时间改进来估计快照的合意性。在至少一个实施例中,当预期快照提供了超过设置的运行时间改善阈值时,被认为是期望的。还存在其他可能性。
[0303] 参考图20B描述合并单独的寄存器还原请求的一个实施例。在步骤2040,获得(例如,接收,具有,获取,检索,确定,提供等)单个加载请求。确定这是否是寄存器还原序列的可能的开始(查询2042)。这可以包括:检查寄存器的子集,寻址模式,寻址范围或寄存器重新加载的其他指示。在至少一个实施例中,查询2042包括测试加载请求是否对应于关于要还原的寄存器和指定的存储器中存储位置的最新寄存器快照。如果确定这不是还原序列的可能的开始,则执行一个或多个加载(步骤2044)。但是,如果是还原序列的可能的开始,则跟踪具有当前加载请求的预期寄存器还原请求(步骤2046)。
[0304] 确定下一条指令是否是还原请求的延续,即查询2048。如果下一条指令是还原请求的延续,则将下一条指令添加到还原请求中(步骤2050)。检查是否还有更多指令要处理(查询2052)。如果是,则处理继续到查询2048。
[0305] 如果下一条指令不是还原请求的继续,即查询2048,则确定还原请求是否与寄存器还原快照相匹配,即查询2054。如果是,则在步骤2056执行寄存器还原快照的还原技术。否则,在步骤2058,执行一个或多个加载。
[0306] 在一个或多个方面,当遇到Spillm指令时,将生成核内寄存器还原快照。此外,在核内寄存器还原快照无效的情况下,溢出寄存器将存储到一个临时位置(通常是当前函数的堆栈帧)。溢出寄存器的内容放在存储队列中并写入存储器。
[0307] 如果寄存器快照有效,则通过例如Reloadm指令从核内寄存器还原快照中还原寄存器。否则,Reloadm会从存储器(例如,当前函数的堆栈帧中的临时存储区)中重新加载值。
[0308] 一方面,当Reloadm指令完成时,基于Spillm指令存储的值仍可在存储队列中排队,以写入高速缓存,并最后写入系统内存。Reloadm完成后,将不再对缓冲区进行任何读取。因此,这些值会耗尽存储队列中的宝贵空间,并导致存储队列中后续存储的时间延迟以及能耗,同时处理已知无用的存储。因此,在一个示例中,当Reloadm指令完成时,对应于Spillm/Reloadm保存/还原序列的存储队列条目无效。例如,将它们从存储队列中删除,或者当它们到达将要提交到存储器层次结构的存储队列的开头时,不会将它们写入。还存在其他示例。
[0309] 在又一个实施例中,当接收到远程交叉无效(corss-invalid)(XI)时,不提供用Spillm识别的存储队列条目。此外,在另一实施例中,当接收到远程XI时,不提供已完成Reloadm的用Spillm识别的存储队列条目。
[0310] 存储队列的管理的各方面由存储队列写回逻辑控制,该逻辑根据本发明的一个或多个方面被增强。如图21A所示,在一个示例中,存储请求(SRQ)写回逻辑2100位于存储队列2102中,该存储队列2102还包括用于每个存储队列条目的地址信息2104和数据2106。存储队列2102从中央处理单元(CPU)2112的加载/存储单元(LSU)2110接收存储请求2108。
CPU2112还包括例如取指令的取指令单元(IFU)2114,使用指令解码单元2116该指令被解码。解码的指令可以经由一个或多个执行单元2118执行。
[0311] 如所指示,加载/存储单元将存储请求2108放置在存储队列2102上。存储请求写回逻辑2100执行对存储器子系统2122的写回,该存储器子系统2122可以包括一个或多个高速缓存2124和存储器2126。参考本发明的一个方面并参考图21B所示,写回逻辑包括以下内容:
[0312]
[0313] 虽然上文和图21B中所示的逻辑参考向下生长的处理器堆栈来描述,即,其中小于堆栈指针的值的地址不是堆栈的一部分(查询2156),本领域技术人员将理解,本文的教导可以适于其中处理器堆栈向上增长的体系结构,即其中大于堆栈指针的地址不是堆栈的一部分,例如,通过用在上面的示例写回逻辑伪代码并且在图21B中的查询2156中的“更大”的测试代替“更小”的测试。
[0314] 在另一个实施例中,参考图21C,回写逻辑包括:
[0315]
[0316]
[0317] 在一个实施例中,结合Spillm/Reloadm指令来执行图21B-21C的处理,因为那些指令指示该缓冲区对于特定时间点(例如,在存储和加载之间)的写操作是程序员不可访问的。在另一实施例中,一个或多个指令或其他机制用于指示在加载多状态恢复之后或在另一个选定的时间点之后将不再访问存储缓冲区。
[0318] 在其他实施例中,存储在堆栈指针下方的堆栈区域中的数据(即,地址空间中分配用于保持堆栈的那些页面)被视为不再使用,并且在从存储队列回写期间被抑制和/或响应XI交叉询问请求。在这样的实施例中,不允许将数据分配在堆栈指针之下的优化。在另一实施例中,支持在堆栈指针下方分配数据的优化(例如,在由ABI诸如Power ELFv2 ABI或Linux的AMD Red Zone规范定义的区域中),在以下情况下禁止写回数据:数据被写入已定义区域之外,在该区域中可以在堆栈指针之外分配和访问数据,例如,根据例如Power ElFv2,对于低于堆栈指针以下512字节以上的地址,可以禁止从存储队列写回。
[0319] 在本发明的另一方面,可以使用寄存器还原快照的替代方案。此替代方法是恢复缓冲区,也称为恢复文件。在发生错误预测或异常的情况下,可以从恢复缓冲区而不是快照中恢复寄存器值。每次覆盖寄存器时,如果需要恢复旧值,则将旧值存储在恢复文件队列中。这种恢复文件的一个例子在图22A中示出。在一个示例中,恢复文件2200被实现为队列,并且包括与执行的指令2202相对应的一个或多个寄存器恢复值。作为示例,恢复缓冲区2200包括具有要恢复的寄存器号Rn,Rk,Rm等的多个寄存器2204,以及要恢复的寄存器值
2206。指令标签2208被分配给每个寄存器2204。队列具有指向对应于最早的指令的恢复寄存器的尾指针2209,该最早的指令可以通过恢复被指令覆盖的值而回滚,以及起始指针
2210,其指向对应于最新的指令的恢复值并指示响应于正在执行的指令将插入其他恢复值的位置。
[0320] 在一方面,所存储的恢复值与还原指令相关联。存储的值被指令覆盖,并在刷新指令时执行恢复。可以提供状态机,其中对于每个刷新的指令,从恢复缓冲区2200中恢复该值,以读取对应于指令的恢复值2206。状态机可以进行正向或反向扫描。
[0321] 参考图22B描述关于恢复缓冲器的更多细节。在一个示例中,指令由指令提取单元2222从指令高速缓存2220中提取并由指令解码单元2224解码。从一个或多个寄存器文件
2226获得操作数。如果修改了寄存器文件中的值,则该值被存储在恢复缓冲区头部的恢复缓冲区2228中。一个或多个执行单元2230执行指令,并且完成和恢复单元2232完成该指令,或者如果存在错误预测或异常,则处理进行到向后移动的恢复缓冲区2228,在一个示例中,将要恢复的每个值从恢复缓冲器2228复制到注册文件2226,直到还原了错误预测或异常点处的有序寄存器状态为止。
[0322] 根据本发明的一方面,存储在快速处理器存储器中的恢复值用于响应于对应于加载多个、合并加载多个序列或Reloadm指令的寄存器还原请求来还原值。
[0323] 在一个示例中,当寄存器被覆盖时,旧值被存储在恢复缓冲区中。恢复期间,恢复缓冲区中的值将被复制回寄存器文件。在一个示例中,处理器逐步通过恢复缓冲区以检索在存储多个的条目中存在的值。作为示例,通过恢复缓冲区还原寄存器值的步骤是通过向后扫描或正向扫描执行的。(在一个特定示例中,还原了对指定寄存器的保存请求之后的最旧的恢复条目。)正向扫描逻辑的一个示例如下所示:
[0324] Retore[0…31]<=false
[0325] Restore[LM range]<=true
[0326] If NOT(STM tag in recovery file)
[0327] …special handling
[0328] Fori=STM tag to LM tag
[0329] {
[0330] Rec<=RecFile[i]
[0331] If Restore[Rec.reg]
[0332] {
[0333] Reg[Rec.reg]<=Rec.value
[0334] Restore[rec.reg]<=false
[0335] }
[0336] }
[0337] 根据以上示例,还原跟踪每个寄存器是否仍要还原寄存器。初始化以还原与加载多个(或Reloadm)指令指定的寄存器相对应的所有寄存器。如果无法找到要从其还原加载多个(LM)的状态的对应存储多个(STM)的标签,请执行特殊处理。在至少一个实施例中,特殊处理对应于从加载多个或Reloadm指令中指定的存储器位置加载值。
[0338] 然后,伪代码从与寄存器保存指令(例如STM存储多个或Spillm)的标签相对应的恢复缓冲区条目开始的恢复缓冲区向前扫描,直至指令还原寄存器(例如,加载多个或Reloadm)。
[0339] 对于每个条目,读取恢复缓冲区条目(即,由值RecFile[]表示),该缓冲区至少由指示特定恢复缓冲区条目中包含的寄存器号(图22A的2204)以及要还原到寄存器的值Rec.value(图22A的字段2206)组成。如果该寄存器对应于加载多个或Reloadm中的一个寄存器,则将还原“STM存储多个(spillm)”后被覆盖的第一个(最早的)值。
[0340] Restore[]中尚未从恢复缓冲区还原的所有剩余寄存器都将从存储器中还原。
[0341] 类似地,对于向后扫描,逻辑包括:
[0342] Restore[0…31]<=false
[0343] Restore[LM range]<=trueIf NOT(STM tag in recovery file)
[0344] …special handling
[0345] Fori=LM tag to STM tag
[0346] {
[0347] If Rec.reg in LM range
[0348] {
[0349] Reg[Rec.reg]<=Rec.value
[0350] Restore[rec.reg]<=false
[0351] }
[0352] }
[0353] 在另一方面,可以恢复超出恢复文件尾部的值。如果该值尚未被覆盖,则可以执行该操作,这可以通过与响应于头部覆盖尾部条目而移动的头部/第二尾部的高水位标记进行比较来确定。如果头大于或等于第二个尾部,则第二个尾部等于头。
[0354] 如本文中所描述的,在一个实例中,通过异常和分支错误预测恢复以及寄存器还原来还原的实际状态被包含在物理寄存器中。要写入新寄存器,需要分配物理寄存器,将要写入的架构寄存器映射到分配的物理寄存器,然后写入物理寄存器。根据本发明的一个方面,响应于寄存器写请求而分配物理寄存器,以便最大化物理寄存器作为响应于寄存器请求请求而还原寄存器的源的效用。例如,从物理寄存器文件分配新寄存器的技术被修改,以优先选择与寄存器还原快照不相关的寄存器。此外,如果要从寄存器还原快照中获得寄存器,则在至少一个实施例中,进行选择以通过选择物理寄存器来使性能影响最小化,其中所述物理寄存器可以不是要从快照或从性能影响最小的快照还原的寄存器的一部分。在至少一个实施例中,与最小性能影响相对应的快照是最早的快照。根据本发明的一个或多个方面,该处理将参考图23A-23B进一步描述。
[0355] 参照图23A,在一个示例中,确定未使用的物理寄存器是否可用,即查询2300。如果未使用的物理寄存器可用,则在步骤2302中选择并分配未使用的寄存器。如果未使用的物理寄存器不可用,则根据本发明的一方面,选择寄存器(步骤2304)。例如,选择不在活跃快照中的寄存器以进行恢复(例如,分支错误预测,异常等);即用于寄存器还原快照的寄存器,但不用于恢复快照。在一个示例中,从最早的快照中选择一个寄存器,因为例如,最早的快照可能更容易准备释放一个寄存器,并且从较早的快照中获取寄存器的开销可能较小,因为不必立即使用较新的快照中的寄存器。在另一个实施例中,从寄存器还原快照中选择一个不对应于要还原的寄存器的寄存器,即,在指定由STM或Spillm指令保存的寄存器范围之外的寄存器。
[0356] 此外,在步骤2306中,可以在快照中将寄存器标记为无效,或者在步骤2308中,可以解除分配寄存器还原快照,在解除分配寄存器还原复快照时,与该快照关联的物理寄存器在它们不对应于在另一个快照中也使用的寄存器时变为可用。
[0357] 然后在步骤2310中分配所选择的寄存器。
[0358] 参考图23B描述了用于分配寄存器的另一实施例。在一个示例中,确定未使用的物理寄存器是否可用,即查询2330。如果未使用的物理寄存器可用,则选择并分配未使用的寄存器(步骤2332)。但是,如果未使用的物理寄存器不可用,然后选择最早的快照(步骤2334),并确定所选快照是否为寄存器还原快照(查询2336)。如果它是寄存器还原快照,则将其解除分配,以使与其相关的寄存器可用(如果它们不在另一个快照中)(步骤2340)。处理继续进行到查询2330。
[0359] 返回到查询2336,如果所选快照不是寄存器还原快照,则处理等待最早的快照变为不活跃(步骤2338)。处理返回到查询2330。
[0360] 在其他实施例中,代替等待最旧的快照变为不活跃,可以检查其他快照。此外,在其他实施例中,可以首先选择除最旧的快照以外的快照。许多变化是可能的。
[0361] 如本文所述,重命名寄存器和重命名映射(例如,快照)可以用于实现分支错误预测恢复和精确异常。当发现异常或分支错误预测时,可以从寄存器重命名映射和物理寄存器中并且可以通过将推测性存储的状态刷新到存储队列(和可能的高速缓存,例如,对于使用事务存储器的实施例)中来恢复有序程序状态。当由于指令已提交而导致异常或分支错误预测不再发生时,可以重分配和重用寄存器重命名映射和物理寄存器。
[0362] 根据至少一个实施例,用于实现分支错误预测恢复和精确异常的重命名寄存器和重命名映射还用于实现寄存器恢复,以例如在函数调用的上下文中保存和恢复程序状态以进行恢复调用方和被调用方保存的寄存器分别在调用方和被调用方中。
[0363] 此外,根据一个实施例,创建寄存器快照以便实现分支错误预测恢复,并且在存在乱序执行的情况下实现精确异常。在一实施例中,使用寄存器还原制作附加快照用于恢复架构状态。但是,持有此类寄存器快照以进行寄存器可能会导致可用寄存器数量不足,从而在无法执行新目标寄存器时阻止处理器在执行过程中取得进展。
[0364] 另外,可以分配寄存器还原快照,但是可能永远不会发生恢复。例如,结构化的C++/Java异常处理可能会导致函数中止而不还原其状态,或者setjump/longjump可能类似地阻止遇到寄存器还原,从而可能取消分配给寄存器还原的寄存器快照。
[0365] 根据一个实施例,寄存器快照被保存在单独的队列中,防止快照中引用的重命名寄存器被解除分配,并且可以基于确保空闲寄存器的适当供应来回收寄存器快照。因此,当寄存器空闲列表(即用于满足新的寄存器分配请求的寄存器重命名池)降到一定数量的寄存器以下时,可以解除分配寄存器快照,直到空闲列表达到目标大小。目标大小可以是固定阈值,也可以基于对当前工作负载分配的新重命名寄存器的数量的估计,并可能由解除分配快照和提供附加寄存器所需的周期数加权。(在一个实施例中,该阈值可以是0,并且快照将仅被解除分配以满足重命名寄存器分配请求。但是,该策略可能会导致在指令等待重命名寄存器变为可用时资源停顿。)
[0366] 在一个实施例中,寄存器重命名快照及其相关的寄存器被解除分配并循环到FIFO(先进先出)策略中的重命名空闲列表中,其中最早分配的快照也首先被解除分配。在另一个实施例中,已经被寄存器还原使用的寄存器快照也立即被解除分配-这可以利用用于函数调用的堆栈模型的特殊优势,其中首先退出最近输入的函数,因此其寄存器还原状态由于先解除分配可以变为可用)。
[0367] 在另一个实施例中,仅存储与最新的批量保存请求相对应的单个快照(或最后n个,其中n是小整数,例如2)以用于寄存器还原。尽管此功能仅支持单个函数调用的寄存器还原,在按设计复杂度实现的增益的关系方面提供了最大的好处,假设这两者之间的关系是动态最频繁的(在许多工作负载中,超过50%的函数调用是叶子函数),并在加载/命中/存储互锁方面产生最大的负面影响,从而导致性能下降的停顿周期。
[0368] 在至少一个实施例中,在掩码控制下捕获用于寄存器还原的寄存器快照,使得快照可以仅包含由Spilll/STM请求列出的寄存器,以防止重命名寄存器被不必要的重新分配。
[0369] 在另一个实施例中,与寄存器保存/还原序列相对应的寄存器不可以独立地保留,其中寄存器保存/还原序列可以在为寄存器还原而创建的寄存器重命名映射快照中列出。取而代之的是,重命名寄存器根据其用于实现分支错误预测恢复和精确异常而被解除分配。当不再需要寄存器时,它们将返回到空闲列表池(例如,根据Buti等人的实现)。
[0370] 在一个实施例中,空闲列表选择算法被修改以从空闲列表中选择未被寄存器还原快照引用的寄存器。在另一个实施例中,修改空闲列表选择算法以从空闲列表中选择比其他重命名寄存器更早分配给寄存器重命名快照的寄存器。在又一个实施例中,空闲列表选择算法被修改为从空闲列表中选择未被活跃寄存器重命名快照引用的寄存器(即,例如,排除已经用于还原寄存器状态的最近分配的快照,例如,对应的函数)。在又一个实施例中,可以使用这三个标准和附加标准中的任何组合。在又一个实施例中,可以使用这三个标准和附加标准的所有组合。还存在其他可能性。
[0371] 在此描述的是寄存器还原处理的各个方面和实施例。尽管提供了许多示例和技术,但是可以在不脱离本发明的方面的精神的情况下做出变化和/或添加。
[0372] 本发明的一个或多个方面与计算机技术密不可分,并有助于计算机内的处理,从而改善其性能。参照图24A-24B描述了促进计算环境内的处理的一个实施例的更多细节,因为它涉及本发明的一个或多个方面。
[0373] 参照图24A,在一个实施例中,由处理器(2400)获得还原多个架构寄存器的加载请求。基于获得所述加载请求,还原多个架构寄存器中的一个或多个架构寄存器(2402)。还原包括,例如,使用将架构寄存器映射到物理寄存器的快照,用与一个或多个架构寄存器相对应的快照的一个或多个物理寄存器替换当前分配给一个或多个架构寄存器的一个或多个物理寄存器(2404)。在一示例中,无需从存储器复制一个或多个架构寄存器的值来还原一个或多个架构寄存器(2406)。
[0374] 在一个实施例中,基于获得加载请求,确定对应于一个或多个架构寄存器的快照是否可用(2408)。基于确定指示快照可用,使用快照来执行还原(2410)。
[0375] 进一步地,在一个示例中,基于该确定指示对应于一个或多个架构寄存器的快照不可用,通过将来自存储器的值加载到一个或多个架构寄存器中来还原一个或多个架构寄存器(2412)。
[0376] 参考图24B,在一个实施例中,确定快照是否可用包括使用快照堆栈来确定对应于一个或多个架构寄存器的快照是否可用(2420)。在一个示例中,快照堆栈包括多个条目(2422),并且快照堆栈的条目包括标识快照的快照标识符(2424)。在另外的示例中,快照堆栈的条目可以包括附加信息,其包括以下各项中的至少一项:一个或多个架构寄存器的内容的存储器中的地址,与快照相关联的一个或多个架构寄存器的指示和/或指示快照是否有效的有效性指示符(2426)。
[0377] 在另一方面,创建快照以保存一个或多个物理寄存器到一个或多个架构的寄存器的映射(2428)。例如,基于获得请求保存一个或多个架构寄存器的保存请求来执行创建快照(2430)。
[0378] 在示例中,加载请求包括加载多个指令,并且保存请求包括存储多个指令(2432)。
[0379] 在不背离本发明各方面的精神的情况下,许多变化是可能的。应当注意,本文描述了许多方面和特征,并且除非另有矛盾,否则每个方面或特征可以与任何其他方面或特征组合。
[0380] 其他类型的计算环境也可以结合并使用本发明的一个或多个方面,包括但不限于仿真环境,其示例参照图25A进行描述。在该示例中,计算环境2500包括例如本机中央处理单元(CPU)2502,存储器2504以及经由例如一个或多个总线2508和/或其他连接彼此耦合的一个或多个输入/输出设备和/或接口2506。作为示例,计算环境2500可以包括由纽约州阿蒙克市的国际商业机器公司提供的PowerPC处理器或pSeries服务器,和/或基于国际商业机器公司,英特尔或其他公司提供的体系结构的其他机器。
[0381] 本机中央处理单元2502包括一个或多个本机寄存器2510,例如在环境中进行处理期间使用的一个或多个通用寄存器和/或一个或多个专用寄存器。这些寄存器包括代表任何特定时间点的环境状态的信息。
[0382] 此外,本机中央处理单元2502执行存储在存储器2504中的指令和代码。在一个特定示例中,中央处理单元执行存储在存储器2504中的仿真器代码2512。该代码使在一种架构中配置的计算环境能够模拟另一种架构。例如,仿真器代码2512允许基于z/Architecture以外的体系结构的机器(例如PowerPC处理器,pSeries服务器或其他服务器或处理器)模拟z/Architecture并执行基于z/Architecture开发的软件和指令。
[0383] 参考图25B描述与仿真器代码2512有关的更多细节。存储在存储器2504中的客户指令2550包括软件指令(例如,与机器指令相关),该软件指令被开发为在本机CPU 2502的体系结构之外的体系结构中执行。例如,客户指令2550可以被设计为在z/Architecture处理器上执行,但是,正在本机CPU2502(其可以是例如Intel处理器)上进行仿真。在一个示例中,仿真器代码2512包括指令获取例程2552,以从存储器2504获得一个或多个客户指令2550,并可选地为所获得的指令提供本地缓冲。它还包括指令翻译例程2554,用于确定已获得的客户指令的类型,并将该客户指令翻译成一个或多个相应的本机指令2556。这种翻译包括例如识别由访客执行的函数并选择本机指令来执行该函数。
[0384] 此外,仿真器代码2512包括仿真控制例程2560以使本机指令得以执行。仿真控制例程2560可以使本机CPU 2502执行本机指令的例程,该例程模拟一个或多个先前获得的客户指令,并且在这种执行结束时,将控制返回到指令获取例程以仿真下一个客户指令的获得或一组客户指示。执行本机指令2556可以包括将数据从存储器2504加载到寄存器中;或者将数据从寄存器存储回存储器;或执行某种类型的算术或逻辑运算(由转换例程确定)。
[0385] 每个例程例如以软件实现,该软件被存储在存储器中并由本机中央处理单元2502执行。在其他示例中,一个或多个例程或操作以固件、硬件、软件或它们的某种组合实现。可以使用本机CPU的寄存器2510或通过使用存储器2504中的位置来模拟仿真处理器的寄存器。在实施例中,客户指令2550、本机指令2556和仿真器代码2512可以驻留在同一存储器中或者可以分散在不同存储器设备之间。
[0386] 如本文所使用的,固件包括例如处理器的微码或毫码。它包括例如用于实现更高级别机器代码的硬件级别指令和/或数据结构。在一个实施例中,它包括例如专有代码,该专有代码通常作为微码传送,该微码包括特定于底层硬件的可信软件或微码,并控制操作系统对系统硬件的访问。
[0387] 获得、翻译和执行的客户指令2550是例如本文描述的指令之一。从存储器中获取具有一种架构(例如z/Architecture)的指令,将其翻译并表示为另一种架构(例如PowerPC,pSeries,Intel等)的本机指令2556的序列。然后执行这些本机指令。
[0388] 一个或多个方面可以涉及云计算。
[0389] 首先应当理解,尽管本公开包括关于云计算的详细描述,但其中记载的技术方案的实现却不限于云计算环境,而是能够结合现在已知或以后开发的任何其它类型的计算环境而实现。
[0390] 云计算是一种服务交付模式,用于对共享的可配置计算资源池进行方便、按需的网络访问。可配置计算资源是能够以最小的管理成本或与服务提供者进行最少的交互就能快速部署和释放的资源,例如可以是网络、网络带宽、服务器、处理、内存、存储、应用、虚拟机和服务。这种云模式可以包括至少五个特征、至少三个服务模型和至少四个部署模型。
[0391] 特征包括:
[0392] 按需自助式服务:云的消费者在无需与服务提供者进行人为交互的情况下能够单方面自动地按需部署诸如服务器时间和网络存储等的计算能力。
[0393] 广泛的网络接入:计算能力可以通过标准机制在网络上获取,这种标准机制促进了通过不同种类的瘦客户机平台或厚客户机平台(例如移动电话、膝上型电脑、个人数字助理PDA)对云的使用。
[0394] 资源池:提供者的计算资源被归入资源池并通过多租户(multi-tenant)模式服务于多重消费者,其中按需将不同的实体资源和虚拟资源动态地分配和再分配。一般情况下,消费者不能控制或甚至并不知晓所提供的资源的确切位置,但可以在较高抽象程度上指定位置(例如国家、州或数据中心),因此具有位置无关性。
[0395] 迅速弹性:能够迅速、有弹性地(有时是自动地)部署计算能力,以实现快速扩展,并且能迅速释放来快速缩小。在消费者看来,用于部署的可用计算能力往往显得是无限的,并能在任意时候都能获取任意数量的计算能力。
[0396] 可测量的服务:云系统通过利用适于服务类型(例如存储、处理、带宽和活跃用户帐号)的某种抽象程度的计量能力,自动地控制和优化资源效用。可以监测、控制和报告资源使用情况,为服务提供者和消费者双方提供透明度。
[0397] 服务模型如下:
[0398] 软件即服务(SaaS):向消费者提供的能力是使用提供者在云基础架构上运行的应用。可以通过诸如网络浏览器的瘦客户机接口(例如基于网络的电子邮件)从各种客户机设备访问应用。除了有限的特定于用户的应用配置设置外,消费者既不管理也不控制包括网络、服务器、操作系统、存储、乃至单个应用能力等的底层云基础架构。
[0399] 平台即服务(PaaS):向消费者提供的能力是在云基础架构上部署消费者创建或获得的应用,这些应用利用提供者支持的程序设计语言和工具创建。消费者既不管理也不控制包括网络、服务器、操作系统或存储的底层云基础架构,但对其部署的应用具有控制权,对应用托管环境配置可能也具有控制权。
[0400] 基础架构即服务(IaaS):向消费者提供的能力是消费者能够在其中部署并运行包括操作系统和应用的任意软件的处理、存储、网络和其他基础计算资源。消费者既不管理也不控制底层的云基础架构,但是对操作系统、存储和其部署的应用具有控制权,对选择的网络组件(例如主机防火墙)可能具有有限的控制权。
[0401] 部署模型如下:
[0402] 私有云:云基础架构单独为某个组织运行。云基础架构可以由该组织或第三方管理并且可以存在于该组织内部或外部。
[0403] 共同体云:云基础架构被若干组织共享并支持有共同利害关系(例如任务使命、安全要求、政策和合规考虑)的特定共同体。共同体云可以由共同体内的多个组织或第三方管理并且可以存在于该共同体内部或外部。
[0404] 公共云:云基础架构向公众或大型产业群提供并由出售云服务的组织拥有。
[0405] 混合云:云基础架构由两个或更多部署模型的云(私有云、共同体云或公共云)组成,这些云依然是独特的实体,但是通过使数据和应用能够移植的标准化技术或私有技术(例如用于云之间的负载平衡的云突发流量分担技术)绑定在一起。
[0406] 云计算环境是面向服务的,特点集中在无状态性、低耦合性、模块性和语意的互操作性。云计算的核心是包含互连节点网络的基础架构。
[0407] 现在参考图26,其中显示了示例性的云计算环境50。如图所示,云计算环境50包括云计算消费者使用的本地计算设备可以与其相通信的一个或者多个云计算节点10,本地计算设备例如可以是个人数字助理(PDA)或移动电话54A,台式电脑54B、笔记本电脑54C和/或汽车计算机系统54N。云计算节点10之间可以相互通信。可以在包括但不限于如上所述的私有云、共同体云、公共云或混合云或者它们的组合的一个或者多个网络中将云计算节点10进行物理或虚拟分组(图中未显示)。这样,云的消费者无需在本地计算设备上维护资源就能请求云计算环境50提供的基础架构即服务(IaaS)、平台即服务(PaaS)和/或软件即服务(SaaS)。应当理解,图26显示的各类计算设备54A-N仅仅是示意性的,云计算节点10以及云计算环境50可以与任意类型网络上和/或网络可寻址连接的任意类型的计算设备(例如使用网络浏览器)通信。
[0408] 现在参考图27,其中显示了云计算环境50(图26)提供的一组功能抽象层。首先应当理解,图27所示的组件、层以及功能都仅仅是示意性的,本发明的实施例不限于此。如图所示,提供下列层和对应功能:
[0409] 硬件和软件层60包括硬件和软件组件。硬件组件的例子包括:主机61;基于RISC(精简指令集计算机)体系结构的服务器62;服务器63;刀片服务器64;存储设备65;网络和网络组件66。软件组件的例子包括:网络应用服务器软件67以及数据库软件68。
[0410] 虚拟层70提供一个抽象层,该层可以提供下列虚拟实体的例子:虚拟服务器71、虚拟存储72、虚拟网络73(包括虚拟私有网络)、虚拟应用和操作系统74,以及虚拟客户端75。
[0411] 在一个示例中,管理层80可以提供下述功能:资源供应功能81:提供用于在云计算环境中执行任务的计算资源和其它资源的动态获取;计量和定价功能82:在云计算环境内对资源的使用进行成本跟踪,并为此提供帐单和发票。在一个例子中,该资源可以包括应用软件许可。安全功能:为云的消费者和任务提供身份认证,为数据和其它资源提供保护。用户门户功能83:为消费者和系统管理员提供对云计算环境的访问。服务水平管理功能84:提供云计算资源的分配和管理,以满足必需的服务水平。服务水平协议(SLA)计划和履行功能85:为根据SLA预测的对云计算资源未来需求提供预先安排和供应。
[0412] 工作负载层90提供云计算环境可能实现的功能的示例。在该层中,可提供的工作负载或功能的示例包括:地图绘制与导航91;软件开发及生命周期管理92;虚拟教室的教学提供93;数据分析处理94;交易处理95;以及寄存器还原和相关的处理96。
[0413] 在任何可能的技术细节结合层面,本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。
[0414] 计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
[0415] 这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
[0416] 用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、集成电路配置数据或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。
[0417] 这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
[0418] 这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
[0419] 也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
[0420] 附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0421] 除上述之外,可以由提供对客户环境的管理的服务提供商来提供(provide)、提供(offer)、部署、管理、服务等一个或多个方面。例如,服务提供商可以创建、维护、支持等为一个或多个客户执行一个或多个方面的计算机代码和/或计算机基础结构。作为回报,服务提供商可以例如根据订阅和/或费用协议从客户处接收付款。附加地或可替代地,服务提供商可以从向一个或多个第三方出售广告内容中获得付款。
[0422] 在一方面,可以部署应用程序以执行一个或多个实施例。作为一个示例,应用程序的部署包括提供可操作的计算机基础结构以执行一个或多个实施例。
[0423] 作为另一方面,可以部署包括将计算机可读代码集成到计算系统中的计算基础结构,其中该代码与计算系统结合能够执行一个或多个实施例。
[0424] 在另一方面,可以提供一种用于集成计算基础设施的过程,该过程包括将计算机可读代码集成到计算机系统中。该计算机系统包括计算机可读介质,其中该计算机介质包括一个或多个实施例。结合计算机系统的代码能够执行一个或多个实施例。
[0425] 尽管上面描述了各种实施例,但是这些仅是示例。例如,其他架构的计算环境可以用于合并和使用一个或多个实施例。此外,可以使用不同的指令,指令格式,指令字段和/或指令值。许多变化是可能的。
[0426] 此外,可以受益并使用其他类型的计算环境。作为示例,适用于存储和/或执行程序代码的数据处理系统是可用的,其包括至少两个通过系统总线直接或间接耦合到存储元件的处理器。存储器元件包括例如在程序代码的实际执行期间使用的本地存储器,批量存储器以及提供至少一些程序代码的临时存储器以便减少在执行期间必须从批量存储器检索代码的次数。
[0427] 输入/输出或I/O设备(包括但不限于键盘、显示器、指示设备、DASD、磁带,CD、DVD、拇指驱动器和其他存储介质等)可以直接或通过中间I/O控制器耦合到系统。网络适配器也可以耦合到系统,以使数据处理系统能够通过中间的专用或公共网络耦合到其他数据处理系统或远程打印机或存储设备。调制解调器、电缆调制解调器和以太网卡只是网络适配器的几种可用类型。
[0428] 本文所使用的术语仅是出于描述特定实施例的目的,而不是限制性的。如本文所使用的,单数形式“一个(a)”,“一个(an)”和“该(the)”也旨在包括复数形式,除非上下文另外明确指出。还将理解的是,当在本说明书中使用时,术语“包括(comprise)”和/或“包括(comprising)”指定了所述特征、整数、步骤、操作、元件和/或组件的存在,但不排除存在或一个或多个其他特征、整数、步骤、操作、元件、组件和/或其组的添加。
[0429] 如果有的话,下面的权利要求中的所有手段或步骤加上功能元件的相应结构、材料、动作和等同物旨在包括结合明确说明的其他要求保护的元件执行功能的任何结构、材料或动作。已经出于说明和描述的目的给出了一个或多个实施例的描述,但并非旨在穷举性的或限于所公开的形式。对于本领域普通技术人员而言,许多修改和变型将是显而易见的。选择和描述实施例是为了最好地解释各个方面和实际应用,并使本领域的其他普通技术人员能够理解具有各种修改的各种实施例适合于预期的特定用途。