编译器系统及将应用源程序编译为可执行程序的方法与流程

文档序号:15492021发布日期:2018-09-21 20:47阅读:441来源:国知局

本发明通常涉及处理器,更特别地,涉及使得能够动态配置执行资源的具有可扩展指令集架构的处理器。



背景技术:

处理器持续变得更强大。如这里所使用的术语“处理器”是指包括微处理器、中央处理单元(cpu)、处理核、微控制器等的任意类型的处理单元。如这里所使用的术语“处理器”还包括诸如集成在芯片或集成电路(ic)上的处理单元等的处理器配置,其中这些芯片或集成电路包括芯片系统(soc)内所包含的芯片或集成电路等。半导体制造技术正持续改善,从而使速度增加、功耗降低并且使得处理芯片上所集成的电路的尺寸减小。集成尺寸的减小允许在处理单元内并入附加功能。然而,一旦制造了处理器,其执行处理功能及其指令集架构(isa)基本上是固定的。编程器或编译器不能偏离针对给定处理器配置而定义的标准指令的明确定义的界限、而不冒不适当操作甚至故障的风险。

许多应用被编写以包括被设计为进行特定功能或处理操作的一系列指令,其中该特定功能或处理操作并不由处理单元内的任何硬件块来特别进行。通常,这种代码包括可以在应用程序执行期间执行相当多次的软件循环。尽管处理器可以被制造成包括硬件块来进行特定功能以加速执行和完成从而提高该特定应用的性能,但是这种解决方案是不实际的,这是因为该硬件块可能对于任何其它程序均无用处。因此,通用处理器通常被制造成包括相对常见和基本的功能,这些功能对于各种不同的软件应用而言通常是有用且实用的。编程器必须使用所提供的标准指令集来构建算法、功能和操作以满足特定应用的需求。



技术实现要素:

根据一个实施例的编译器系统,用于将应用源程序转换为与预定指令集架构即预定isa相对应的能够由根据所述预定isa实现的通用处理器所执行的可执行程序,其中所述处理器包括可编程执行单元即peu,所述peu能够被编程以执行由该处理器接收以供执行的指定的用户定义指令即udi。所述编译器系统包括peu编程工具和编译器。所述peu编程工具用于将所述处理器的所述peu所要执行的处理操作的功能描述转换为用于对所述peu进行编程以响应于指定的udi来执行所述处理操作的编程信息。所述编译器用于将所述应用源程序转换为所述可执行程序,其中,所述编译器包括至少一个优化例程,所述至少一个优化例程用于:利用指定的udi表示所述应用源程序中的一部分,将该udi插入到所述可执行程序中,以及还将用于指定所述udi和所述编程信息在所述可执行程序中的位置的udi加载指令插入到所述可执行程序中。

所述编译器可以询问所述peu编程工具以将所述udi和相应编程信息并入到所述可执行程序中。所述编译器可以使用所述至少一个优化例程来生成处理操作的所述功能描述。所述可执行程序可以包括标准程序,以及所述可执行程序还可以包括定制程序,其中所述标准程序仅包括来自所述预定isa的指令且不包括指定的udi,所述定制程序包括指定的udi和所述编程信息。

所述编译器可以将所述编程信息作为udi信息并入到所述应用源程序中以提供修改后的应用源程序,然后将所述修改后的应用源程序编译为所述可执行程序。所述peu编程工具可以生成包括udi定义和相应编程信息的输出。所述编译器可以将所述peu编程工具的所述输出作为udi信息并入到所述应用源程序中以提供修改后的应用源程序,然后可以将所述修改后的应用源程序编译为所述可执行程序。所述peu编程工具的所述输出可以是头部文件。

所述编译器在将所述应用源程序编译为所述可执行程序期间可以链接到所述编程信息。所述peu编程工具可以生成包括udi定义和相应编程信息的输出,以及所述编译器在将所述应用源程序编译为所述可执行程序期间可以链接到所述peu编程工具的所述输出。所述peu编程工具的所述输出可以是头部文件。

根据一个实施例的方法,用于将应用源程序编译为与预定指令集架构即预定isa相对应的能够由根据所述预定isa实现的通用处理器所执行的可执行程序,其中所述处理器包括可编程执行单元即peu,所述peu能够被编程以执行由该处理器接收以供执行的指定的用户定义指令即udi,所述方法包括:将所述处理器的所述peu所要执行的处理操作的功能描述转换为用于对所述peu进行编程以响应于指定的udi来执行所述处理操作的编程信息;以及将所述应用源程序编译为所述可执行程序,包括:利用指定的udi表示所述应用源程序中的一部分,将该udi插入到所述可执行程序中,以及还将用于指定所述udi和所述编程信息在所述可执行程序中的位置的udi加载指令插入到所述可执行程序中。

附图说明

参考以下描述和附图,将更好地理解本发明的益处、特征和优点,其中:

图1是根据本发明的一个实施例实现的包括第一可编程执行单元的处理器的简化框图;

图2是根据本发明的一个实施例实现的图1的处理核的简化框图;

图3是根据本发明的一个实施例实现的图2的解码器的简化框图;

图4是根据本发明的一个实施例的图1的可编程执行单元(peu)的简化框图;

图5是示出根据本发明的一个实施例的图1的处理核的用于处理应用内所包括的用户定义指令(udi)的操作的流程图;

图6是示出根据本发明的一个实施例的图3的udi加载器的用于与可编程执行单元进行协商以对处理核进行编程从而响应于udi加载命令进行与udi相关联的处理操作的操作的流程图;

图7是示出根据本发明的一个实施例的图3的udi加载器的用以卸载针对已被操作系统终止的特定进程而编程的各udi的操作的流程图;

图8是根据本发明的一个实施例的peu内的图4的可编程逻辑的更详细的框图;

图9是根据本发明的一个实施例实现的图8的可编程逻辑元件的示意框图;

图10是根据本发明的一个实施例实现的图9的查找表(lut)的示意图;

图11是根据本发明的一个实施例的用于对peu进行编程的编程信息的格式的简化框图。

图12是示出根据本发明的一个实施例的用于生成包含一个或多个udi和对peu编程用的相应编程信息的应用的第一方法的简化框图;

图13是示出根据本发明的一个实施例的用于生成包含一个或多个udi和对peu进行编程的相应编程信息的应用的第二方法的简化框图;

图14是示出根据本发明的一个实施例的用于生成包含一个或多个udi和对peu进行编程的相应编程信息的应用的另一方法的简化框图;

图15是大致示出根据本发明的一个实施例的图1的处理器的操作码空间的简化框图;

图16是用根据本发的一个实施例的udi替代应用程序的例程中的标准代码以提供使用这些udi的替代应用程序的简化示例;以及

图17是用根据本发明另一实施例的udi替代应用程序的例程中的标准代码以提供使用这些udi的替代应用程序的简化示例。

具体实施方式

