用于异构多核心系统的动态核心选择的制作方法

文档序号:6484567阅读:161来源:国知局
用于异构多核心系统的动态核心选择的制作方法
【专利摘要】可以通过在第一处理核心上执行程序代码来在异构多核心处理系统上动态切换核心。可以告知第二处理核心上电。可以收集执行程序代码的第一处理核心的第一性能指标。在第一性能指标好于先前确定的核心性能指标时,可以告知第二处理核心断电,且可以在第一处理核心上继续程序代码的执行。在第一性能指标劣于先前确定的核心性能指标时,可以把程序代码的执行从第一处理核心切换到第二处理核心。
【专利说明】用于异构多核心系统的动态核心选择
[0001]领域
[0002]本发明涉及处理器的领域,尤其涉及优化功率和性能效率。
[0003]背景
[0004]半导体处理和逻辑设计的进展已经允许可以出现在集成电路设备上的逻辑的量的增加。结果,计算机系统配置已经从系统中的单个或多个集成电路进化到出现在单个集成电路上的多核心、多硬件线程和多逻辑处理器。处理器或集成电路通常包括单个物理处理器管芯,其中处理器管芯可以包括任何数量的核心、硬件线程或逻辑处理器。
[0005]集成电路上的处理元件——核心、硬件线程和逻辑处理器——的不断增加的数量允许并行完成更多任务。然而,全部采用无序核心的处理器在一些环境下可能引起功率低效和/或性能低效。结果,已经开发了一些硬件-软件协同设计的系统具有以便应对功率-性能效率问题。在该系统中,可以利用广泛、简单的有序处理器,同时软件优化并调度程序以便在有序硬件上高效运行。
[0006]然而,硬件-软件协同设计系统通常与两种不利影响相关联:(I)利用二进制转换器的代码的转换和/或优化可能减慢具有短运行任务和小响应时间约束的一些应用(二进制转换弱项);以及(2)对于更适于并行执行的一些类型的程序,有序处理器可能执行得不好(有序弱项)。
[0007]附图简述
[0008]作为示例阐释本发明,且本发明不预期受附图中的各图限制。
[0009]图1阐释包括两个异构核心的处理器的实施例。
[0010]图2阐释包括本机核心、软件管理核心和代码分发模块的处理器的实施例。
[0011]图3阐释用于在各核心中分发代码以便取得最大性能和最大功率节省的处理器的实施例。
[0012]图4阐释在无序核心和有序核心当中分发代码以便取得最大性能和功率节省的方法的流程图的实施例。
[0013]图5阐释在无序核心和有序核心当中分发代码以便取得最大性能和功率节省的方法的流程图的另一实施例。
[0014]图6阐释根据本发明的实施例的核心切换操作和开销。
[0015]详细描述
[0016]异构计算策略用于集成多个核心,其中,每一核心执行某些代码是高效的,但执行某些其他代码却是低效的。运行时间软件(SW)和硬件(HW)协同地把输入程序分块成适于不同核心的代码片段,并在最适合的核心上执行它们中的每一个,同时把其他核心置于低功率状态,以便以低功率和能量消耗取得高性能。这样的系统的一个示例由至少一个宽有序核心(wide-1n-order core)和至少一个窄无序核心(narrow out-of-order core)组成,且根据本发明的实施例,这种异构系统可以取得改善的无序核心性能,同时消耗一部分的能量和功率。这种类型的计算系统的主要挑战是在运行时间中快速地标识程序行为改变并高效地切换到适当核心。本发明的各实施例使用运行时间软件和/或硬件来自动地把相同程序中的不同代码片段的执行切换到最合适的核心,且显著地加速单个线程化程序的性倉泛。
[0017]在下列描述中,陈述了众多特定细节以便提供对本发明的透彻理解,例如示例特定类型的处理器核心、特定的处理器配置、特定的热代码区域标识算法、用于存储经转换/经优化的代码的特定结构、在硬件/软件之间的任务的特定分割、特定的处理器单元/逻辑等等。然而,本领域中的技术人员明显看出,实践本发明不需要使用这些特定的细节。在其他实例中,为了避免不必要地模糊本发明,没有详细描述广为人知的组件或方法,例如特定的和替代的处理器体系结构、用于所描述的算法的特定逻辑电路/代码、特定的代码实现、特定的二进制转换细节和微处理器的其他特定操作细节。
[0018]在一种实施例中,在此描述的方法和装置用于实现具有软件管理核心的本机核心以便取得最大性能和功率节省。具体地,主要参考无序核心和有序的协同设计核心来讨论在核心之间的协作。然而,在此描述装置和方法不限于此,这是由于可以在异构核心之间的任何代码分发中实现它们。例如,可以与实现唯一的指令集体系结构(ISA)的两个无序核心一起利用在此描述的代码分发方法和装置。此外,常常把在这样的核心之间的协作讨论为在硬件机制和代码/软件之间的拆分。然而,可以利用硬件、软件和/或固件的任何混合使用或独占使用来实现下面描述的方法和装置。
[0019]参见图1,阐释了包括多个核心的处理器的实施例。处理器100包括任何处理器,例如微处理器、嵌入式处理器、数字信号处理器(DSP)、网络处理器或执行代码的其他设备。
在一种实施例中,处理器100包括至少两个不同类型的核心-核心101和102。然而,处
理器100可以包括任何数量的处理元件。
[0020]在一种实施例中,处理元件是指能够保持处理器的状态例如执行状态或体系结构状态等的线程单元、线程槽、进程单元、上下文、逻辑处理器、硬件线程、核心和/或任何其他元素。换句话说,在一种实施例中,处理元件是指能够独立地与代码例如软件线程、操作系统、应用或其他代码相关联的任何硬件。物理处理器通常是指集成电路,其潜在地包括任何数量的其他处理元件,例如核心或硬件线程。
[0021]核心常常是指位于能够保持独立的体系结构状态的集成电路上的逻辑,其中,每一独立地保持的体系结构状态与至少一些专用执行资源相关联。与核心相反,硬件线程通常是指位于能够保持独立体系结构状态的集成电路上的任何逻辑,其中,独立地保持的体系结构状态共享对执行资源的访问。正如可见的,当某些资源被共享且其他是体系结构状态专用时,在硬件线程和核心的命名之间的界线重叠。然而,通常核心和硬件线程被操作系统看作是单独的逻辑处理器,其中操作系统可以单独地调度在每一逻辑处理器上的操作。
[0022]正如图1中所阐释的,物理处理器100包括两个核心,即核心101和核心102。在这里,核心101和核心102被看作是异构核心,即具有不同的配置、功能单元和/或逻辑的核心。在一种实施例中,核心101包括无序处理器核心,而核心102包括有序处理器核心。然而,核心101和核心102可以单独选自任何类型的核心。然而为了继续讨论,下面进一步详细描述图1中阐释的功能单元。
[0023]正如所叙述的,核心101包括两个硬件线程IOla和101b,它们也可以被称为硬件线程槽IOla和101b。作为对比,核心102包括一个硬件线程102a。因此,在一种实施例中,诸如操作系统等的软件实体潜在地把处理器100看作是三个分离的处理器,即能够并发地执行三个软件线程的三个逻辑处理器或处理元件。替代地,软件实体可以仅把处理器100看作是具有两个分离的处理器一线程槽IOla和101b,同时所描述的代码分发机制管理代码在核心102上的执行。
[0024]第一线程与体系结构状态寄存器IOla相关联,第二线程与体系结构状态寄存器IOlb相关联,且第三线程可以与体系结构状态寄存器102a相关联。正如所阐释的,在体系结构状态寄存器IOlb中复制体系结构状态寄存器101a,因此能够为逻辑处理器IOla和逻辑处理器IOlb存储各个体系结构状态/上下文。体系结构状态寄存器102a可以与寄存器IOlaUOlb相同。或者相反,寄存器102a对核心102的体系结构来说可以是唯一地。在核心101中,也可以为线程IOla和IOlb复制其他较小的资源,例如重命名分配器逻辑130中的指令指针和重命名逻辑。可以通过划分共享一些资源,例如指令转换缓冲器(ITLB) 120、加载/存储缓冲器和队列、重排序/退役单元135中的重排序缓冲器。诸如通用内部寄存器、页表基址寄存器、低级数据高速缓存和数据TLB150、执行单元140和无序单元135的各部分等的其他资源可能完全共享。
[0025]处理器100常常包括其他资源,这些资源可以完全共享、通过划分共享或由处理元件专用。在图1中,阐释了具有处理器的说明性的逻辑单元/资源的纯粹示例性的处理器的实施例。注意,处理器可以包括或省略这些功能单元中的任何单元,并且包括未阐述的任何其他已知的功能单元、逻辑或固件。正如所阐释的,核心101被阐释为简化无序(000)处理器核心。000核心包括分支目标缓冲器(BTB)120以便预测要执行/采取的分支,并包括指令转换缓冲器(1-TLB) 120以便存储指令的地址转换条目。
[0026]核心101还包括被耦合到提取单元120的解码模块125以便解码所提取的元素。在一种实施例中,提取逻辑包括分别与线程槽IOlaUOlb相关联的单个定序器。通常核心101与第一指令集体系结构(ISA)相关联,该第一指令集体系结构定义/指定可在处理器100上执行的指令。在这里,属于第一 ISA的一部分的机器代码指令常常包括一部分指令(被称为操作码),其引用/指定要执行的指令或操作。解码逻辑125包括从它们的操作码识别这些指令并在管线上传送经解码的指令的电路以供按第一 ISA定义的那样进行处理。
[0027]在一个示例中,分配器和重命名器块130包括用以保存诸如寄存器堆等资源以便存储指令处理结果的分配器。然而,线程IOla和IOlb潜在地能够无序执行,其中分配器和重命名器块130也保存诸如重排序缓冲器等的其他资源,以便跟踪指令状态。单元130也可以包括寄存器重命名器,以便把程序/指令引用寄存器重命名为处理器100内部的其他寄存器。重排序/退役单元135包括诸如上面提到的重排序缓冲器、加载缓冲器和存储缓冲器等的组件,以支持无序执行和稍后无序执行的指令的有序退役。
[0028]在一种实施例中,调度程序和执行单元框140包括调度程序单元以便调度执行单元上的指令/操作。例如,在具有可用浮点执行单元的执行单元的端口上调度浮点指令。也包括与执行单元相关联的寄存器堆,以便存储信息指令处理结果。示例性执行单元包括浮点执行单元、整数执行单元、跳转执行单元、负载执行单元、存储执行单元和其他已知的执行单元。
[0029]低级数据高速缓存和数据地址转换查找/侧缓冲器(D-TLB) 150被耦合到执行单元140。数据高速缓存用于存储诸如数据操作数等的最近使用/操作的元素,这潜在地被保存在存储器一致性状态中。D-TLB用于把近来的虚拟/线性存储到物理地址转换。作为特定的示例,处理器可以包括页面表结构以便把物理内存分成多个虚拟页面。
[0030]如上面说明的,在一种实施例中,核心102包括有序的协同设计核心。结果,图1阐释有序核心的简化管线。这一管线包括提取单元121、解码单元126、执行单元141和低级数据高速缓存151。这些单元可以以与核心101中的相应单元相似的方式工作。然而,在有序核心中,以程序次序执行指令/操作,而不是如在核心101中的潜在无序执行。在一个示例中,无序核心101被称为本机核心,而有序核心102被称为协同设计核心。替代地,有序核心102是本机核心且无序核心101是协同设计核心。
[0031]在这里,核心101和102共享对更高级别的或进一步的高速缓存110的访问,高速缓存110用于高速缓存近来提取的元素。注意,更高级别或进一步是指从执行单元增加或更远路径的高速缓存级别。在一种实施例中,更高级别的高速缓存110是末级数据高速缓存一处理器100上存储器分层中的最后的高速缓存一例如第二级或第三级数据高速缓存。然而,更高级别的高速缓存110不限于此,这是由于它可以与指令高速缓存相关联或包
括指令高速缓存。踪迹高速缓存(trace cache)-一种类型的指令高速缓存-可以替
代地被耦合在解码器125之后以便存储近来解码的踪迹。
[0032]在所叙述的配置中,处理器100也包括链路接口模块105,以便与诸如系统存储器175、芯片组、北桥或其他集成电路(包括诸如“片上系统”(SOC)等的单片集成电路实现)等的外置于处理器100的设备通信。存储器175可以是处理器100专用的,或者与系统中的其他设备共享。各类型的存储器175的常见示例包括动态随机存取存储器(DRAM)、静态RAM(SRAM)、非易失性存储器(NV存储器)和其他已知的存储设备。
[0033]在一种实施例中,基于最大化性能和功率在核心101和102之间分发代码。例如,标识代码区域以使得在两个核心101、102中的一个上执行得更好。结果,当遇到/检测到这样的代码区域中的一个时,把该代码部分分发到适当的核心。这样的区域的标识可以由硬件、软件或其组合静态地(在代码执行之前,例如通过程序剖析分析)或动态地(在代码执行期间)进行。
[0034]在动态方法的一个说明性示例中,基于其性能、功率节省、本机ISA、任何其他已知的处理考虑或其组合,可以把诸如核心101之类的一个处理器核心选择为默认核心以执行代码。然后,标识在核心101上执行得差或在核心102上执行较好的默认代码的区域。在随后遇到那些已标识的代码段时,把它们分发到核心102以便执行。注意,取决于那些区域或那些区域的并行、并发执行以及其他代码在核心102上执行的结果,在核心102上执行那些区域执行可以包括推测的、提前运行的执行以便预热核心101、在核心102上串行执行那些区域以及在核心101上执行其他区域执行。
[0035]在静态方法的示例中,编译器或使用者可以标识在一个核心或其他上执行较好的代码段,例如借助于指令或界限(demarcation)。在这里,核心101执行代码直到遇到这样的指令。或者响应于来自核心102的监控,或者通过核心102的单次发起(触发),然后基于所遇到的指令在核心102上执行已标识的代码段。
[0036]无论是动态地还是静态地进行把代码段标识为在一个核心或另一个上运行较好,在一些实施例中,转换和/或优化本机代码以便在另一核心上运行。例如,假设核心101包括识别第一 ISA类型解码逻辑125,且核心102包括识别第二 ISA类型的解码逻辑126。在这种情况中,如果第一 ISA类型的代码区域要在核心102上执行,则把该代码区域转换成第二 ISA类型以便在核心102上执行。注意,在ISA类型之间转换纯粹是说明性的。相反,可以再次优化要在核心101上执行的经无序优化的代码以利于有序核心102的执行。在这种场景中,核心102包括与核心101的同一 ISA相同的ISA,或包括与核心101相同的ISA的子集。然而,对代码执行优化,以确保它更高效地运行简单宽有序核心上。
[0037]可以在硬件、固件、软件或其组合中实现在核心101和核心102之间的协作以便高效地分发代码。进一步检查上面关于标识代码区域的动态方法的示例以便阐释协作机制的示例性实施例。在该示例中,优化以本机格式的程序代码以便在无序核心101上执行。在代码区域或程序代码执行期间,可以利用与核心101和/或核心102相关联的监控硬件来判断与核心101执行代码区域相关联的性能。替代地,诸如软件、OS代码、微代码或其他代码等的代码可以在核心102上执行,以判断/监控核心101执行代码区域时的性能。如果判断代码区域将在核心102上执行较好,那么,可以利用硬件、软件、固件或其组合来转换和/或优化要在核心102上执行的代码区域。
[0038]结果,当核心101再次遇到代码区域一指令指针引用代码区域,提取或解码标识该代码区域的标识符指令,或检测到标识代码区域的另一方式一然后,在核心102上执行代码区域的经转换/优化的版本。在一种实施例中,在核心102上执行代码区域期间,核心101可以并发地执行其他代码区域以便提高整体程序执行性能。注意,并发的或并行的执行也可以包括在核心101、102上执行分离的软件线程。
[0039]相反,可以在核心101、102上管线化线程。作为这种场景的示例,假设两个软件线程中的每一个包括多个阶段(stage)的代码(热、冷等等)。在这里,来自第一线程的冷代码可以在核心101上执行,且当遇到热区域时,经转换的热区域在核心102上执行。在核心102上执行经转换的热代码区域期间,来自第二线程冷代码可以在核心101上执行。在核心102上,在第一经转换的热代码的执行完成时,然后,来自第二软件线程的另一热区域可以开始执行。如从该示例中可见的,代码的各阶段可以在每一核心上交错,得到管线化类型的执行。在另一实施例中,代码可以相对于两个核心顺序地执行,例如代码区域在核心101上执行,已标识的代码区域在核心102上执行,且然后随后另一代码区域在核心101上执行。
[0040]另外,即使在最初标识在核心102上执行代码区域时,也可以监控该执行的性能。然后,在确定哪个核心最适于执行该代码区域以便取得最大性能和功率节省时,可以考虑两个核心上的性能。例如,如果代码区域被标识为作为经转换代码而在核心102上执行,但核心102上的性能低于核心101上的性能(或核心102上的性能增益并不胜过核心201上的执行的功率节省),那么,在随后遭遇中该代码可以被重新分发到核心101。
[0041]图1阐释示例性处理器的抽象的逻辑视图,带有不同的模块、单元和/或逻辑的表示。然而,注意,利用在此描述的方法和装置的处理器不必包括所阐释单元。而且,处理器可以省略所示出的单元中的一些或全部。此外,上面的讨论中的许多已经参考了无序处理器核心和有序处理器核心。然而,如前述的,两个处理器核心可以是任何版本的异构核心,例如本机核心和软件管理核心。另外,图1仅叙述两个核心;然而,处理器可以包括任何数量的核心,例如相同类型的多个核心,以及类型不同的多于两个的核心。
[0042]图1也阐释以点对点方式与到外部存储器控制器(控制器中枢170)的接口耦合的处理器的实施例。然而,许多当前的处理器已经开始包括带有环配置以便互连多个核心的处理器上的存储器接口模块——片上模块,以及共享的高速缓存和其他接口。尽管未作阐释,在一种实施例中,处理器100包括环互连耦合核心、高速缓存和存储器控制器组件。
[0043]在这里,利用缓存代理来管理一片物理分布式高速缓存。作为示例,每一高速缓存组件用于管理用于已配置的核心的一片高速缓存,该核心即高速缓存代理出于管理一片分布式高速缓存的目的而与其关联的核心。非常类似于高速缓存代理处理与高速缓存片互连并连接的环上的流量,核心代理/组件用于处理流量并与核心连接。另外,环互连可以耦合存储器控制器接口逻辑(MCIL)和/或其他控制器以便与其他模块、这样的存储器和/或图形处理器连接。
[0044]参见图2,阐释在两个核心当中分发代码的代码分发模块的实施例。在一种实施例中,核心201、202是异构核心。例如,核心201是适于不按原始程序次序执行代码的无序(000)核心,且核心202是适于按程序次序执行代码的有序(或串行核心)。其他核心类型的非详尽示例性列表包括:本机核心、非本机核心、软件管理核心、本机ISA核心、经转换ISA核心、协同设计核心、推测执行核心和非推测执行核心。
[0045]在一种实施例中,代码分发模块210用于基于最大化性能和功率节省在核心201和202之间分发代码。在此所使用的模块可以是指硬件、软件、固件或其组合。另外,模块、单元或逻辑可以被集中在核心或处理器中,也可以四处分布。例如,代码分发模块210可以包括分发代码,例如容纳在与核心201、核心202、处理器200或包括处理器200的系统相关联的存储中的微代码或软件。在这里,当被执行时,分发代码用于执行代码分发。相反,代码分发进程可以由硬件、软件、固件或其组合管理。
[0046]在一种实施例中,代码分发模块210用于把程序代码的执行从一个核心动态地切换到另一个核心。下面参考图4和图5更详细地讨论动态切换程序代码。然而,作为这一部分讨论的说明性示例,程序代码可以包括用处理元件执行的任何代码,例如二进制或机器代码。热代码部分可以是指基于诸如功率、性能、热、其他已知的处理器指标或其组合的考虑,相比其他核心更适于在一个核心上执行的一部分代码。在这里,假定核心201是用于程序代码的本机执行的默认核心,那么,热程序代码部分的标识包括确定更适于在核心202上执行的一部分代码。在其中核心202是000核心且核心202是有序核心的实施例中,那么,热代码部分可以是指更适于在串行核心202上执行的程序代码的热点,串行核心202潜在地具有用于执行高度重复的部分的更多可用资源。作为示例,热代码部分由该部分代码的重复模式或诸如指令计数或周期计数等的某种其他已知的指标来标识。具有高重复率和可预测的等待时间模式的一部分代码常常可以被优化为在有序核心上更高效地执行。本质上,在这一示例中,冷代码(低重复率)被分发到本机000核心101,而热代码(高重复率)被分发到软件管理的有序核心102。
[0047]可以静态地、动态地或以静态和动态组合地标识热代码部分。在第一情况中,编译器或使用者可以确定一部分程序代码是热代码。在这里,热代码标识符指令可以把一部分代码界定为热的,即,要在核心202上执行而不是在核心101上执行。在一种实施例中,核心201中的解码逻辑适于从程序代码解码热代码标识符指令,这是为了标识程序热代码部分。这样的指令的提取或解码可以触发核心202上的热代码部分的转换和/或执行。在这一示例中,代码分发模块210包括检测热代码检测指令的解码逻辑。并且,模块210也可以包括执行转换/优化以及在核心202上执行热代码其他硬件和/或软件。替代地,可以预先优化/转换热代码部分以便在核心202上执行。[0048]在另一示例中,代码分发模块210动态地(在执行期间)标识程序代码中的热点/区域。在一种实施例中,利用核心201和/或核心202中所包括的硬件来剖析诸如核心201之类的核心上的程序代码的执行。基于剖析的特性——与执行相关联的功率和/或性能指标一可以把程序代码的区域标识为热代码。类似于硬件的操作,可以在诸如核心202之类的一个核心上执行监控代码,以执行正在诸如核心201之类的其他核心上执行的程序代码的监控/剖析。注意,这样的监控代码可以是被保存在核心内、在处理器200内的存储结构中或者在包括处理器200的系统中的代码。例如,监控代码可以是保存在核心201、核心202或处理器200的存储结构中的微代码或其他代码。并且,监控代码可以由传统的执行单元以及处理器200上的其他固件或逻辑执行。
[0049]作为又一个示例,作为提示进行热代码的静态标识。但是程序代码执行的动态剖析可以忽略把代码的区域的静态标识为热的;这种类型的静态标识常常被称为在确定哪个核心适用于代码分发时动态剖析可以考虑的编译器或使用者提示。此外,作为动态剖析的本质,把代码区域标识为热并不把该部分的代码限定为总是被标识为热的。例如,假设程序代码在无序核心201上执行。在核心202上执行的监控代码监控核心201执行一部分程序代码的性能水平。基于该实现,如果确定核心201上的性能相比于它在核心202上执行的性能足够更低,和/或核心201上的代码部分的重复模式足够高以被预测为隐藏核心开销;那么,该代码部分被标识为热的。在转换和/或优化之后,代码部分的经转换版本在核心202上执行。类似于核心201上的执行的监控,可以在核心202上监控代码的经转换版本的执行,例如通过执行性能监控代码。如果在核心202上性能低于在核心201上,那么,把代码部分标识为热的可以动态地反转(该部分热代码可以被重新标记为冷代码)。
[0050]一旦代码的部分、点或区域被标识为热的,在一种实施例中,代码分发模块210就优化和/或转换热代码部分以便获得经优化/经转换的热代码。在一种实施例中,诸如二进制转换代码等的转换和/或优化代码被保存在核心202的存储逻辑中。作为示例,二进制转换代码可以是保存在核心202中的微代码的一部分。当被执行时,转换/优化代码转换/优化该代码部分以供在核心202上执行。在一种实施例中,核心201、202可以识别相同的ISA或其子集,其中转换/优化仅仅转换/优化代码以便在核心202上更高效地执行。在另一实施例中,核心201、202识别不同的ISA,其中转换包括把代码区域从可由核心201识别的一个ISA转换到可由202识别的另一 ISA。尽管参考转换/优化代码的执行讨论了转换/优化,但可以利用用于转换/优化代码的任何已知机制,甚至是通过专用硬件。
[0051 ] 在一种实施例中,一旦核心201遇到已标识部分的热代码,就在核心202上执行该热代码(其经转换版本)。可以利用确定何时遇到热代码区域的任何已知的触发器。一些高级示例包括:遇到/引用与代码区域相关联的指令地址,提取/解码/调度/执行把代码部分标识为热代码的指令,提取/解码/调度/执行指示热代码的经转换版本应在另一核心上执行的指令,来自指示已经遇到热代码区域的监控的外部触发器。
[0052]作为说明性示例,代码分发模块210包括以硬件、软件或其组合实现的监控模块。当监控模块标识代码的热区域或把该热区域转换成经转换区域时,监控模块寄存与代码的热区域相关联的指令地址。这种寄存可以包括把指令地址与代码的经转换区域的位置关联起来。然后,当指令指针(程序计数器)随后引用指令地址时,从已寄存的指令地址确定已经遇到热代码区域。注意,在这里可以使用任何形式的检测,例如同步或异步中断形式的应对遭遇事件。另外,硬件、微代码和/或固件能够直接地应对热代码部分的遭遇而无需类似中断的处理,即处理机(handler)不服务于触发器事件。注意,核心101和102可以共享诸如映射结构之类的某些硬件结构,以便标识被寄存为热代码的地址。
[0053]响应于在核心201上遇到热代码部分,在核心202上执行经转换和/或经优化版本的热代码部分。不考虑在核心201上如何标识和遇到热代码部分,可以使用用于实现在另一核心上执行代码的任何已知方法。在一种实施例中,利用协作模块来实现这样的执行。例如,核心201、202可以共享某些硬件结构和/或包括通信信道来共享信息。作为一个示例,核心101、102可以共享数据高速缓存,因此当把执行从核心201迁移到核心202时,数据并非物理上移动,而是相反,已经驻留在所共享的高速缓存中。类似地,在一种实施例中,在核心201和202之间共享诸如影子寄存器堆等的寄存器堆,因此寄存器状态(上下文)不必从一个核心迁移到另一核心。不使用寄存器堆,作为替代,可以利用高速互连来把上下文或其部分从一个核心物理上迁移到另一核心。另外,少见的是,可以利用传输软件来执行这样的传输。
[0054]作为一个示例,把进入热代码部分的输入值从核心201传输到核心202以便支持在核心202上执行热代码部分。在执行之后,然后,把输出值传输回到核心201。在一种实施例中,仅传输来自代码段的已标识的输入/输出值,即部分上下文切换。注意,这样的输入值可以由使用者(软件/编译器)和/或由硬件/固件算法标识。在这里,直接访问硬件可以适于从核心201中的寄存器、缓冲器或其他结构读取输入值并把它们写到核心202。反之,可以利用相同的或不同的硬件来从核心202读取值并把它们写到核心201。然而,在标识这样的值变得太过麻烦的场合,可以执行整体上下文切换、复制或共享以便在核心201和核心202之间提供值。
[0055]接下来参见图3,叙述了用于在核心当中分发代码以便取得最大性能和功率节省的处理器的实施例。正如上面,处理器300包括两个处理器核心;其中的每一个属于不同的核心类型。作为一个示例,核心301是本机的无序(000)处理器核心,而核心302是软件管理的有序处理器核心。核心301和核心302可以识别不同的ISA类型,但不要求它们这样做。事实上,核心302可以识别核心301的ISA的子集。或者,核心302可以包括与核心301的ISA部分地重叠的单独的ISA。如上面所描述的,核心或处理器常常通过核心或处理器中的解码硬件/软件与ISA—所识别的指令的定义一相关联。
[0056]在一种实施例中,监控模块305用于监控在本机的000核心301上执行本机程序代码325 ;通过这种监控,模块305用于标识程序代码325的热部分/区域327。监控模块可以由硬件、软件或其组合组成。在一种实施例中,监控模块305包括监控执行的硬件。作为一个示例,硬件包括微体系结构的和/或体系结构的钩子(hook),例如度量退役推出(pushout)的退役推出标签/计数器、计数指令的数量的指令计数器、度量总体执行长度和/或时间的总体踪迹执行测量逻辑、计数代码部分被执行多少次的重复计数器等等,以确定在代码325执行期间的性能/功率指标。这种类型的硬件可以位于集成电路/处理器的任何部分,例如在无序核心301内、在有序核心302内以及不被包括在任一 000处理器核心301或有序处理器核心302内的集成电路的非关联部分中。
[0057]在另一实施例中,监控模块305包括诸如监控代码等的软件,在被执行时,该软件用于监控程序代码325的执行并标识程序代码325的热区域327。作为说明性示例,处理器300包括诸如只读存储器(ROM)结构、可编程逻辑等等的存储结构,以便保存在被执行时引起监控发生的代码、微代码或机器代码。然而,监控代码可以被存储在与核心301、302相关联的任何机器可读的介质中。注意,术语执行的使用不仅仅限于由传统的执行单元执行,而是可以是指由与处理器300相关联的其他硬件或可编程逻辑执行,例如借助于固件执行微代码。在这里,所执行的监控代码可以执行可由硬件度量的重复、功率和性能指标的相同监控。
[0058]作为一个示例,监控硬件和/或代码跟踪/确定程序代码的代码部分的重复模式。作为简单的示例,数据结构把诸如指令地址之类的到代码部分(代码区域327)的引用与指令地址/代码部分已经在核心301上执行的次数的计数关联起来。注意,计数可以与绝对计数(总计数)或时间计数(在一定量的时间内的计数)相关联。
[0059]在一种实施例中,监控模块305适于标识/检测程序代码325的热部分327。在一个示例中,监控模块305用于度量程序代码325的热部分327在000处理器核心301上执行期间的一个或多个性能指标。并且,模块305用于响应于000处理器核心上的性能指标低于阈值而标识程序代码325的热部分327。性能指标的示例的非详尽的说明性列表包括:指令退役推出、执行的指令的数量、执行代码区域的时间量、遇到/执行的代码区域的次数、在代码区域执行期间消耗的功率量、在代码区域执行期间耗费在不同功率状态的时间量、在代码片段执行期间的热密度等等。
[0060]使用以上示例中的一个,假设000核心301正在执行程序代码325。执行监控代码以确定在核心301上执行程序代码325的区域的次数。当该计数满足或超过阈值时,在一种实施例中,监控模块305把该区域327标识/确定为热代码。如果使用了阈值3,那么,当在核心302上执行的监控代码检测到热区域327在核心301上被重复执行第3次时,区域327被标识为代码的热区域。可以推断确定重复模式的特定示例以便明白类似过程——计数、与阈值比较并标识——可以用于任何所测量的性能指标。此外,确定性能指标不限于简单的计数,而是可以包括用于在核心、处理器或计算机系统中确定执行或功率节省性能的任何已知算法。
[0061]然而,标识在程序代码325内的热区域327不限于动态性能监控。相反,可以利用编译器或静态程序分析来判断可能更适于在有序核心302上执行的代码段。例如,假设程序分析揭示了热区域327可能被重复执行多次。响应于这一发现,编译器或使用者可以插入把一部分代码标识为热代码的指令或界限。因此,当核心301的解码器遇到这样的指令时,它们识别出区域327是要在核心302上执行的热代码。注意,在一些实施例中,使用者可以无需深入的程序分析就基于它们对程序的了解标识这样的代码区域。
[0062]在一种实施例中,响应于把区域327标识为热的,优化/转换模块310优化或转换代码327以便获得经优化的热代码304。类似于监控模块305的操作,优化模块310可以以硬件、软件、固件或其组合实现。例如,转换和/或优化代码可以被存储在与核心302、核心301或处理器300相关联的结构中。作为阐释,二进制转换代码被存储在与核心302相关联的固件中。并且,执行二进制转换代码以便把热区域327从用于核心301的本机格式转换成用于核心302的格式。注意,转换可以是在ISA或其他格式之间,而优化可以包括用于优化代码以供执行的任何已知方法,例如用于把代码从000核心301上的并行执行优化到核心302上的串行执行的已知技术,反之亦然。[0063]然而,使用固件中的二进制转换代码纯粹是说明性的,这是由于诸如核心302中的微代码或系统存储器中的常规程序代码等的任何转换代码或优化代码可以保存在计算机系统中的任何地方。并且,可以以转换或优化热区域327以便获得经优化热代码304的任何方式执行优化代码。事实上,可以使用用于为核心转换或优化代码以供用于核心的任何已知的方法或装置,例如已知用于转换当前软件管理处理器中的代码的方法和装置。
[0064]无论要使用软件、固件、硬件或组合,都可以静态地或动态地执行转换。事实上,非常类似于可以动态地在运行时期间或静态地在执行之前进行监控,可以类似地执行转换和优化。在其中编译器或使用者标识热区域327的示例中,优化和转换可以发生在该时刻(在执行之前)。在这里,热代码标识符指令可以被用来标识热代码区域327并指定经优化/经转换代码304的位置。然而,不管部分327是在执行之前还是在执行期间被标识为热代码,在一些实施例中,优化和转换都是动态地(在运行时间期间)发生。
[0065]在一种实施例中,与其他执行一起并行地优化/转换热区域327。在一个示例中,核心302与核心301执行区域327并行地开始执行优化代码。在这里,监控模块305检测在核心301上执行热代码区域327,因此在核心302上发起优化。尽管来自热区域327的进一步的指令仍然正在核心301上执行,但核心302开始优化。结果,核心302本质上正在与核心301上执行热代码327并行地优化热代码327。在另一示例中,核心301与核心302对热代码327的优化并行地执行程序代码325的其他部分或其他彼此独占的代码。在另一实施例中,串行地进行热区域327的优化。例如,核心301执行热区域327,且然后,随后核心301或302优化热代码区域327。
[0066]在一种实施例中,代码327被存储在其原始存储器位置和并由核心302实时(onthe fly)转换。然而,在大多数情况中,在执行之前转换/优化整个代码部分更为高效。结果,在优化/转换模块310为诸如核心302之类的核心优化代码之后,经优化热代码304被存储在其他地方。经优化热代码304的其他位置可以是存储器中的另一位置,例如家用系统存储器位置(home, system memory location)。然而,由于热代码327常常与频繁执行相关联,把经优化版本304保存为更靠近核心302潜在地更有益。因此,在所阐释的实施例中,核心303包括保存经优化热代码304的代码高速缓存303。注意,代码高速缓存303可以是核心302中的单独的高速缓存结构;诸如核心302中的共享指令或数据高速缓存之类的共享高速缓存结构;或与核心302相关联的其他通用存储结构。
[0067]回头参考监控模块305的讨论,遇到热代码区域327的一种实施例包括程序计数器引用与代码部分相关联的指令地址。如所叙述的,映射模块315用于保存与经优化热代码引用317相关联的诸如指令地址之类的代码区域引用。本质上,映射模块315的条目把热代码区域327与其经优化版本(经优化热代码304)关联起来。作为说明性示例,引用316包括与热区域327相关联的诸如指令地址之类的地址。在这种场景中,当核心301遇到(程序计数器指向)映射模块315中的字段316中保存的指令地址时,监控模块305则指示已经遇到热区域327且应在核心302上执行。然后,以上简要描述且在下面更详细地讨论的协作模块320促进把数据和/或上下文移动到核心302以供执行。
[0068]在上面的示例中,确定已经遇到热区域327且应在核心302上执行仅涉及引用316。然后,可以利用字段317与字段316的关联来快速确定区域327的经优化热代码版本304位于何处。结果,字段317可以包括对经优化热代码304的位置的任何引用。这样的引用的多个简单示例包括:保存经优化代码304的代码高速缓存303的条目的地址,从代码高速缓存303的开始到保存经优化热代码的条目304的偏移,以及与条目304相关联的物理地址或线性地址。以简单表结构阐释映射模块315,该简单表结构可以以硬件、软件、固件或其组合来实现和/或保存。然而,用于把一个位置与另一位置关联起来的任何已知方法都可以用于把热代码327与其经优化版本关联起来。
[0069]尽管不具体地阐释,但与映射模块315组合的监控模块305的各部分可以形成用于指示经优化热代码304应在核心302上执行而不是本机代码327在核心301上执行的触发器模块。作为示例,当核心301的程序计数器被移动到下一指令地址时,触发器硬件比照被存储在映射硬件表315中的引用核对该地址。在这里,假设程序计数器指向引用保存在字段316中的代码区域327的指令地址。那么,基于映射表315中的条目,触发器硬件指示代码区域327的经优化代码区域304存在。结果,由于经优化版本已经存在且应在核心302上执行,可以略去在核心301上执行代码区域327。
[0070]在一种实施例中,核心301停止执行(停止或过渡到低功率状态),直到核心302完成经优化代码的执行。然而,这可能没有完全利用处理器300的处理容量。因此,在另一实施例中,在经优化热代码304正在核心302上执行的同时,核心301交错执行另一软件线程(不同于程序代码325代码)。作为又一示例,核心301可以推测地执行程序代码325的其他部分,这本质上执行一提前运行辅助线程的执行,或者无序执行并不依赖于代码区域327的代码325的其他部分。
[0071]在一种实施例中,协作模块320提供在核心301、302之间的协作功能性。作为最简单的示例,协作模块320包括在核心301、302之间传输信息的的互连。然而,在另一实施例中,协作模块包括其他硬件,这些硬件可以是单个核心独占的,或者在各核心之间共享,以便促进前述的协作。例如,核心302可以共享核心301的影子寄存器堆,以使得不必在核心302上执行经优化热代码304时执行寄存器状态从核心301到核心302的整个上下文切换。相反,在该场景中,核心302可以直接地访问影子寄存器堆。然而,协作模块不仅仅限于共享的结构和/或互连。事实上,协作模块320可以包括硬件、固件、软件或其组合以便提供对两个核心301、302中的寄存器、存储结构和缓冲器的直接读访问和/或写访问。结果,在一种实施例中,协作模块320能够把经优化热代码的执行所需要的数据/寄存器值从核心301传输到核心302。并且,它也能够把结果从核心302传递回到核心301,以便允许随后在核心301上的适当执行。
[0072]尽管已经主要参考监控本机核心301的执行讨论了监控模块305,但在一种实施例中,在监控模块305也用于监控经优化代码在核心302上的执行。结果,监控模块305能够把核心301上的代码部分327的性能与核心302上的经优化版本304的性能进行比较。此外,当核心302上的性能低于核心301上的性能时,或者相比于功率消耗的增加,核心302上的性能增益很小时,那么,把区域327标识为热代码的决定可以反转。作为示例,映射模块315的条目指示使得这样的决定释放或失效;因此,在下次核心301遇到热代码327时,监控模块305不检测引用316且不指示区域327的经优化热代码版本应在核心302上执行。本质上,反转把先前标识的区域327发送回到无序核心301。
[0073]作为进一步阐释这种性能比较的特定的说明性示例,假设基于高重复模式和高指令执行计数把代码区域327标识为热代码。结果,代码327被驻留在核心302上的二进制转换代码优化,以便获得经优化代码304。在经优化代码304被存储在代码高速缓存303中时,创建映射表315中的条目以便把代码区域327与经优化版本304关联起来。在核心301下次遇到与字段316中的引用匹配的引用时,则在核心302上触发经优化代码304的执行,而不是在核心301上执行代码区域327。注意,协作模块通过传递、共享或上下文切换把适当的值从核心301提供给核心302。在核心302执行经优化热代码304期间,相同的性能指标——指令执行计数——由监控模块305跟踪。如果指令执行计数少于在核心301上执行的代码区域327,那么,被标识为热代码的区域327的现状在未来继续。然而,如果在核心302上指令执行计数较长或检测到显著的功率增加,那么,如上所述,把区域327标识为热代码可以反转。
[0074]除了提供在核心301和302之间的通信之外,协作模块320也可以包括管理不同类型的多个核心的其他特征。作为第一示例,功率管理器实现确保核心301和302两者不同时以最大功率操作的功率算法。然而,此示例是纯粹地说明性的。且其他功率算法可以允许这样的最大操作。作为另一功率考虑,核心302可以使得功率状态在监控核心301上的执行期间驻留在低于最大值(低功率状态)。例如,当核心301与执行其自己的监控的机制相关联时,那么,核心302不需要完全上电,直到存在要执行的代码的经优化版本。结果,通过关闭核心302直到需要它来执行,潜在地节省了功率。反过来,在核心302正在执行经优化热代码的同时,核心301可以断电(置于低于最大的功率状态,例如ACPI低功率状态或睡眠状态)。
[0075]从核心到核心动态切换执行涉及两个挑战:1)及时地且精确地预测最适用于给定的代码片段的核心,以及2)在核心之间高效地迁移执行。
[0076]在一种实施例中,第一核心上的程序执行可以由运行时间软件和/或硬件标识(例如基于代码区域中的经分析的ILP),且然后,当前核心的性能指标和/或统计信息可以由监控模块305连续地收集以便预测程序代码的执行何时应切换到第二核心。图4中高亮显示这种方法。由于这种方法使用来自单个核心的数据来预测另一核心的性能,在一种实施例中,该方法中被称为“单核心预测”算法。
[0077]转到图4,阐释了在第一类型的第一核心(例如无序核心)和第二类型的第二核心(例如有序核心)当中分发代码以便取得最大性能和功率节省的方法400的流程图的实施例。尽管用基本上串行的方式阐释了图4的流程,但该流程可以以不同的次序执行,也可以并行执行。此外,可以利用硬件、固件或通过程序代码的执行来执行每一流程。
[0078]监控处理器的无序(000)处理器核心上程序代码的执行。在一种实施例中,对程序代码的引用是指(I)编译器程序动态地或静态地执行,以便编译其他程序代码;(2)诸如操作系统、管理程序、应用代码或其他软件程序等的主程序执行;(3)与主程序代码相关联的诸如库等的其他程序代码的执行,(4)可以不直接与主程序相关联的诸如辅助线程或其他任务等的其他程序代码的执行;或(5)其组合。
[0079]编译器常常包括把源文本/代码转换成目标文本/代码的程序或一组程序。通常,借助于编译器编译程序/应用代码在多个阶段(Phase)和通道(pass)中进行,以便把高级编程语言代码变换成低级机器或汇编语言代码。然而,单通道编译器仍然可以用于简单编译。编译器可以利用任何已知的编译技术和执行任何已知的编译器操作,例如词法分析、预处理、解析、语义分析、代码生成、代码变换和代码优化。[0080]较大的编译器常常包括多个阶段,但最常见的是这些阶段被包括在两个通用阶段内:(I)前端,即,通常可以发生句法处理、语义处理和一些变换/优化的场合,以及(2)后端,即,通常发生分析,变换、优化和代码生成的场合。一些编译器涉及中间端,中间端阐释在编译器的前端和后端之间的模糊分界。结果,对插入、关联、生成或编译器的其他操作的引用可以在前述的阶段或通道、以及编译器的任何其他已知的阶段或通道中的任何中发生。
[0081]在一种实施例中,监控模块305监控程序代码的执行包括跟踪在程序代码内的代码片段/区域被执行的次数。可以以分组指令/代码的任何已知方式来确定代码区域。作为示例,每当与代码部分相关联的指令地址被000核心的程序计数器引用时,重复计数就递增。在一种实施例中,如果代码部分的重复计数超过阈值,则代码部分就被标识为热代码。
[0082]或者与确定重复模式联合,或者分离地,监控程序代码的执行可以包括确定/跟踪与代码段相关联的性能指标。如上面所公开的,示例性的性能指标可以包括:指令退役推出、所执行的指令的数量、执行代码区域的时间量、遇到/执行代码区域的次数、在代码区域执行期间消耗的功率量、在代码区域执行期间耗费在不同功率状态的时间量以及在代码片段执行期间的热密度。然而,在程序代码执行期间可以监控与处理器执行相关联的任何已知的指标或指标的组合。
[0083]在框402,程序代码可以在第一核心上执行。在一个实施例中,第一核心可以属于第一类型,例如窄无序核心。在框404,在第一核心执行程序代码时可以监控第一核心的性能。在框406,可以收集关于性能的统计信息。在一个实施例中,统计信息可以包括分支未命中率、高速缓存未命中率等等。在一个实施例中,监控性能和收集统计信息可以由监控模块305执行。在框408,可以至少部分地基于在第一核心上执行程序代码的性能和统计信息来预测在第二核心上执行程序代码的性能。在一个实施例中,第二代码可以属于第二类型,例如宽有序核心。替代地,第一类型可以是宽次序核心且第二类型可以是窄无序核心。在一个实施例中,该预测可以被实现为被称为“predict_performance (预测_性能)”的函数。在框410,如果所预测的第二核心执行程序代码的性能好于所监控的第一核心执行程序代码的性能,那么,可以执行下列动作。
[0084]在框412,第二核心可以从低功率或“睡眠”状态上电。在上电期间,第一核心继续执行程序。在框414,程序代码执行的可以从第一核心切换到第二核心。在框416,第一核心可以断电到睡眠状态。如果第二核心的所预测的性能不好于第一核心,则程序代码在第一核心上的执行可以继续。在该方法的随后周期中,该方法中的第一核心和第二核心的位置可以交换(例如,使得首先执行第二核心,监控第二核心的性能,收集关于第二核心的统计信息,预测第一核心的性能,等等)。在一个实施例中,框404到416可以由代码分发模块210执行。
[0085]函数 predict_performance (core number (核心号),performance_corel (性能 _核心1),statistics_corel (统计信息_核心I))使用当前的核心执行性能和统计信息即performance_corel和statistics_corel来预测在第二核心上执行的性能。如果所预测的性能高于当前核心上的性能,则执行被切换到另一核心。这种方法是基于这样的假设:使用当前核心的性能信息来预测另一核心的性能是可能的。直观地,由于其通过无序执行后面的指令来隐藏未命中等待时间的能力,具有过多的高速缓存/分支未命中率的程序执行应在窄无序核心上执行较好。另一方面,由于其高的执行带宽,具有高指令级并行性(ILP)和低高速缓存/分支未命中的程序应在宽有序核心上更高效地运行。
[0086]在一个实施例中,为了定义函数predict_performance,可以首先在第一核心和第二核心两者上运行η个代码片段Cl,...,cn并分别在两个核心上收集它们各自的性能信息(pll, pl2,..., pin)、(p21, p22,..., p2n)和统计信息(sll, sl2,..., sin)、(s21, s22,...,s2n)。然后,可以寻找最佳拟合函数F 以使得(F(pll,sll),F(pl2, sl2),...,F (pin, sin)) - (p21, p22,..., p2n)和(F (p21, s21),F (p22, s22),..., F (p2n, s2n)) - (pll,pl2,...,pin)最小化。如果该最佳拟合的标准误差是小的,则可以把F用作函数predict_performance。如果标准误差是高的,那么,可能需要寻找更多性能参数来增强预测精度。
[0087]这种单核心预测方法的一个优点是它仅使用当前核心执行统计信息来预测另一核心的性能,在在做出决定时无需涉及另一核心的性能和功率开销。然而,这种方法假设两个核心的性能紧密相关。在一些环境/配置中,两个核心的性能可以仅松散相关,且良好的拟合函数可能不存在。因此可能期望具有更通用方法。
[0088]在另一实施例中,双核心预测过程使用短期内在两个核心上观察到的性能信息来预测核心切换。具体地,可以以规则间隔执行“预测”以便采样和比较两个核心上的性能,以决定是否把执行切换到不同的核心。注意,每一预测可以涉及两个核心切换:发生第一切换以便从另一核心获取性能信息,并且在另一核心上的性能不如在第一核心上的性能那样好时,第二切换可以发生从而执行应切换回到第一核心时。第一核心切换涉及上电另一核心并预热其微体系结构状态以供执行,且第二切换仅涉及核心断电。
[0089]为了减少核心切换开销,预测可以被分离成两个操作:“连续性预测”(Pcont)操作和“切换预测”(Pswit)。Pcont操作把在当前核心上收集的性能信息与两个核心的先前的性能信息进行比较,以便决定该执行是否应在当前核心上继续。如果Pcont操作预测到该执行不应在当前核心上继续,则Pswit操作激活另一核心以便短期运行另一核心并比较两个核心上的性能信息以便决定该执行是否应当被切换到另一核心。为了防止Pcont继续在相同的核心上执行太久,引入参数K以便规定在一行中不能跳过Pswit操作超过K次。而且,每次跳过Pswit操作,由膨胀因子放大先前性能,以使得下一 Pcont时段将发现更难以跳过Pswit操作。
[0090]图5中示出双核心预测进程500。在一个实施例中,S是采样间隔(例如,在预测之间的周期数量),M是收集每一核心上的性能的样本长度(例如,按周期的数量),PU是上电第二核心的周期数量,IPC是每一周期的指令数量,K是延拓的最大数量(K是自然数),N是延拓的数量(初始设定为0),且Prev_IPC是先前的IPC (可以初始将其设定为MAX_FL0AT)。在一个实施例中,S、M、PU、K和膨胀因子可以被设定为适当的值。
[0091]在框502,程序代码可以在第一核心上执行S个周期的采样间隔。在一个实施例中,第一核心可以属于第一类型,例如窄无序核心。在框504,在从程序代码执行的开始的S+M个周期结束之前,可以告知第二核心加电PU个周期。在一个实施例中,第二核心可以属于第二类型,例如宽有序核心。替代地,第一类型可以是宽有序核心且第二类型可以是窄无序核心。在框506,可以收集第一核心的每个周期的指令数量(IPC1),持续M个周期。在一个实施例中,监控性能和收集统计信息可以由监控模块305或代码分发模块210中的一个执行。
[0092]接下来,可以如下执行对继续在第一核心上执行的预测(Pcont)。在框508,如果延拓的数量N少于延拓的最大数量K,且第一核心的每一周期的指令的数量IPCl大于先前的每一周期的指令的数量(Prev_IPC,初始设定为最大值),那么,可以执行框510、512和514。在这种情况中,不进行从第一核心切换到第二核心。在框510,可以告知断电第二核心。在框512,先前的每一周期的指令的数量Prev_IPC可以被设定为Prev_IPC乘以膨胀因子。在第一核心上继续执行程序代码,处理继续。
[0093]如果在框508延拓的数量N少于或等于延拓的最大数量K,或第一核心的每一周期的指令的数量IPCl少于或等于先前的每一周期的指令的数量Prev_IPC,那么,可以执行框516、518和520。在这种情况中,可以进行从第一核心切换到第二核心。接下来,可以如下执行对把执行从第一核心切换到第二核心的预测(Pswit)。在框516,计数器N可以设定为
O。在框518,可以把程序代码的执行从第一核心切换到第二核心且可以收集第二核心的每一周期的指令的数量(IPC2)。接下来,进行检查以便验证该切换是值得的。
[0094]在框520,如果第二核心上每一周期的指令的数量(IPC2)少于第一核心上每一周期的指令的数量(IPC1),那么,在框522,可以把程序代码的执行从第二核心切换回到第一核心。替代地,如果使用不同于每一周期的指令的数量的另一性能指标,那么,如果第二核心上的性能不好于第一核心上的性能,那么,可以把程序代码的执行从第二核心切换回到第一核心。然后,在框524,可以告知断电第二核心。然而,如果在框520第二核心上的每一周期的指令的数量(IPC2)不少于第一核心上的每一周期的指令的数量(IPC1),那么,核心的切换是值得的。替代地,如果使用了不同于每一周期的指令的数量的另一性能指标,那么,如果第二核心上的性能好于或等于第一核心上的执行,那么,核心的切换是值得的。在框528,可以告知断电第一核心。在任一种情况中,在一种是不例中,借助于把先前的每一周期的指令的数量(Prev_IPC)设定为IPC值的平均(例如,IPC1+IPC2/2),处理在框530继续。尽管我们在这里把算术平均用作平均,但我们也可以使用几何平均、调和平均和任何其他平均来给出两个IPC值的平均。现在在第二核心上执行处理,且断电第一核心。在该方法的随后迭代中,该方法中的第一核心和第二核心的位置可以被交换(例如,使得第二核心首先执行S个周期,告知上电第一核心,持续M个周期监控第二核心的性能,收集关于第二核心的统计信息,等等)。在一个实施例中,至少框504到530可以由代码分发模块210执行。
[0095]核心切换涉及若干开销:1)激活可能处于低功率状态的另一核心;2)把x86寄存器状态传输给另一核心;3)把频繁地访问的数据移动到其他数据高速缓存;以及4)预热指令高速缓存、分支预测器状态和另一核心上的其他状态。
[0096]唤醒(或上电)另一核心的等待时间取决于另一核心所处于的低功率状态。在一些实施例中,如果该核心处于消耗?30%的常规操作功率的低功率C2状态,可能占用?5000个周期来把核心上电到正常操作速度(CO状态)。在一种实施例,如果该核心处于深度断电状态(C6),消耗〈10%的操作功率,则可能占用?200K个周期来唤醒。尽管上电需要时间,但可以与在另一核心上的执行并行进行。例如,在一个实施例中,在第一核心进入Pswit/Pcont时段之前,第一核心(或其他模块)可以发送信号给第二核心以便发起上电。在第一核心的预测时段结束时,第二核心可能已经上电,且可以继续程序代码的执行。借助于这种提前上电策略,上电等待时间应既不影响核心切换等待时间也不影响性能,尽管它增加了
能量消耗。
[0097]在一个实施例中,即使在两个核心当中共享2级(L2)高速缓存,数据和指令高速缓存可以占用高达IOK个周期来预热。而且,现代混合分支预测器允许非常快速地预热分支预测器。假设核心上电占用PU个周期,且分支预测器和LI高速缓存预热占用WU个周期。图6阐释核心交换动作和开销。图6中的时间的表示仅仅是说明性的,且不预期表达在各种阶段之间的任何实际的、特定的计时关系。在第一核心601进入Pcont时段之前,第一核心告知第二核心602上电603。在第一核心完成其Pcont操作且发现可能需要核心切换之后,程序代码执行可以被切换到第二核心604。在这一时刻,第二核心已经上电,且开始其预热WU个周期605。在预热时段之后,第二核心运行短时间(例如,M个周期)以便收集其性能数据606。假设在该时刻第二核心的性能好于第一核心的性能,因此第二核心告知第一核心断电(PD)607,且继续在第二核心上执行。接近下一 Pcont时段的结束,第二核心告知第一核心上电608。在第二核心完成其Pcont时段并发现第二核心应继续执行之后,第二核心告知第一核心断电609并继续在第二核心上的程序代码执行。
[0098]作为把本机核心与不同的协同设计核心耦合起来的结果,在使用在此讨论的动态核心选择技术时,即使是在单个应用内,也可能获得最好的功率和执行益处。
[0099]例如,借助于无序核心和软件管理的有序核心,在软件管理核心上不高效的代码被迁移到无序核心。并且反过来,在无序核心上不高效的代码被迁移到软件管理核心。通过硬件、软件、固件或其组合,可以高效地管理本机代码、热代码检测和热代码优化的并行执行,可以以管线化方式把同时多个线程的各个段高效地交错在无序和有序协同设计核心之间。结果,可以获得最大性能,同时通过不同的功率效率技术获得较好的功率性能,例如在一些实现中在有序核心上的执行期间把无序核心置于低功率状态。
[0100]在此所使用的模块是指任何硬件、软件、固件或其组合。通常被阐释为分离的模块边界往往改变且可能重叠。例如,第一模块和第二模块可以共享硬件、软件、固件或其组合,同时可能保留一些独立的硬件、软件或固件。在一种实施例中,术语逻辑的使用包括硬件,例如晶体管、寄存器或诸如可编程的逻辑设备等的其他硬件。然而,在另一实施例中,逻辑也包括与硬件集成的软件或代码,例如固件或微代码。
[0101]在此所使用的值,包括数量、状态、逻辑状态或二进制逻辑状态的任何已知表示。通常,对逻辑电平、逻辑值或逻辑值的使用也被称为I和0,它们简单地表示二进制逻辑状态。例如,I是指高逻辑电平且O是指低逻辑电平。在一种实施例中,诸如晶体管或闪存单元等的存储单元能够保持单个逻辑值或多个逻辑值。然而,已经使用计算机系统中值的其他表示。例如十进制数10也可以被表示成二进制值1010和十六进制字母。因此,值包括能够被保存在计算机系统中的信息的任何表示。
[0102]此外,状态可以由值或部分值表示。作为示例,诸如逻辑I等的第一值可以表示默认的或初始的状态,同时诸如逻辑O等的第二值可以表示非默认的状态。另外,在一种实施例中,术语复位和设定分别是指默认的值或状态以及经更新的值或状态。例如,默认的值潜在地包括高逻辑值,即复位,同时经更新的值潜在地包括低逻辑值,即设定。注意,可以利用值的任何组合来表示任何数量的状态。
[0103]可以经由被存储在机器可读介质上的可由处理元件执行的指令或代码来实现上面陈述的方法、硬件、软件、固件或代码的实施例。机器可读介质包括以诸如计算机或电子系统等的机器可读的形式提供(即,存储和/或传送)信息的任何机制。例如,机器可读介质包括随机存取存储器(RAM),例如静态RAM (SRAM)或动态RAM (DRAM) ;ROM ;磁存储介质或光存储介质;闪速存储器设备;电存储设备;光存储设备;等等。
[0104]贯穿本说明书对“一种实施例”或“实施例”的引用意指结合该实施例描述的具体的特征、结构或特性被包括在本发明的至少一种实施例中。因而,贯穿本说明书,短语“在一种实施例中”或“在一个实施例中”在各种场合下的出现并不必定全都引用相同的实施例。此外,在一个或多个实施例中,可以以任何合适的方式组合具体的特征、结构或特性。
[0105]在前述的说明书中,已经借助于引用特定的示例性实施例给出了详细描述。然而,将明显看出,可以在不偏离所附权利要求中陈述的本发明的更广泛的精神和范围的前提下对其做出各种修改和改变。因此,应当以说明性的意义而非限制性的意义看待说明书和附图。此外,对实施例和其他示范性语言的前述使用并不必定是指相同的实施例或相同的示例,而是可以是指不同的和有区别的实施例,也可能是指相同的实施例。
【权利要求】
1.一种在异构多核心处理系统上动态切换核心的方法,所述方法包括:在所述异构多核心处理系统的第一处理核心上执行程序代码,所述第一处理核心属于第一类型;监控执行所述程序代码的所述第一处理核心的性能并收集所述第一处理核心的统计信息;至少部分基于所述第一处理核心的所监控的性能和所收集的统计信息,预测在所述异构多核心处理系统的第二处理核心上执行所述程序代码的性能,所述第二处理核心属于不同于所述第一类型的第二类型;以及当在所述第二处理核心上执行所述程序代码的所预测的性能好于执行所述程序代码的所述第一处理核心的性能时,把所述程序代码的执行从所述第一处理核心切换到所述第二处理核心。
2.如权利要求1所述的方法,进一步包括当在所述第二处理核心上执行所述程序代码的所预测的性能好于执行所述程序代码的所述第一处理核心的性能时从低功率状态上电所述第二处理核心。
3.如权利要求1所述的方法,进一步包括当在所述第二处理核心上执行所述程序代码的所预测的性能好于执行所述程序代码的所述第一处理核心的性能时把所述第一处理核心断电到低功率状态。
4.如权利要求1所述的方法,其特征在于,所述第一处理核心包括无序处理核心,且所述第二处理核心包括有序处理核心。
5.如权利要求1所述的方法,其特征在于,所述第二处理核心包括无序处理核心且所述第一处理核心包括有序次序处理核心。
6.如权利要求1所述的方法,其特征在于,预测所述第二处理核心的性能包括在所述第一处理核心和所述第二处理核心两者上执行多个代码片段、在执行所述代码片段的同时收集所述第一处理核心和第二处理核心的各自的性能信息和统计信息以及确定最佳匹配函数F以使得在F (所述第一核心的性能信息和统计信息)和所述第二处理核心的性能之间的差异最小化。
7.一种包括代码的机器可读介质,所述代码在由所述机器执行时,引起所述机器执行权利要求1所述的操作。
8.—种异构多核心处理系统,其包括一种集成电路,所述集成电路包含适于执行程序代码的第一类型的第一处理核心;适于执行所述程序代码的第二类型的第二处理核心,所述第一类型不同于所述第二类型;以及代码分发模块,其适于监控执行所述程序代码的所述第一处理核心的性能和收集所述第一处理核心的统计信息,至少部分地基于所述第一处理核心的所监控的性能和所收集的统计信息预测在所述第二处理核心上执行所述程序代码的性能;且当在所述第二处理核心上执行所述程序代码的所预测的性能好于执行所述程序代码的所述第一处理核心的性能时,把所述程序代码的执行从所述第一处理核心切换到所述第二处理核心。
9.如权利要求8所述的异构多核心处理系统,其特征在于,所述代码分发模块适于当在所述第二处理核心上执行所述程序代码的所预测的性能好于执行所述程序代码的所述第一处理核心的性能时从低功率状态加电所述第二处理核心。
10.如权利要求8所述的异构多核心处理系统,其特征在于,所述代码分发模块还适于当在所述第二处理核心上执行所述程序代码的所预测的性能好于执行所述程序代码的所述第一处理核心的性能时把所述第一处理核心断电到低功率状态。
11.如权利要求8所述的异构多核心处理系统,其特征在于,所述第一处理核心包括无序处理核心且所述第二处理核心包括有序处理核心。
12.如权利要求8所述的异构多核心处理系统,其特征在于,所述第二处理核心包括无序处理核心且所述第一处理核心包括有序处理核心。
13.一种在异构多核心处理系统上动态切换核心的方法,所述方法包括:在所述异构多核心处理系统的第一处理核心上执行程序代码,持续第一数量的周期,所述第一处理核心属于第一类型;告知加电所述异构多核心处理系统的第二处理核心,所述第二处理核心属于不同于所述第一类型的第二类型;收集执行所述程序 代码的所述第一处理核心的第一性能指标,持续第二数量的周期;当所述第一性能指标好于先前确定的核心性能指标时,告知断电所述第二处理核心并在所述第一处理核心上继续所述程序代码的执行;以及当所述第一性能指标不好于所述先前确定的核心性能指标时,把所述程序代码的执行从所述第一处理核心切换到所述第二处理核心,并收集执行所述程序代码的所述第二处理核心的第二性能指标,持续所述第二数量的周期。
14.如权利要求13所述的方法,进一步包括在所述第二性能指标不好于所述第一性能指标时,把所述程序代码的执行从所述第二处理核心切换回到所述第一处理核心,并告知断电所述第二处理核心。
15.如权利要求14所述的方法,进一步包括在所述第二性能指标好于所述第一性能指标时,告知断电所述第一处理核心并把所述先前确定的核心性能指标设置为所述第一性能指标和所述第二性能指标的平均。
16.如权利要求13所述的方法,其特征在于,告知加电所述第二处理核心包括告知在所述第一数量的周期和所述第二数量的周期的总和结束之前加电第三数量的周期。
17.如权利要求13所述的方法,进一步包括在所述第一性能指标好于所述先前确定的核心性能指标时把所述先前确定的核心性能指标设置为所述先前确定的核心性能指标乘以膨胀因子。
18.如权利要求13所述的方法,进一步包括每K次比较所述第一性能指标和所述先前确定的核心性能指标就进行至少一次强制把所述程序代码的执行从所述第一处理核心切换到所述第二处理核心,并收集执行所述程序代码的所述第二处理核心的第二性能指标,持续所述第二数量的周期,其中K是自然数。
19.如权利要求13所述的方法,其特征在于,所述第一处理核心包括无序处理核心且所述第二处理核心包括有序处理核心。
20.如权利要求13所述的方法,其特征在于,所述第二处理核心包括无序处理核心且所述第一处理核心包括有序处理核心。
21.一种包括代码的机器可读介质,所述代码在由所述机器执行时,引起所述机器执行权利要求13所述的操作。
22.—种异构多核心处理系统,其包括集成电路,所述集成电路包含适于执行程序代码的第一类型的第一处理核心;适于执行所述程序代码的第二类型的第二处理核心,所述第一类型不同于所述第二类型;以及代码分发模块,其适于引起在所述第一处理核心上执行所述程序代码持续第一数量的周期、告知加电所述第二处理核心以及收集执行所述程序代码的所述第一处理核心的第一性能指标持续第二数量的周期;其中,在所述第一性能指标好于先前确定的核心性能指标时,所述代码分发模块适于告知断电所述第二处理核心并继续在所述第一处理核心上执行所述程序代码;以及其中,在所述第一性能指标不好于所述先前确定的核心性能指标时,所述代码分发模块适于把所述程序代码的执行从所述第一处理核心切换到所述第二处理核心,并收集执行所述程序代码的所述第二处理核心的第二性能指标,持续所述第二数量的周期。
23.如权利要求22所述的异构多核心处理系统,其特征在于,在所述第二性能指标劣于所述第一性能指标时,所述代码分发模块适于把所述程序代码的执行从所述第二处理核心切换回到所述第一处理核心,并告知断电所述第二处理核心。
24.如权利要求23所述的异构多核心处理系统,其特征在于,在所述第二性能指标好于所述第一性能指标时,所述代码分发模块适于告知断电所述第一处理核心并把所述先前确定的核心性能指标设定为所述第一性能指标和所述第二性能指标的平均。
25.如权利要求22所述的异构多核心处理系统,其特征在于,告知上电所述第二处理核心包括在所述第一数量的 周期和所述第二数量的周期的总和结束之前告知上电第三数量的周期。
26.如权利要求22所述的异构多核心处理系统,其特征在于,所述代码分发模块还适于在所述第一性能指标好于所述先前确定的核心性能指标时把所述先前确定的核心性能指标设定为所述先前确定的核心性能指标乘以膨胀因子。
27.如权利要求22所述的异构多核心处理系统,其特征在于,所述代码分发模块还适于每K次比较所述第一性能指标和所述先前确定的核心性能指标就至少进行一次强制把所述程序代码的执行从所述第一处理核心切换到所述第二处理核心,并收集执行所述程序代码的所述第二处理核心的第二性能指标,持续所述第二数量的周期,其中K是自然数。
28.如权利要求22所述的异构多核心处理系统,其特征在于,所述第一处理核心包括无序处理核心且所述第二处理核心包括有序处理核心。
29.如权利要求22所述的异构多核心处理系统,其特征在于,所述第二处理核心包括无序处理核心且所述第一处理核心包括有序处理核心。
【文档编号】G06F9/44GK103443769SQ201180069184
【公开日】2013年12月11日 申请日期:2011年12月28日 优先权日:2011年3月11日
【发明者】吴友峰, S·胡, E·鲍林, C·王 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1