发明人已经认识到与具有固定执行资源和相应限制指令集的处理器相关联的低效率。因此,发明人开发了一种动态配置与可扩展isa配合的执行资源以提高处理器工作效率的系统和方法。代替必须使用标准限制指令集来编写代码,软件程序员可以选择编写硬件功能描述来进行特定的处理操作。通过编程工具等将硬件功能描述转换为编程信息,其中将编程信息并入可执行代码中。在执行期间,使用编程信息来对处理器内的可编程执行单元(peu)进行编程以进行相同的处理操作。peu是一种硬件加速器,与peu所替代的代码相比,peu可以更快且更有效地进行处理操作。软件程序员还可以指定用户定义指令(udi),或者udi还可以通过用于替代代码以调用peu进行编程处理操作的编程工具来提供。以这种方式,udi不必使用限制指令集将例程或处理编写在软件中,而是根据需要随时随地调用peu以进行处理操作。

另外,即使在使用处理器的标准isa来编写源代码之后,也可以提供如下编译器,其中该编译器包含或以其它方式链接到编程工具以自动生成一个或多个udi和相应的peu编程信息。编译器包括优化例程,其中优化例程用于检查代码以识别可以进行改进的位置,诸如代码大部分时间花在哪里等。编译器生成包含udi和编程信息的定制可执行代码,以在执行期间即时对peu进行编程,从而改进操作。此外,编程工具可以与能够将现有可执行代码转换成包含一个或多个udi和相应peu编程信息的定制可执行代码的代码分析工具等一起使用。

总之,peu是可编程执行单元,其用作可以被编程为即使在处理器被制造之后也使得处理器能够进行新创建的处理操作的硬件加速器。一个或多个用户定义指令替代了在其它情况下将被要求进行相同处理操作的传统代码。在该事实之后,可以使用编程器、编译器或甚至代码分析工具来定义并创建用于调用peu以在执行期间优化现有处理操作的新指令。

图1是根据本发明的一个实施例实现的包括第一可编程执行单元(peu1)101的处理器100的简化框图。处理器100的标准指令集架构(isa)可以是x86宏架构,其中在x86宏架构中,可以正确地执行被设计为在x86处理器上执行的大多数应用程序。如果获得了预期的结果,则应用程序被正确执行。特别地,处理器100执行x86指令集的指令并且包括x86用户可见寄存器集。然而,本发明不限于x86架构,其中处理器100可以对应于如本领域普通技术人员已知的任何可选isa。

处理器100包括单独标记为s1、s2、...、sn的n个核片区(coreslice)103,其中n是包括1的任意正整数(即,处理器100包括至少一个核片区并且可以仅包括一个处理核)。进一步示出并描述第一核片区s1的细节,其中应当理解,其余各核片区s2~sn可以以基本相似的方式实现。第一核片区s1包括第一处理核c1105,第一处理核c1105进一步包含被示为第一可编程执行单元peu1的peu101。其余核片区s1~sn的各处理核可以包括类似的peu。处理核105耦接到环形站rs1107,环形站rs1107进一步耦接到标记为llc1的“末级高速缓存”(llc)109。其余的各核片区s2~sn包括类似的分别被标记为环形站rs2~rsn的环形站,这些环形站各自进一步耦接在相应的处理核和相应的核片区的llc之间。

在所示配置中,环形站rs1~rsn各自以环形配置耦接在一起,该环形配置进一步耦接到处理器100上所包含的存储器控制器(mc)111。mc111还耦接到外部系统存储器113。在可选实施例中,mc111可以设置在处理器100的外部,其中处理器100包括用于与外部存储器控制器和系统存储器113联系的总线接口单元等(未示出)。核片区s1~sn共享系统存储器113的资源,并且还可以经由环形站rs1~rsn彼此共享信息。应当理解,处理器100可以被配置为包含单个peu而不是各自配置有单独peu的多个核片区的单核处理器。

系统存储器113存储可执行二进制应用(app)115,app115进一步包括头部117和主体119。二进制app115以通用形式示出并且可以被实现为可以由包括处理核c1的处理器100的任何一个或多个处理核成功执行的二进制可执行文件(.exe)文件、字节码文件(.net、java等)或任何其它类型的可执行代码。在所示配置中,头部117包括至少一个加载命令,其中提供各加载命令以用于指定相应的用户定义指令(udi)并将该udi加载到处理器100中以供peu1101执行。如图所示,例如,头部117包括用于指定并加载第一用户定义指令udi1的第一加载命令ld_udiudi1,并且头部117包括用于指定并加载第二用户定义指令udi2的第二加载命令ld_udiudi2。如这里进一步描述的,udi1和udi2可以是经过配置的或者以其它方式从一组可用的udi操作码中选择的操作码。尽管二进制app115包括两个用户定义指令,但是可执行的二进制应用可以包括处理核的可编程执行单元(诸如核c1的peu1101等)可同时支持的任意数量的用户定义指令。

加载命令各自包括用于对处理核的可编程执行单元进行编程的相应编程信息的地址等。头部117包括加载命令ld_udiudi1并且加载命令ld_udiudi1指向第一编程信息pi_udi1。此外,头部117包括加载命令ld_udiudi2并且加载命令ld_udiudi2指向第二编程信息pi_udi2。编程信息可以如图所示包括在头部117内,或者可以在二进制app115的单独区段内提供。如本文进一步描述的,处理核c1访问pi_udi1和pi_udi2并将pi_udi1和pi_udi2加载到peu1101中。在进行编程之后,在二进制app115的主体119的操作期间,peu1101响应于指令udi1()而进行第一编程功能或处理操作,并且响应于指令udi2()而进行第二编程功能或处理操作。括号“()”表示:各用户定义指令udi1和udi2可以包括用于进行各功能的任意数量(零个或更多个)操作数。各操作数可以具有与标准指令的操作数相同的形式,诸如可以由udi自身提供或以其它方式加载到寄存器等中的实数、常数、整数、布尔值等。

尽管未示出,系统存储器113可以包括被加载以供处理器100随时间经过而执行的多个应用程序。多个应用可以被加载到任何一个或多个处理核c1~cn中,但在所示实施例中各处理核通常一次仅执行一个处理。各处理核一次执行多个处理的实施例也被考虑。可以将多个应用程序分配给其中一个处理核来执行。操作系统(os)包括用于调度处理器100的应用程序的执行的调度器等,处理器100的应用程序的执行包括针对给定处理核一次一个地换入换出多个处理中的各处理以供执行。多个应用可以由诸如c1等的给定处理核来执行,其中各应用可以包括被编程到peu1101中的一个或多个udi。尽管peu1101可以具有足够的资源来针对多个应用中的各应用应对一个或多个udi,但peu1101是有限的资源,其中如本文进一步描述的,udi编程可以在操作期间被换出。

图2是根据本发明的一个实施例的处理核c1105的简化框图。在所示实施例中,处理核c1105包括指令高速缓存(icache)201、前端管道(包括取指(fetch)引擎203、解码器205和寄存器别名表(rat)207),并且还包括保留站209、执行单元211、二级(l2)高速缓存213、物理寄存器文件(prf)215和重排序缓冲器(rob)217。l2高速缓存213还与环形站rs1联系以最终访问系统存储器113。执行单元211可以包括一个或多个整数(int)单元219、一个或多个浮点或媒体单元221、一个或多个加载和存储管线(加载/存储管道)223、以及peu1101。加载/存储管道223可以被配置为独立的加载和存储管线和/或加载和存储组合管道。加载/存储管道223可以包含存储器顺序缓冲器(mob)(未示出)等,并且还可以包括与l2高速缓存213联系的一级(l1)高速缓存(未示出)。保留站209可以包括用于向各个执行单元211分派指令的调度器的任何组合。例如,可以包括独立的整数、媒体和加载/存储调度器,以用于分别向int单元219、媒体单元221和加载/存储管道223分派指令。处理核c1105还包括peu调度器225,如本文进一步描述的,该peu调度器225用于从rat207接收所发出的udi并且将这些udi分派到peu1101。

指令高速缓存201对来自诸如二进制app115等的位于系统存储器113中的活动应用的程序指令进行高速缓存。取指引擎203从指令高速缓存201提取程序指令,并将这些程序指令转发到解码器205,解码器205将这些程序指令解码成由一个或多个执行单元211执行的指令。在一个实施例中,指令转译是用于将处理器100的宏指令集(诸如x86指令集架构等)的宏指令(或宏操作)转译成处理核c1105的微指令集架构的微指令(或微操作)。如本文所使用的,宏指令和微指令通常在本文中可通常被称为“指令”,更具体地,分别被称为宏操作和微操作。例如,存储器访问指令可以被解码成包括一个或多个加载或存储微指令的微指令序列。二进制app115填充有宏操作,这些宏操作由解码器205转换成作为处理器100的原生指令集的一部分的相应微操作。rat207基于各指令的程序顺序、基于该指令所指定的操作数源、以及基于重命名信息来针对该指令生成依赖信息。

rat207将解码后的微操作及其相关联的依赖信息分派到rs209或peu调度器225。一般来说,处理器100的isa的标准指令被分派到保留站209,而udi被分派到peu调度器225。rs209和peu调度器225各自包括用于保持从rat207接收到的指令和依赖信息的至少一个队列。在准备好执行所接收到的指令的情况下,保留站209将这些指令分派到执行单元211中的相应执行单元,并且在准备好执行所接收到的udi微操作的情况下,peu调度器225将这些udi微操作分派到peu1101。在解析出指令的所有依赖关系的情况下,该指令被视为准备好执行。结合分派指令,rat207为该指令在rob217中分配条目。因此,指令以程序顺序分配到rob217中,rob217可以被配置为循环队列,以确保指令以程序顺序提交(retire)。rat207还将依赖信息提供给rob217,以存储在rob217的指令条目中。rat207还为各指令分配或映射prf215内的一个或多个物理寄存器以存储操作数和结果。

执行单元211的结果可以反馈到rob217以更新prf215内的相应寄存器。在一个实施例中,rat207将架构寄存器映射到prf215中的物理寄存器并更新rob217中与指令相对应的指针等(未示出)。rob217中的指针可以在执行期间或执行之后更新,并且指针用于在操作期间更新prf215内的寄存器的内容。rob217最终以程序顺序提交指令,以确保根据二进制app115的指令进行正确的操作。

处理器100是超标量的并包括多个执行单元,并且能够在单个时钟周期内向执行单元211(包括peu1101)发出多个指令。处理器100还被配置为进行非循序执行。也就是说,保留站207可以不按照包括指令的程序所指定的顺序来发出指令。超标量非循序执行处理器通常会尝试维持相对大的未完成指令池,使得这些处理器可以利用更大量的指令并行性。处理器100还可以在确定指令是否实际完成之前进行执行指令的指令推测性执行,或至少执行指令规定的一些动作。由于各种原因,诸如错误预测的分支指令、异常(中断、页面错误、除以零状况、一般保护错误等)等的原因,指令可能未完成。尽管处理器100可以推测性地进行指令规定的一些动作,但是处理器不会利用指令的结果来更新系统的架构状态,直到确定该指令将完成为止。这可以例如在rob217提交指令时确定。

图3是根据本发明的一个实施例实现的解码器205的简化框图。来自取指引擎203的指令被称为x86宏指令或宏操作,将x86宏指令或宏操作提供给转译器(xlate)301,其中xlate301将各宏操作转换为一个或多个微操作以供执行单元211中的相应执行单元来执行。x86指令集架构(isa)包括已知的宏操作,其中该宏操作包括表示为“sx86”的更常见或简单的x86指令以及表示为“cx86”的更复杂的x86指令。转译器301包含用于将sx86宏操作转换为被提供给复用器(mux)303的一个输入的相应sx86微操作的转换逻辑(未示出)。更复杂的cx86宏操作被“卡在”微代码(ucode)rom306内的cx86处理程序305。cx86处理程序305包括用于将各cx86宏操作转换为被提供给mux的另一输入的一个或多个cx86微操作的适当代码或例程。应当注意,标准x86指令(包括sx86和cx86指令)的转换和处理是已知的,这里不再进一步描述。

x86isa还包括x86isa的标准指令集内未定义的一组用户定义指令或udi。通常,x86isa的标准指令集消耗完整的一组操作码的子集,其余的操作码先前被认为是“未定义的”。在先前的配置中,在转译器301遇到任何这些未定义的指令的情况下,这些指令也被卡在ucoderom306的未定义的指令处理程序(未示出),以采取诸如设置错误(例如,一般保护故障)等的适当动作。然而,为了本案的目的,这些未定义的操作码的一部分被保留为udi宏操作以供用户进行定义从而进行用户定义功能或处理操作。udi宏操作由转译器301转发到ucoderom306内的udi处理程序307,该udi处理程序307将一个或多个相应的udi微操作转发给mux303。注意,在一些配置中,可以在ucoderom306外部进行从udi宏操作到相应udi微操作的转换。ucoderom306还包括响应于ld_udi命令的udi加载器309,其中如本文进一步描述的,ld_udi命令用于针对相应的udi对peu1101进行编程。转译器301根据所接收到的宏操作,将控制信号opsel设置到mux303的控制输入,以从提供给rat207的sx86、cx86或udi微操作中进行选择。

解码器205还包括isa表311,其中udi处理程序307使用该isa表311来将udi宏操作转换为相应的udi微操作。在一个实施例中,isa表311存储在处理器100内所设置的可编程ram(pram)中。isa表311的各行包括udi宏操作字段、相应的处理上下文标识符(pcid)字段、微操作字段、编程信息地址(pi_addr)字段、有效字段以及执行标识符(eid),其中该udi宏操作字段包括用户所定义的udi所用的宏操作操作码,相应的处理上下文标识符(pcid)字段包括用于标识定义了udi的处理的pcid值,微操作字段列出要经由mux303发送到rat207的一个或多个微操作,编程信息地址(pi_addr)字段指向存储器(例如,系统存储器113)中的位置以定位udi用的编程信息,有效字段标识udi是否有效,并且执行标识符(eid)用于定位peu1101的被编程为进行由相应udi所标识的功能或处理操作的部分。如图所示,isa表311包括多达“m”个条目,其中m是正整数。

在一个实施例中,各udi宏操作映射到被提供给rat207以待发出到peu调度器225从而由peu1101进行分派和执行的一个相应udi微操作。isa表311中的微操作包括该微操作所映射到的相应udi微操作。isa表311中的微操作还可以包括附加的非udi或标准微操作以便于udi处理操作。例如,在udi微操作之前可以包括一个或多个微操作,以在执行udi之前将一个或多个操作数值从一个存储位置(存储器位置或寄存器)加载或移动到另一存储位置,并且在udi微操作之后可以包括一个或多个微操作,以在执行udi之后将一个或多个结果值从一个存储位置移动到另一存储位置。

图15是大致示出根据本发明的一个实施例的处理器100的操作码空间的简化框图。通用操作码空间1501定义处理器100的整个操作码空间,其中该操作码空间通常由宏操作指令的允许操作码的位数来确定。作为简单的示例,如果指令操作码被定义为包括多达16位,则通用块1501表示所有可能的操作码组合,或者216=64536个可能的操作码。通用块1501内所包含的经定义的操作码空间1503表示所有经定义的宏指令,诸如表示为“sx86”的更常见或简单的x86指令、表示为“cx86”的更复杂的x86指令以及可能的任何保留的操作码。通用块1501内所包含的未定义的操作码空间1505表示通用块1501的未包括在经定义的操作码空间1503中的所有剩余操作码空间,其中所有剩余操作码空间包括所有当前未定义的操作码空间。

如本文所述的具有可扩展isa的处理器分割出先前未定义的操作码空间1505的一部分作为用户定义指令(udi)空间1507。留出该操作码空间以允许程序生成器定义udi,从而使得诸如peu1101等的peu能够进行由用户进行定义并编程的用户定义指令。udi空间1507可以通过指令类型进一步细分。作为示例,udi可以是整数udi指令1509内所提供的整数型指令之一,或者可以是浮点udi指令1511内所提供的浮点型指令之一等。可以定义附加的udi指令类型。各udi指令类型通过指令等待时间来进一步细分。等待时间(lat)是指指令需要完成的以时钟周期为单位的时间量。例如,较简单的udi指令可以在1或2个时钟周期(分别为lat1或lat2)中完成,或者可能需要更多时钟周期,诸如4或6个时钟周期或更多时钟周期(诸如分别为lat4或lat6,或者更多等)。

映射到isa表311中的相应udi宏操作的udi微操作包含至少一个等待时间字段,该等待时间字段用于标识用户所选择的(或者编程功能所选择的)udi宏操作的相应等待时间。返回参考图2,核c1105的peu调度器225被配置为根据所接收到的udi微操作的等待时间字段来确定所接收到的微操作的等待时间。peu调度器225使用等待时间信息来调度所接收的各udi微操作的定时。

图4是根据本发明的一个实施例的peu1101的简化框图。peu1101包括控制逻辑401和可编程逻辑403。控制逻辑401包括分配和编程逻辑405以及执行重定向逻辑407。在所示实施例中,可编程逻辑403被细分为一组“p”个大致相同的可编程区段409,分别被示为可编程区段p1、p2、pp,其中“p”是正整数。udi加载器309与分配和编程逻辑405联系以将处理操作编程到可编程逻辑403中。特别地,udi加载器309提供或以其它方式设置用于表示编程会话的编程值输入(pgm),并将编程信息(pi)提供给分配和编程逻辑405的输入。分配和编程逻辑405分配足够进行编程并进行处理操作的一个或多个区段409,然后接收udi加载器309所访问的相应编程信息以对所分配的区段409进行编程。分配和编程逻辑405提供用于映射到已针对特定处理操作进行了编程的区段409的执行id(eid)。

peu1101可以是相对大的资源,诸如由现场可编程门阵列(fpga)等实现,以针对多个应用处理中的各应用处理一次对多个用户定义指令进行编程。然而,peu1101是有限的资源,因为其余的未分配区段409可能不足以对要编程的新处理操作进行编程。在这种情况下,分配和编程逻辑405可以在对新处理操作进行编程时使先前分配的区段409无效,从而使一个或多个先前编程的处理操作无效。在一个或多个先前编程的处理操作无效的情况下,分配和编程逻辑405输出已经被无效的任何eid。在处理已经完成操作而使得该操作终止的情况下,卸载已经针对该处理进行了编程的任何指令。udi加载器309还被配置为提供与已经终止的给定处理相关联的处理操作的一个或多个eid,在这种情况下,分配和编程逻辑405解除对相应的区段409的分配以使得这些区段可用于对新处理操作进行编程。udi加载器309还可以通过提供要卸载的处理操作的相应eid来卸载任何给定的处理操作。

各区段409可以包括足够的可编程逻辑以进行简单的处理操作。例如,用户定义指令udi1可以与能够由单个区段409进行的简单处理操作相关联。如图所示,区段p1被编程为进行与udi1相关联的处理操作。诸如与用户定义指令udi2相关联等的更复杂的处理操作可能需要多于一个区段409来进行相应的处理操作。如图所示,例如,区段p2和p3被编程为进行与udi2相关联的处理操作。另外,可以利用多于两个区段409来实现甚至更复杂的处理操作。

在一个实施例中,分配和编程逻辑405进行动态分配,其中分配和编程逻辑405识别可用于分配的下一区段409,并且当接收到被配置为对所指示的处理操作进行编程的编程信息pi时,开始编程。如果编程信息pi在第一分配区段409已被完全编程之后继续进行使得需要附加区段409来完成编程,则对附加区段进行即时动态分配,直到处理操作被完全编程到peu1101中为止。在可选实施例中,编程信息pi可以被配置为包括用于表示该处理操作所需的区段409的数量的资源声明等(1103,图11)。在这种情况下,分配和编程逻辑405预先分配所指示的区段数,然后使用编程信息pi对所分配的区段进行编程。

在编程之后,并且响应于进程执行期间遇到的udi,执行重定向逻辑407接收udi微操作和相应的eid以进行相应的处理操作。执行重定向逻辑407使用所接收到的eid来重定向udi微操作并将udi微操作应用于被编程为进行相应处理操作的一个或多个相应区段409。如图所示,例如,用户定义指令udi1所用的eid引导执行重定向逻辑407,以将udi2应用于被编程为针对用户定义指令udi2进行相应处理操作的区段p2和p3。

图5是示出根据本发明的一个实施例的用于处理诸如二进制app115等的应用内所包含的udi的处理核c1105的操作的流程图。在第一个块501中,下一宏操作指令被从指令高速缓存201提取并转发给解码器205。如果解码器205判断为指令是诸如所定义的sx86或cx86指令中的任意指令等的标准x86指令,则操作进入块505以进行标准指令处理,并且完成操作。标准指令处理是已知的并且不再进一步描述。

如果指令不是标准x86指令,则操作代替地进入询问块507,其中在询问块507中,询问指令是否是udi。如果指令不是udi,则操作进入用于响应于未定义的指令来进行任意期望功能的错误例程块509。实现逻辑将变量等传递给用于表示已经接收到未定义的指令的错误例程块509。例如,处理核c1105可以发出一般保护故障等。在进行了错误例程块509之后,针对该指令完成了操作。如果指令是udi,则操作进入块511,其中在块511中,将宏操作传递给udi处理程序307,该udi处理程序307在isa表311中扫描针对所接收到的宏操作的匹配条目,该匹配条目包括匹配操作码和相应的匹配pcid。如果没有找到匹配条目,则操作向错误例程块509传递了表示未匹配的指示,并且进行适当的动作。例如,如果没有找到匹配操作码,则指示可以表示已经接收到未定义或未知的udi。在已经找到匹配操作码、但其是针对不同的pcid的情况下,该指示可以表示如此。如先前所述,各udi是针对由该udi的pcid标识的特定处理所定义的。如果isa表311中的pcid与当前执行的处理的pcid不匹配,则操作进入表示未经授权的处理正尝试执行针对另一处理所定义的udi的错误例程块509。

如果在块513中判断为在isa表311中找到匹配,则操作进入块515,其中在块515中,从isa表311中检索到相应的一个或多个微操作并将这些微操作传递给rat207。在块517所示的操作期间,rat207将相应的udi微操作发出到peu调度器225,其中该peu调度器225最终将udi分派给peu1101以执行编程的相应处理操作。在udi执行之后,操作进入块519,其中在块519中,rob217最终提交包括针对rob217内的指针和prf215内的寄存器的任意更新的udi。然后,针对该udi完成操作。

图6是示出根据本发明的一个实施例的udi加载器309的用于与peu1101进行协商以对处理核c1105进行编程从而响应于udi加载命令ld_udi进行与udi相关联的处理操作的操作的流程图。在第一个块601中,udi加载器309在isa表311中搜索针对宏操作和相应pcid的匹配条目。如果在下一询问块603中判断为针对宏操作和pcid这两者找到了匹配条目,则先前已经针对具有相同pcid的处理定义了udi。os先前加载了包括该udi的进程,然后os可以临时暂停该处理以允许在此期间执行另一进程。在重新加载该进程的情况下,udi加载器309进行该重新加载进程,以判断udi是否仍有效。在找到匹配的情况下,操作进入块605,以判断条目是否仍有效。如先前所述,其间发生的进程可以包括一个或多个udi,其中在该进程中,在peu1101内已经覆盖了针对当前进程的处理操作的编程。如果匹配条目有效,则针对当前udi完成了操作。针对先前已经针对当前进程所定义的各udi来重复该操作。

如果在isa表311中没有找到匹配,则操作进入块607,其中在块607中,udi加载器309针对新条目分配isa表311中的位置。注意,在块607中分配isa表311中的位置时,udi加载器309仅仅访问下一可用空位置。如果不存在更多的可用空位置,则可以访问先前无效的条目以进行覆盖。条目的数量m可以相对较大以降低当前活动的进程在任意给定时间使用所有m个条目的可能性。然而,任意一个或多个当前活动的进程消耗大量条目,使得不存在更多可用的空或无效位置,这当然也是可能的。在这种情况下,覆盖临时暂停的处理的当前有效条目,以针对当前处理分配新条目。在临时暂停的处理随后变成当前处理、并且再次进行加载功能的情况下,找不到匹配条目并且以同样的方式分配新条目。

然后,操作进入块608,其中在块608中,询问是否已经覆盖了isa表311中的任意有效条目。如果已经覆盖了isa表311中的任意有效条目,相应处理操作仍在peu1101内编程并仍有效是可能的。将peu1101中进行编程的处理操作保持完整也是可能的,以避免在与isa表311中的覆盖条目相对应的处理随后再次变成活动处理的情况下必须对peu1101再次进行重新编程。尽管如此,在所示实施例中,期望维持isa表311和peu1101之间的对应关系,并且避免使分配和编程逻辑405进一步复杂化以追踪覆盖条目的编程资源。因此,如果在块608中判断为已经覆盖了isa表311中的有效条目,则操作进入块609,其中在块609中,卸载与覆盖条目相对应的处理操作。在实际覆盖该条目之前,检索被覆盖的条目的eid并且通过udi加载器309将该eid应用于peu1101,其中分配和编程逻辑405卸载相应处理操作并且释放可编程逻辑403内的空间以供随后的编程。

如果在块608中判断为没有覆盖有效条目,或者在块609中已经卸载了peu1101中的处理操作之后,操作进入块610,其中在块610中,将宏操作操作码、当前pcid和编程信息的地址加载至isa表311的新条目中。然后,操作进入块611,其中在块611中,使用pi地址来访问udi加载器309对peu1101进行编程所使用的编程信息。一旦进行了编程,则在下一块613中,udi加载器309从peu1101中检索eid,并且构造或以其它方式选择适合于新条目的微操作操作码。然后,操作进入块615,其中在块615中,利用相应微操作和eid来更新isa表311的新条目并且将该条目标记为有效。

然后,操作进入块617以使isa表311内的已被peu1101修改并由此无效的任意条目无效。如先前所述,例如,peu1101内的分配可以使得覆盖针对用于另一处理(进程)的另一udi的处理操作进行了编程的一个或多个区段409,由此使该udi无效。在这种情况下,并非实际删除isa表311中的条目,而是仅仅使该条目无效,因为该处理可以再次启动。

如果在块603中找到了匹配但在块605中发现无效,则操作进入块611,以使用匹配条目的pi地址来访问相应编程信息,并且对peu1101进行编程。然后,操作继续进行块613、615和617,以确保isa表311和peu1101之间的合适相关性。在这种情况下,即使先前已经针对udi对peu1101进行了编程,仍覆盖peu1101的一个或多个区段409,使得udi无效。即使条目被标记为无效,由于宏操作操作码和相应pcid仍在isa表311中,因此该条目由于没有被去除因而代替地也可被认为是“不活动的”。该条目的pi地址仍有效。在os重新加载了处理之后,对peu1101进行重新编程并且更新isa表311中的匹配条目。在块617之后,完成操作。

图7是示出根据本发明的一个实施例的udi加载器309的用以卸载针对已经被os终止的特定处理而编程的各udi的操作的流程图。在第一个块701中,udi加载器309在isa表311中扫描具有匹配pcid的条目。在下一块703中,针对所找到的各匹配pcid,将相应eid发送给peu1101,以卸载用于udi的编程的相应区段409。这样,解除分配的区段409可以由其它处理来使用。在下一块705中,针对所找到的各匹配pcid,注销掉pcid条目,并且完成操作。注销掉pcid使得isa表311中的条目能够被重新分配以用于另一处理的udi。

图8是根据本发明的一个实施例的可编程逻辑403的更详细的框图。所示的可编程逻辑403包括可编程元件的阵列,该阵列包括被示出为配置在可编程逻辑元件801的xy矩阵中的可编程逻辑元件(le)801,这些可编程逻辑元件各自被示出为lexy,其中x和y分别表示阵列的行标和列标。各行还包括杂项逻辑块803的阵列中的至少一个,其中杂项逻辑块803各自包括用以补充逻辑元件801的矩阵的支持逻辑。各杂项逻辑块803可以例如包括一个或多个存储元件、一个或多个寄存器、一个或多个锁存器、一个或多个复用器、一个或多个加法器(用以相加或相减数字值)、一组布尔逻辑元件或门(例如,诸如或(or)门、与(and)门、反相器、异或(xor)门等的逻辑门)等。一个或多个寄存器可以被配置为移位寄存器或数据拌和器(swizzler)等,以用于灵活的数据操作。逻辑元件801和杂项逻辑块803与路由网格连接到一起,其中该路由网格包括可编程交叉开关或互连器805的矩阵。各可编程互连器805包括多个开关以选择性地将可编程装置连接在一起。路由网格包括足以将逻辑元件803和杂项逻辑块803中的多个器件连接在一起以进行简单处理操作和更复杂处理操作的连接性。

如本文进一步描述的,各区段409包括一个或多个可编程元件以及用于选择性地将装置和元件连接在一起以进行相应功能或处理操作的相应路由网格。路由网格是包括多个开关等以在逻辑元件801和杂项逻辑块803之间进行输入和输出的重定向的切换矩阵。

可编程逻辑403包含可编程存储器807,其中使用该可编程存储器807来对逻辑元件801、相应杂项逻辑块803和可编程互连器805中所选择的器件进行编程以进行期望处理操作。可编程存储器807还可以包括存储位置或寄存器等以接收输入操作数或值并且存储处理操作的输出结果。可编程存储器807分散在可编程逻辑403的可编程区段409之间,并且从所分配区段409中个别或共同选择出的各可编程区段409通过使用该可编程存储器807来进行特定处理操作。可编程存储器807可以被配置为可编程逻辑403内(或者甚至处理核c1105内)的专用存储器空间,并且无法进行外部访问。可以针对udi微操作发出附加的微操作,以存储操作数或者将结果传送给可用的架构寄存器。存储器807可以以诸如静态随机存取存储器(sram)等的任意合适方式来实现。

图9是根据本发明的一个实施例实现的可编程逻辑元件801的示意框图。逻辑元件801包括查找表(lut)901、3个双输入复用器(mux)905、906和907、双输入加法器909以及时钟寄存器(或锁存器)911。可编程存储器807的一部分被示出为用于对逻辑元件801、任意所包括的杂项逻辑块803和一个或多个互连器805的一部分进行编程。如以上所说明的,可编程存储器807可以用于提供输入值、存储输出结果、以及/或者存储针对处理操作的多次迭代中的各次迭代所更新的中间值。

如图所示,使用编程信息pi来对存储器807进行编程。lut901被示出为利用存储器808中的相应lut值(lv)位进行编程的4x1lut。mux905、906和907各自具有由存储器807所存储的相应存储器位(被分别示出为存储器位m1、m2和m3)所控制的选择输入。将lut901的被示出为lo的输出提供给mux905的一个输入和寄存器911的输入,其中将寄存器911的输出提供给mux905的另一输入。将mux905的输出提供给mux906的一个输入和加法器909的一个输入。将加法器909的输出提供给mux906的另一输入,其中将mux906的输出提供给可编程互连器805的输入。存储器807包括可编程位v,其中将该可编程位v提供给mux907的一个输入,将mux907的另一输入耦接至可编程互连器805的输出,并且将mux907的输出提供给加法器909的另一输入。将加法器909的输出提供给mux906的另一输入。存储器807还可以用于对互连器805和任意杂项逻辑块803的相应部分进行编程。

所示的逻辑元件801仅是示例性的,并且替代版本可以根据特定配置被考虑。逻辑元件801可以被配置在位片粒度级以应对数据值的单个位。针对包括多个位的数据值,使用多个位片逻辑元件。例如,针对64位数据值,并行使用64个位片逻辑元件。

在操作中,利用lut901的lut数据值(lv)、mux905~907的选择输入m1~m3和提供给mux907的输入的可编程数据值v来对存储器807进行编程。从指令的操作数,从存储器807,或者从另一编程块来提供4个输入值s0~s3,以选择16个值中被编程到lut901中的值,其中在lut901的输出处提供所选择的值作为lo。对mux905进行编程,以直接提供lut901的lo输出或提供被寄存的版本。可以使用被寄存的版本为了编程操作的定时的目的而插入等待时间。对mux906进行编程,以直接提供mux905的输出、或者将作为输出所要提供的或者要提供给另一编程块的加法器909的输出提供给互连器805。加法器909将所选择的值与mux905的输出相加,其中所选择的值是编程值v或者是来自互连器805的输出(从另一输入或者从另一编程块所提供)的值。

图10是根据本发明的一个实施例实现的lut901的示意图。提供被组织为二进制mux树的1组双输入mux,以基于选择输入s3:s0(其中s0是最低有效位)而在16个输入值lv0~lv15之间进行选择。如先前所述,将lv0~lv15编程到存储器807中。将16个输入值lv0~lv15的各相邻对(lv0和lv1、lv2和lv3、…、等等)提供给8个双输入mux1001的相应输入对,其中这些双输入mux1001各自在其选择输入处接收s0。将mux1001的8个输出的各相邻对提供给4个双输入mux1003的相应输入对,其中这些双输入mux1003各自在其选择输入处接收s1。将mux1003的4个输出的各相邻对提供给2个双输入mux1005的相应输入对,其中这些双输入mux1005各自在其选择输入处接收s2。将mux1005的输出对提供给输出mux1007的输入对,其中输出mux1007在其选择输入处接收s3并且在其输出处提供lut输出lo。应该理解,图10所示的配置仅是本领域普通技术人员能够理解的很多合适lut实现其中之一。

图11是根据本发明的一个实施例的被示出为pi1101的编程信息pi的格式的简化框图。在这种情况下,pi1101可以包括资源声明(rsrc)1103,其中该rsrc1103用于表示为了实现编程的处理操作而在可编程逻辑403中所需的资源量。作为示例,资源声明1103可以表示为了完成编程所需的可编程区段的数量p。分配和编程逻辑405可以在对peu1101的编程期间读取资源声明1103以分配相应数量的可编程区段409。尽管可以使用较大的粒度,但这可能要求分配和编程逻辑405的附加逻辑来追踪可编程逻辑403的已编程部分。pi1101还可以包括等待时间声明1105,其中该等待时间声明1105用于表示已编程的处理操作的诸如为了完成所需的时钟周期的数量等的等待时间。在一个实施例中,udi加载器309可以读取等待时间声明1105从而构造或以其它方式选择适当的微操作操作码,其中该微操作操作码用于在发出到peu调度器225的情况下表示相同的等待时间。如先前所述,peu调度器225使用udi微操作所表示的等待时间信息来确定相应处理操作的等待时间。

pi1101还可以包括被称为位流的一系列的逻辑一(1)和零(0)。在一个实施例中,例如,响应于pgm输入的设置,分配和编程逻辑405将可编程区段409的所分配区段的可编程存储器(包括可编程存储器807和互连器805的相应可编程存储器)排成大的序列化移位寄存器,然后在位流中移位,直到在各个所分配区段中进行了完全加载为止。可以使用包括并行编程的可替代编程方法和格式。此外,可以将资源声明和等待时间声明设置在分配和编程逻辑405要进行读取的诸如开始或结束等的任意合适的位置处,以确保合适的编程。

图12是示出根据本发明的一个实施例的用于生成包含一个或多个udi和对诸如peu1101等的peu进行编程的相应编程信息的应用的第一方法的简化框图。诸如编程器等的应用生成器以任意合适的高级编程语言来编写应用源程序1201,其中这些高级编程语言是诸如c、c++、basic、cobol、fortran、pascal、ada、javascript等的编程语言,然而这并非限制性的。在这种情况下,应用生成器不需要特别地知道包含peu1101的处理器100的能力。应用源程序1201被提供给适合于将所选择的高级编程语言转换为处理器100能够执行的二进制应用文件1207的编译器1203。peu编程工具1205包含于编译器1203内或者链接至编译器1203。

在编译处理期间,编译器1203执行优化例程等,这些优化例程用于检查应用源程序1201的代码以判断是否可以利用代码优化。例如,优化例程判断代码中在执行期间消耗了大量时间的任意特定部分。编译器1203判断是否可以用一个或多个udi来替代应用源程序1201中的一个或多个指令以供目标处理器的peu执行。如果是,则编译器1203询问peu编程工具1205以将一个或多个udi和相应编程信息包含在二进制应用文件1207内。如果可以使用一个或多个udi来优化和/或加速执行,则编译器1203在二进制应用文件1207内生成定制二进制应用代码1209,其中如1211所示,定制二进制应用代码1209包含一个或多个udi和相应编程信息pi。定制二进制应用代码1209具有与先前描述的二进制app115同样的格式。

定制二进制应用代码1209可以被加载到系统存储器113中,并以先前针对二进制app115所述的相同方式来由处理器100执行。定制二进制应用代码1209包含一个或多个合适的ld_udi命令,以加载一个或多个udi并因此对peu1101进行编程。在一些配置或实现中,定制二进制应用代码1209可能无法适当执行。例如,peu编程工具1205或编译器1203的不正确或不兼容版本、或者处理器100的不兼容版本可能引起这种不正确操作。在所示实施例中,编译器1203还生成同样包含在二进制应用文件1207内的标准二进制应用代码1213。在定制二进制应用代码1209无法正确加载至处理器100中的情况下,代替地加载标准二进制应用代码1213。

在一个实施例中,定制二进制应用代码1209和标准二进制应用代码1213均是各自可以由兼容处理器单独或独立执行的完整版本。可选地,标准二进制应用代码1213可以被配置为在定制二进制应用代码1209无法加载的情况下包括插入码等以替代定制二进制应用代码1209的udi代码部分。因此,在这种情况下,标准二进制应用代码1213不是完整版本,而代替地补充定制二进制应用代码1209以在代码的不兼容udi部分上打补丁。

图13是示出根据本发明的一个实施例的用于生成包含一个或多个udi和对诸如peu1101等的peu进行编程的相应编程信息的应用的第二方法的简化框图。在这种情况下,应用生成器以所选格式来编写用于描述执行期间响应于相应udi的peu的处理操作的peu功能描述1301。可以以诸如legup、(catapulttechnology公司的)catapult、verilog、hdl(硬件描述语言)、寄存器控制逻辑(rcl)、寄存器传送逻辑(rtl)等的任意合适的硬件编程语言来编写该peu功能描述1301。将peu功能描述1301提供给相应的peu编程工具1303,其中该peu编程工具1303被配置为将peu功能描述1301转换为适合对peu1101进行编程的编程信息。

peu编程工具1303可以被配置为将peu功能描述1301转换为根据配置而不同的若干类型的输出中的任一种。在一个实施例中,peu编程工具1303输出编程信息1305的一个或多个块以用于编程器所配置的相应一个或多个udi。在另一实施例中,peu编程工具1303输出包括udi定义和相应编程信息1307的文件。在又一实施例中,peu编程工具1303输出包括udi定义和相应编程信息的一个或多个应用头部文件1309。

合适的编译器1313将peu编程工具1303的输出包含在应用源程序1310中,以生成二进制应用文件1207。作为示例,应用生成器将peu编程工具1303的输出作为udi信息1311包含在应用源程序1201中,以提供应用源程序1310。在这种情况下,应用源程序1201被udi信息1311修改或以其它方式补充,以创建应用源程序1310。udi信息1311可以包括udi加载命令、udi定义和相应编程信息,以实现一个或多个udi处理操作。然后,将修改或补充后的应用源程序1201提供给编译器1313,其中该编译器1313生成先前所述的二进制应用文件1207。

在另一情况下,应用生成器在编译原始未修改的应用源程序1201时将peu编程工具1303的输出链接至编译器1313,并且编译器1313利用peu编程工具1303的输出来补充来自应用源程序1201的信息以生成二进制应用文件1207。

图14是示出根据本发明的一个实施例的用于生成包含一个或多个udi和对诸如peu1101等的peu进行编程的相应编程信息的应用的另一方法的简化框图。在这种情况下,通过用于执行优化例程等的代码分析工具1403来处理诸如任意标准二进制应用代码1401等的编译后的可执行程序,其中该优化例程用于检查二进制代码并且判断是否可以利用代码优化。例如,优化例程识别代码中在执行期间消耗了大量时间的任意特定部分。代码分析工具1403判断是否可以用一个或多个udi来替代标准二进制应用代码1213中的一个或多个指令以供目标处理器的peu执行。如果是,则代码分析工具1403询问peu编程工具1205以将一个或多个udi和相应编程信息包含在(与二进制应用文件1207类似的)输出二进制文件1405内。如果可以使用一个或多个udi来优化和/或加速执行,则代码分析工具1403在二进制应用文件1405内生成相应的定制二进制应用代码1407,其中如1409所示,定制二进制应用代码1407包含一个或多个udi和相应编程信息。二进制应用文件1405也可以以与先前针对二进制应用文件1207所述的相同方式包括原始二进制应用代码1401。

存在可以被编程器或者以其它方式被编译器或代码分析器检测到的至少两种软件程序功能,其中硬件加速特别有利。第一软件程序功能是软件循环。在每次执行软件循环时,可以使该循环内的代码执行多次(甚至多达数千次或甚至数百万次),其中该循环在程序的执行寿命期间自身可以被执行很多次。替代软件循环中的大部分代码或全部代码可以在每次执行循环时节省许多时钟周期。在该上下文中,节省时钟周期是指降低每次循环执行的时钟周期的数量。这样,每次循环执行即便只是节省少许周期,这也可以在程序的执行寿命期间节省大量周期。

第二软件程序功能是可以经常被程序的主代码调用的子例程或过程等。在很多情况下,可以用单个udi来替代子例程的大部分甚至替代全部子例程,由此提高子例程执行的效率。分支到子例程以及从子例程分支,这可能导致执行期间显著的性能劣化。如果可以用单个udi来替代子例程,则可以完全消除与分支到子例程和从子例程分支相关联的无效率。编译器可以仅仅将子例程“inline”插入在调用子例程的任意位置处。udi不仅可以降低inline插入的大小,而且还可以更有效地进行相同功能。

除了分析静态二进制(例如,x86)以进行诸如图14所示等的udi构造和插入,还可以将相同技术应用于在动态编译器或虚拟机的情况下执行的运行时系统。例如,输入可以是在java虚拟机(jvm)中运行的java字节码程序,而不是x86二进制。由于jvm已经获取了字节码并且动态创建了要执行的x86代码,因此jvm必要地已经进行了要识别能用udi适时替代的代码段所需要的大多数分析。以与二进制分析工具可以优化静态x86二进制差不多的方式,在jvm动态地编译应用时,可以就地进行该分析和优化。另一相似示例是扩展javascript引擎(例如,googlev8)以优化javascript处理。另一示例是扩展pin或dynamorio或vmware,以在x86处理正在该环境下执行期间(而不是如静态重新编译器/优化器的情况下那样在执行之前)优化该x86处理。

图16是用根据本发明的一个实施例的udi来替代应用程序1601的例程中的标准代码以提供使用这些udi的替代应用程序1603的简化示例。应用程序1601包含“mainloop”(主循环),其中“mainloop”包括基于索引值“i”的if/then/else系列语句以实现安全哈希算法1(sha-1)。在该循环中,索引值“i”在0~79之间改变,并且根据i的值,可以将一组输入变量b、c和d转换为输出变量f和k。该循环中的后续步骤使用作为输入变量的值a、f、e、k和w[1]来设置变量“temp”。可以将输入和输出变量a、b、c、d、e、f和k存储或设置在架构寄存器中。

如图所示,根据sha-1哈希函数,依赖于索引i,基于输入值b、c和d来确定变量f,并且将变量k设置为不同的十六进制恒定值(其中恒定值前面的“0x”表示十六进制)。在索引i的范围为0~19或者20~39或者40~59或者60~79这四种情况中的各情况下,通过使用b、c和d作为输入变量值的布尔函数and、not、or和xor的组合来确定f。一旦确定出f和k,则如图所示,通过将变量a的旋转函数与输入值f、e、k和w[1]相加来确定变量“temp”。所示的旋转函数是leftrotate5,其中在leftrotate5中,将寄存器中所存储的二进制变量a左旋转5次以实现期望值。

针对四个if/then/else情况各自的布尔运算相对简单。在索引值i的范围为0~19的第一情况中,通过如下运算来确定f:将b反相(notb),将反相后的变量b与d进行逻辑and,然后将该结果与逻辑上进行了and后的变量b和c进行逻辑or。应该理解,尽管布尔运算相对简单,但可能需要多个微操作来确定输出变量f。例如,第一微操作可以用于确定“bandc”并且临时存储结果,称为临时变量x。第二微操作可以用于确定“notbandd”并且临时存储结果,称为临时变量z。最后,第三微操作可以用于对临时变量x和z进行逻辑or以输出变量f的结果。其余的各情况相似。不同的变量k可以被临时存储并且可以不需要单独的微操作。一旦确定出f和k,则可能需要第一微操作来使变量a左旋转,然后可能需要至少一个附加微操作来对变量a(旋转后)、f、e、k和w[1]进行相加来实现temp的最终结果。

总之,上述四种情况中的各情况和最终temp变量确定可能需要至少4个微操作,以基于索引值i针对各次迭代在标准配置中确定变量temp。

代替地,利用被分别示出为udi1、udi2、udi3和udi4这4个相对简单的udi中的相应一个来替代四种if/then/else情况中的各情况。这些指令udi1~udi4各自具有变量b、c和d作为输入并且具有变量f和k作为输出。利用被示出为udi5的单个udi来替代temp的确定。如替代程序1603所示,通过单个udi替代指令来进行各个if/then/else情况,并且最终temp确定是另一个udi指令,即针对任何给定迭代总共两个udi指令。在多数配置中,用相应用户定义指令替代x86布尔微操作,这加速了操作,使得通过编程的处理操作以较少时间来进行相同功能。

图17是用根据本发明的另一实施例的udi替代应用程序1601的例程中的标准代码以提供使用这些udi的替代应用程序1703的简化示例。初始应用程序1601具有相同的4个if/then/else情况和temp确定。然而,在这种情况下,用被示出为udi0的单个udi来替代整个if/then/else代码。索引值i作为另一输入变量而包含在udi0指令中,由此得到用于接收i、b、c和d作为输入变量并且提供f和k作为输出变量的udi0(i,b,c,d,f,k)。以相同的方式来提供指令udi5以确定循环中的变量temp。

替代应用程序1703所使用的指令udi0的处理操作比替代应用程序1603的指令udi1~udi4的任意处理操作稍微更复杂,但是与指令udi1~udi4的组合相比并不是非常地更复杂。在一个实施例中,例如,针对4个if/then/else情况各自进行编程的处理操作如果并非完全相同也可能大致相似。对于单个指令udi0,附加的已编程处理操作接收索引值i以从4个单独情况的4个编程输出中进行选择以提供最终结果。附加指令udi5与替代应用程序1603的相同。

应该理解,针对循环的各次迭代,通过peu来仅执行udi0和udi5这两个udi。此外,尽管并非显而易见,但替代应用程序1703相对于替代应用程序1603的实质优点在于完全消除了循环内核的条件分支。单个udi0指令指示peu将所有i个条件输入并行组合,其中将中间结果一起复用以提供单个最终结果。这样,应该理解,与初始应用程序1601以及替代应用程序1603相比,替代应用程序1703提供了显著效率提高和加速。

已经给出了前述描述以使本领域普通技术人员能够在特定应用的上下文及其要求中所提供的那样实现和使用本发明。虽然已经参考本发明的某些优选版本相当详细地描述了本发明,但是其它版本和变形是可能的并被预期。对优选实施例的各种修改对于本领域技术人员将是显而易见的,并且本文设定的一般原理可以应用于其它实施例。例如,本文所描述的电路可以以包括逻辑装置或电路等的任何合适的方式来实现。

本领域技术人员应当理解,可以容易地使用所公开的概念和具体实施例作为设计或修改用于在不脱离本发明的精神和范围的情况下实现本发明的相同目的的其它结构的基础。因此,本发明并不意图被限制于本文所示出以及所描述的特定实施例,而是符合与本文公开的原理和新颖特征一致的最宽范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1