分段式指令块的制作方法

文档序号:14394566阅读:414来源:国知局



背景技术:

由于摩尔定律所预测的持续的晶体管扩展,微处理器已经从晶体管数的持续增加、集成电路成本、制造资本、时钟频率、以及能量效率中收益,而相关的处理器指令集架构(isa)却很小变化。然而,从在过去40年里驱动半导体工业的光刻扩展实现的益处正在放缓或者甚至反转。精简指令集计算(risc)架构已经成为处理器设计中的主导典范很多年。乱序超标量实现尚未在面积或性能方面展现出持续改进。因此,存在对于扩展性能改进的处理器isa改进的足够机会。



技术实现要素:

公开了使用基于块的处理器指令集架构(bb-isa)的分度指令块的方法、装置以及计算机可读存储设备。所描述的技术和工具能够潜在地改进处理器性能,并且可以彼此分离地被实现,或者彼此各种组合被实现。如下面将更充分地描述的,所描述的技术和工具可以被实现在以下各项中:数字信号处理器、微处理器、专用集成电路(asic)、软处理器(例如,使用可重新配置逻辑被实现在现场可编程门阵列(fpga)中的微处理器核)、可编程逻辑、或者其他适合的逻辑电路。如对于本领域的普通技术人员而言将容易地明显的,所公开的技术可以被实现在各种计算平台中,包括但不限于服务器、大型机、手机、智能电话、pda、手持式设备、手持式计算机、触摸屏平板设备、平板计算机、可穿戴计算机、以及膝上型计算机。

在所公开的技术的一些示例中,可以使用基于块的处理器核来执行指令块。指令块可以包括指令头部和一条或多条指令。基于块的处理器核可以包括彼此通信的头部译码逻辑和取回逻辑。头部译码逻辑可以被配置为译码指令块头部以确定指令块内的多个子块的起始位置。取回逻辑可以被配置为发起针对多个子块的并行取回和译码操作。

提供本发明内容以引入以在具体实施方式中下面进一步描述的简化形式的概念的选择。本发明内容不旨在标识要求保护的主题的关键特征或基本特征,其也不旨在用于限制要求保护的主题的范围。所公开的主题的前述和其他目标、特征以及优点将从参考附图进行的以下具体实施方式变得更加明显。

附图说明

图1图示了如可以在所公开的技术的一些示例中使用的包括多个处理器核的基于块的处理器。

图2图示了如可以在所公开的技术的一些示例中使用的基于块的处理器核。

图3图示了根据所公开的技术的某些示例的多个指令块。

图4图示了源代码和相应的指令块的部分。

图5图示了如可以在所公开的技术的一些示例中使用的基于块的处理器头部和指令。

图6是图示基于块的处理器中的处理器核的状态的进展的示例的流程图。

图7是示出编译用于基于块的处理器的程序的示例性方法的流程图,该方法可在所公开技术的一些示例中执行。

图8-9是针对基于块的处理器的指令块内的指令的不同布置的示例。

图10-11是基于块的处理器核的取回和译码逻辑的不同配置的示例。

图12是示出在基于块的处理器核中取回和译码指令的示例性方法的流程图,该方法可在所松开技术的一些示例中执行。

图13是示出用于实现所公开技术的一些实施例的合适计算环境的框图。

具体实施方式

i.总体考虑

在未旨在以任何方式进行限制的代表性实施例的上下文中阐述了本公开内容。

如在本申请中所使用的,除非上下文清楚地指明,否则单数形式“一”、“一种”和“该”包括复数形式。此外,术语“包括”意味着“包含”。而且,术语“耦合的”涵盖机械的、电的、磁性的、光学的以及将多个项耦合或链接在一起的其他实际方式,并且不排除耦合项之间的中间元件的存在。另外,如在此所使用的,术语“和/或”意味着短语中的任何一项或多项的组合。

在此所描述的系统、方法和装置不应当以任何方式被解释为限制性的。相反,本公开涉及彼此单独并且以各种组合和子组合的各种所公开的实施例的所有新颖和非显而易见的特征和方面。所公开的系统、方法和装置既不限于任何特定方面或者特征或者其组合,所公开的内容和方法也不要求任何一个或多个特定优点存在或者问题被解决。此外,所公开的实施例的任何特征或者方面可以彼此以各种组合和子组合被使用。

虽然为了方便呈现而以特定顺序的次序描述所公开的方法中的一些方法的操作,但是应当理解,除非特定排序由下面阐述的特定语言所要求,否则说明书的这种方式涵盖重新布置。例如,顺序地描述的操作可以在一些情况下重新布置或者并行地执行。此外,出于简单的缘故,附图可能未示出所公开的内容和方法可以结合其他内容和方法使用的各种方式。此外,说明书有时使用类似“产生”、“生成”、“显示”、“接收”、“发射”、“验证”、“执行”和“发起”的术语来描述所公开的方法。这些术语是所执行的实际操作的高层描述。对应于这些术语的实际操作将取决于特定实现而变化并且是由本领域的普通技术人员容易地可辨别的。

参考本公开的装置或者方法在此所呈现的操作理论、科学原理或者其他理论描述已经出于更好的理解的目的而被提供,并且不旨在范围方面是限制性的。所附的权利要求中的装置和方法不限于以由这样的操作理论所描述的方式实现的那些装置和方法。

所公开的方法中的任一方法可以被实现为被存储在一个或多个计算机可读介质(例如,计算机可读介质(诸如一个或多个光学介质光盘、易失性存储器部件(诸如dram或sram))或非易失性存储器部件(诸如硬盘驱动器))上并且被执行在计算机(例如,任何商业可获得的计算机,包括智能电话或者包括计算硬件的其他移动设备)上的计算机可执行指令。用于实现所公开的技术的计算机可执行指令中的任一指令以及在所公开的实施例的实现期间创建和使用的任何数据可以被存储在一个或多个计算机可读介质(例如,计算机可读存储介质)上。计算机可执行指令可以是例如专用软件应用或者经由网络浏览器或者其他软件应用(诸如远程计算应用)访问或者下载的软件应用的一部分。这样的软件可以例如在单个本地计算机(例如,作为在任何适合的商业可获得的计算机上执行的代理)上被执行,或者在使用一个或多个网络计算机的网络环境(例如,经由因特网、广域网、局域网、客户端服务器网络(诸如云计算网络)、或者其他这样的网络)中被执行。

为了清晰起见,描述了基于软件的实现的仅某些所选的方面。省略了在本领域中众所周知的其他细节。例如,应当理解,所公开的技术不限于任何特定计算机语言或者程序。例如,所公开的技术可以通过以c、c++、java或者任何其他适合的编程语言来实现。同样地,所公开的技术不限于任何特定计算机或者硬件类型。适合的计算机和硬件的某些细节是众所周知的并且不需要在本公开中被详细阐述。

此外,基于软件的实施例(包括例如用于使得计算机执行所公开的方法中的任一方法的计算机可执行指令)中的任一实施例可以通过适合的通信手段被上载、被下载或者被远程访问。这样的适合的通信手段包括例如因特网、万维网、内联网、软件应用、电缆(包括光纤电缆)、磁通信、电磁通信(包括rf、微波和红外通信)、电子通信、或者其他这样的通信手段。

ii.对所公开的技术的介绍

超标量乱序微架构采用大量的电路资源来重命名寄存器,以数据流次序调度指令,在误推测之后清理,并且针对精确异常引退结果。这包括昂贵的能量消耗电路,诸如深的许多端口的寄存器文件、用于数据流指令调度唤醒的许多端口的内容可访问存储器(cam)、以及许多宽总线复用器和旁路网络,所有的这些都是资源密集的。例如,多读取、多写入ram的基于fpga的实现通常要求复制、多循环操作、时钟加倍、组交错、实况值表和其他昂贵技术的混合。

所公开的技术可以通过应用包括高指令集并行性(ilp)、乱序(out-of-order,ooo)、超标量执行的技术来实现能量效率和/或性能增强,同时避免处理器硬件和相关联的软件二者中的大量的复杂性和开销。在所公开的技术的一些示例中,包括多个处理器核的基于块的处理器使用针对区域和能量有效的高ilp执行所设计的显式数据图形执行(edge)isa。在一些示例中,edge架构和相关联的编译器的使用巧妙处理重命名cam的寄存器的远离和复杂性。在一些示例中,基于块的处理器的相应核可以存储或者高速缓存可以被重复地执行的所取指且译码的指令,并且所取指且译码的指令可以被重新使用以潜在地实现减少的功率和/或增加的性能。

在所公开的技术的某些示例中,edgeisa可以消除对于一个或多个复杂架构特征的需要,包括寄存器重命名、数据流分析、误推测恢复以及按序引退,同时支持主流编程语言(诸如c和c++)。在所公开的技术的某些示例中,基于块的处理器执行多个(两个或两个以上)指令作为原子块。基于块的指令可以被用于以更显式的方式表达程序数据流和/或指令流的语义,这允许改进的编译器和处理器性能。在所公开的技术的某些示例中,显式数据图形执行指令集架构(edgeisa)包括关于可以用于改进对不适当的控制流指令的检测的程序控制流的信息,从而增加性能、节省存储器资源和/或以及节省能量。

在所公开的技术的一些示例中,在指令块内组织的指令原子地被取指、被执行并且被提交。块内的指令以数据流次序被执行,其使用寄存器重命名减少或者消除并且提供功率有效的ooo执行。编译器可以被用于通过isa显式地编码数据依存性,这减少或者消除负担的处理器核控制逻辑在运行时重新发现依存性。使用所断言的执行,块内分支可以被转换为数据流指令,并且除了存储器依存性之外的依存性可以限于直接数据依存性。所公开的目标形式编码技术允许块内的指令经由操作数缓冲器直接地传递其操作数,这减少对功耗渴望的多端口物理寄存器文件的访问。

在指令块之间,指令可以使用存储器和寄存器来进行通信。因此,通过利用混合数据流执行模型,edge架构可以仍然支持命令式编程语言和顺序的存储器语义,但是期望地还享有具有近按序功率效率和复杂性的乱序执行的益处。

如本领域的普通技术人员将容易地理解到,所公开的技术的实现的范围在各种区域、性能和功率折中的情况下是可能的。

iii.示例基于块的处理器

图1是如可以被实现在所公开的技术的一些示例中的基于块的处理器100的块图10。处理器100被配置为根据指令集架构(isa)来执行原子指令块,isa描述了处理器操作的若干方面,包括寄存器模型、由基于块的指令执行的若干定义操作、存储器模型、中断以及其他架构特征。基于块的处理器包括多个处理器核110,其包括处理器核111。

如在图1中所示,处理器核经由核互连120而彼此连接。核互连120携带数据并且控制核110中的个体核、存储器接口140以及输入/输出(i/o)接口145之间的信号。核互连120可以使用电的、光学的、磁性的或者其他适合的通信技术来发送和接收信号,并且可以取决于特定期望的配置而提供根据若干不同的拓扑布置的通信连接。例如,核互连120可以具有交叉开关、总线、点对点总线、或者其他适合的拓扑。在一些示例中,核110中的任一核可以被连接到其他核中的任一核,而在其他示例中,一些核仅被连接到其他核的子集。例如,每个核可以仅被连接到最近的4、8或20个邻近核。核互连120可以用于将输入/输出数据传送至核以及从核传送输入/输出数据,以及将控制信号和其他信息信号传送至核以及从核传送控制信号和其他信息信号。例如,核110中的每个核110可以接收并且传送指示当前正由相应核中的每个核执行的指令的执行状态的信号量。在一些示例中,核互连120被实现为将核110和存储器系统连接的接线,而在其他示例中,核互连可以包括用于多路复用(一条或多条)互连接线上的数据信号的电路、开关和/或路由部件,包括活跃的信号驱动器和中继器或者其他适合的电路。在所公开的技术的一些示例中,在处理器100内和/或至/来自处理器100的信号不限于全摆幅电数字信号,而是处理器可以被配置为包括差分信号、脉冲信号或者用于传送数据和控制信号的其他适合的信号。

在图1的示例中,处理器的存储器接口140包括被用于连接到附加存储器(例如,被定位在除了处理器100之外的另一集成电路上的存储器)的接口逻辑。如在图1中所示,外部存储器系统150包括l2高速缓存152和主存储器155。在一些示例中,l2高速缓存可以使用静态ram(sram)被实现,并且主存储器155可以使用动态ram(dram)被实现。在一些示例中,存储器系统150被包括在与处理器100的其他部件相同的集成电路上。在一些示例中,存储器接口140包括允许在不使用(一个或多个)寄存器文件和/或处理器100的情况下传送存储器中的数据块的直接存储器访问(dma)控制器。在一些示例中,存储器接口管理虚拟存储器的分配、扩展可用的主存储器155。

i/o接口145包括用于将输入信号和输出信号接收并且发送到其他部件的电路,诸如硬件中断、系统控制信号、外围接口、协处理器控制和/或数据信号(例如,用于图形处理单元、浮点协处理器、物理处理单元、数字信号处理器或者其他协处理部件的信号)、时钟信号、信号量或者其他适合的i/o信号。i/o信号可以是同步的或者异步的。在一些示例中,i/o接口的全部或部分结合存储器接口140使用存储器映射的i/o技术被实现。

基于块的处理器100还可以包括控制单元160。控制单元160监督处理器100的操作。可以由控制单元160执行的操作可以包括对核的分配和去分配以用于执行指令处理;对任何核、寄存器文件、存储器接口140和/或i/o接口145中之间的输入数据和输出数据的控制;对执行流的修改;以及验证控制流中的分支指令、指令头部和其他改变的(一个或多个)目标位置。控制单元160还可以处理硬件中断,并且控制特殊系统寄存器(例如,被存储在一个或多个寄存器文件中的程序计数器)的读取和写入。在所公开的技术的一些示例中,控制单元160至少部分地使用处理器核110中的一个或多个核被实现,而在其他示例中,控制单元160使用非基于块的处理器核(例如,耦合到存储器的通用risc处理核)被实现。在一些示例中,控制单元160至少部分地使用以下各项中的一项或多项被实现:硬连线有限状态机、可编程微代码、可编程门阵列或者其他适合的控制电路。在备选示例中,可以由核110中的一个或多个核来执行控制单元功能。

控制单元160包括用于将指令块分配到处理器核110的调度器。如在此所使用的,调度器分配涉及用于引导指令块的操作的硬件,包括发起指令块映射、取指、译码、执行、提交、中止、空闲以及刷新指令块。在一些示例中,硬件接收使用计算机可执行指令所生成的信号,以引导指令调度器的操作。处理器核110在指令块映射期间被指派到指令块。指令操作的叙述阶段出于说明性目的,并且在所公开的技术的一些示例中,某些操作可以被组合、被省略、被分离为多个操作,或者被添加附加操作。

基于块的处理器100还包括时钟发生器170,其将一个或多个时钟信号分布到处理器内的各种部件(例如,核110、互连120、存储器接口140和i/o接口145)。在所公开的技术的一些示例中,所有部件共享共同时钟,而在其他示例中,不同的部件使用不同的时钟(例如,具有不同的时钟频率的时钟信号)。在一些示例中,时钟的一部分被选通以在处理器部件中的一些部件未被使用时允许功率节省。在一些示例中,时钟信号使用锁相环(pll)被生成以生成具有固定的恒定频率和占空比的信号。接收时钟信号的电路可以在单个边沿(例如,上升沿)上被触发,而在其他示例中,接收电路中的至少一些电路通过上升和下降时钟沿而被触发。在一些示例中,时钟信号可以光学地或无线地被传输。

iv.示例基于块的处理器核

图2是如可以在所公开的技术的某些示例中使用的进一步详述用于基于块的处理器100(并且特别地,基于块的处理器核(处理器核111)之一的实例)的示例微架构的块图200。为了便于解释,示例性的基于块的处理器核111被图示有五个阶段:指令取指(if)、译码(dc)、操作数取回、执行(ex)以及存储器/数据访问(ls)。然而,本领域的普通技术人员将容易地理解到,对所图示的微架构的修改(诸如添加/移除阶段、添加/移除执行操作的单元、以及其他实现细节)可以被修改为适合用于基于块的处理器的特定应用。

如图2所示,示例性处理器核111包括两个指令窗口210和211,每个指令窗口可以被配置为执行指令块。在其他示例中,不同数目的指令窗口是可能的,例如一个、四个、八个或其他数目的指令窗口。在所公开的技术的一些示例中,指令块是基于块的处理器指令的原子集合,其包括指令块头部和多个一条或多条指令。如将在下面进一步讨论的,指令块头部包括描述指令块的布置或组织的信息以及可用于进一步定义指令块内的多条指令中的一条或多条的语义的信息。取决于所使用的特定isa和处理器硬件,还可以在指令的执行期间使用指令块头部,并且通过例如允许指令和/或数据的早期取回、改善的分支预测、推测性执行、改善的能量效率以及改善的代码紧凑性来提高执行指令块的性能。指令块的指令可以是数据流指令,其明确地对指令块的生产者-消费者指令之间的关系进行编码。

处理器核111包括控制单元205,其使用头部译码器207译码关于指令块的信息,并且生成控制信号以调节核操作,并使用指令调度器206调度核111内的指令流。特别地,控制单元205可以对在处理器核111的一个或多个指令窗口(210、211)上执行的一个或多个指令块中的指令进行序列化。例如,可以通过取指、译码、操作数取回、执行和存储器/数据访问阶段来对每条指令进行序列化,从而指令块的指令可以被流水线化并且并行执行。如将在下面进一步讨论的,指令块可以被分成一个或多个分段或子块,以潜在地增加并行化核111的操作的机会。指令头部可以对每个分段的位置信息进行编码,从而可以并行取回和译码每个分段的指令。并行发生的操作是同时发生的操作。作为一个例子,当每个译码操作在同一时钟周期期间由不同的相应译码器执行时,可以并行发生两个译码操作。

可以由控制单元205和/或指令调度器206执行的操作可以包括对核的分配和去分配以用于执行指令处理;对任意核、寄存器文件、存储器接口140和/或i/o接口145之间的输入数据和输出数据的控制。控制单元205还可以处理硬件中断,并且控制特殊系统寄存器(例如,被存储在一个或多个寄存器文件中的程序计数器)的读取和写入。在所公开的技术的其他示例中,控制单元205、指令调度器206和/或取回和译码逻辑207使用非基于块的处理器核(例如,耦合到存储器的通用risc处理核)被实现。在一些示例中,控制单元205、指令调度器206和/或取回和译码逻辑207至少部分地使用以下各项中的一项或多项被实现:硬连线有限状态机、可编程微代码、可编程门阵列、或者其他适合的控制电路。取回和译码逻辑207可以取回并译码指令块内的指令头部和指令。

指令窗口210和211中的每个指令窗口可以从输入端口220、221和222(其连接到互连总线)中的一个或多个输入端口以及指令高速缓存227(其进而连接到指令译码器228和229)接收指令和数据。附加的控制信号还可以在附加的输入端口225上被接收。指令译码器228和229中的每个指令译码器对指令块的指令进行译码,并且将所译码的指令存储在被定位在每个相应的指令窗口210和211中的存储器存储库215和216内。如将在下面进一步讨论的(例如参考图10-11),相应的指令译码器228和229可以每个周期译码一条指令或每个周期并行译码多条指令。

处理器核111还包括耦合到l1(第一级)高速缓存235的寄存器文件230。寄存器文件230存储用于在基于块的处理器架构中定义的寄存器的数据,并且可以具有一个或多个读端口和一个或多个写端口。例如,寄存器文件可以包括用于将数据存储在寄存器文件中的两个或两个以上写端口,以及具有用于从寄存器文件内的个体寄存器读取数据的多个读端口。在一些示例中,单个指令窗口(例如,指令窗口210)可以一次访问寄存器文件的仅一个端口,而在其他示例中,指令窗口210可以访问一个读端口和一个写端口,或者可以同时访问两个或两个以上读端口和/或写端口。在一些示例中,寄存器文件230可以包括64个寄存器,寄存器中的每个寄存器保持32位的数据的字。(除非另外指定,否则本申请将把32位的数据称为字)。在一些示例中,寄存器文件230内的寄存器中的一些寄存器可以被分配为特殊目的。例如,寄存器中的一些寄存器可以被专用作系统寄存器示例,其包括存储常量值(例如,所有零字)、(一个或多个)程序计数器(pc)(其指示正被执行的程序线程的当前地址)、物理核数目、逻辑核数目、核分配拓扑、核控制标志、处理器拓扑或者其他适合的专用目的的寄存器。在一些示例中,存在多个程序计数器寄存器、一个或每个程序计数器,以允许跨一个或多个处理器核和/或处理器的多个执行线程的并发执行。在一些示例中,程序计数器被实现为指定存储器位置,而不是寄存器文件中的寄存器。在一些示例中,系统寄存器的使用可以由操作系统或者其他监督式计算机指令进行限制。在一些示例中,寄存器文件230被实现为触发器阵列,而在其他示例中,寄存器文件可以使用锁存器、sram或者其他形式的存储器存储装置被实现。针对给定处理器(例如,处理器100)的isa规格指定寄存器文件230内的寄存器如何被定义并且被使用。

在一些示例中,处理器100包括由多个处理器核共享的全局寄存器文件。在一些示例中,与处理器核相关联的个体寄存器文件可以被组合以静态地或者动态地形成较大的文件,这取决于处理器isa和配置。

如在图2中所示,指令窗口210的存储器存储库215包括若干译码的指令241、左操作数(lop)缓冲器242、右操作数(rop)缓冲器243以及指令记分板245。在所公开的技术的一些示例中,指令块中的每个指令被分解为一行译码的指令、左操作数和右操作数和记分板数据,如在图2中所示。译码的指令241可以包括被存储为位级控制信号的指令的部分或者完全译码的版本。操作数缓冲器242和243存储操作数(例如,从寄存器文件230接收到的寄存器值、从存储器接收到的数据、在指令内编码的中间操作数、由较早发出的指令计算的操作数、或者其他操作数值),直到其相应的译码的指令准备好执行。指令操作数从操作数缓冲器242和243被读取,而不是寄存器文件。

第二指令窗口211的存储器存储库216存储类似的指令信息(译码的指令、操作数和记分板)作为存储器存储库215,但是出于简单的原因在图2中未示出。指令块可以关于第一指令窗口由第二指令窗口211并发地或者顺序地执行,这受制于isa约束并且如由控制单元205引导。

在所公开的技术的一些示例中,前端流水线阶段if和dc可以从后端流水线阶段(is、ex、ls)运行去耦合。在一个实施例中,控制单元可以每时钟周期将两个指令取指并且译码到指令窗口210和211中的每个指令窗口中。在备选实施例中,控制单元可以每时钟周期将一个、四个或者另一数目的指令取指并且译码到对应数目的指令窗口中。控制单元205使用记分板245来提供指令窗口数据流调度逻辑以监测每个译码的指令的输入(例如,每个相应指令的(一个或多个)断言和(一个或多个)操作数)的就绪状态。当针对特定译码的指令的所有输入就绪时,指令准备好发出。控制逻辑205然后每周期发起一个或多个下一指令(例如,最低编号的就绪指令)的执行,并且其译码指令和输入操作数被发送到功能单元260中的一个或多个功能单元以用于执行。译码的指令还可以对若干就绪事件进行编码。控制逻辑205中的调度器接受来自其他源的这些和/或事件,并且更新窗口中的其他指令的就绪状态。因此执行从处理器核的111个就绪零输入指令开始,继续以零输入指令为目标的指令等。

译码指令241不需要以其被布置在指令窗口210的存储器存储库215内的相同次序被执行。相反,指令记分板245用于追踪译码的指令的依存性,并且当依存性已经被满足时,相关联的个体译码指令被调度用于执行。例如,当依存性已经针对相应指令被满足时,对相应指令的参考可以被推送到就绪队列上,并且指令可以从就绪队列以先进先出(fifo)次序被调度。被存储在记分板245中的信息可以包括但不限于相关联的指令的执行断言(诸如指令是否正等待要被计算的断言位,并且在断言位是真或者假的情况下指令是否执行)、操作数对于指令的可用性、或者在执行相关联的个体指令之前所要求的其他前提条件。

在一个实施例中,记分板245可以包括:译码就绪状态,其由指令译码器228初始化;以及活跃就绪状态,其在指令的执行期间由控制单元205初始化。例如,译码就绪状态可以编码相应指令是否已经被译码、等待断言和/或一些操作数(也许经由广播信道)、或者立即准备发出。译码活跃状态可以编码相应指令是否等待断言和/或一些操作数、是准备发出还是已经发出。译码就绪状态可以在块重置或者块刷新时被清除。在分支到新指令块时,译码就绪状态和译码活跃状态被清除(块或核被重置)。然而,当指令块在核上被重新执行时(诸如当其分支回到其自身(块刷新)),仅仅活跃就绪状态被清除。块刷新可以立即发生(当指令块分支到自身),或者在执行若干其他中间指令块之后发生。指令块的译码就绪状态可以因此被保留,使得其不需要重新取指并且译码块的指令。因此,块刷新可以用于节省循环和其他重复程序结构中的时间和能量。

被存储在每个指令窗口中的指令的数目通常对应于指令块内的指令的数目。在一些示例中,指令块内的指令的数目可以是32、64、128、1024或者另一数目的指令。在所公开的技术的一些示例中,跨处理器核内的多个指令窗口分配指令块。在一些示例中,指令窗口210、211可以被逻辑分区,使得多个指令块可以在单个处理器核上被执行。例如,可以在一个核上执行一个、两个、四个或者另一数目的指令块。相应的指令块可以彼此并发地或者顺序地被执行。

指令可以使用被定位在处理器核111内的控制单元205而被分配并且被调度。控制单元205安排来自存储器的对指令的取指、对执行的译码、在其已经被加载到相应的指令窗口时对指令的执行、进/出处理器核111的数据流,并且控制由处理器核输入和输出的信号。例如,控制单元205可以包括如上文所描述的就绪队列,以用于在调度指令中使用。可以原子地执行被存储在被定位在每个相应的指令窗口210和211中的存储器存储库215和216中的指令。因此,对由执行的指令影响的可见架构状态(诸如寄存器文件230和存储器)的更新可以本地缓存在核内直到指令被提交为止。控制单元205可以确定指令何时就绪以待提交,对提交逻辑序列化,并发出提交信号。例如,指令块的提交阶段可以在所有寄存器写入都被缓存时、在所有对存储器的写入都被缓存时、以及在分支目标被计算时开始。指令块可以在对可见架构状态的更新完成时被提交。例如,当寄存器写入被写入寄存器文件时,当存储被发送到加载/存储单元或存储器控制器时,以及当提交信号被生成时,可以提交指令块。控制单元205还至少部分地控制功能单元260到每个相应指令窗口的分配。

如在图2中所示,具有若干执行流水线寄存器255的第一路由器250用于将数据从指令窗口210和211中的任一指令窗口发送到功能单元260中的一个或多个功能单元,其可以包括但不限于整数alu(算术逻辑单元)(例如,整数alu264和265)、浮点单元(例如,浮点alu267)、移位/旋转逻辑(例如,桶型移位器268)或者其他适合的执行单元,其可以包括图形功能、物理功能和其他数学操作。来自功能单元260的数据可以然后通过第二路由器270被路由到输出290、291和292,路由返回到操作数缓冲器(例如,lop缓冲器242和/或rop缓冲器243),或者被馈送回到另一功能单元,这取决于特定指令被执行的要求。第二路由器270可以包括:加载/存储队列275,其可以被用于发出存储器指令;数据高速缓存277,其存储正从核被输出到存储器的数据;以及加载/存储流水线寄存器278。

核还包括控制输出295,其用于指示例如指令窗口210或者211中的一个或多个指令窗口的所有指令的执行何时已经完成。当指令块的执行完成时,指令块被指定为“提交的”并且来自控制输出295的信号可以进而可以由基于块的处理器100内的其他核和/或由控制单元160用于发起其他指令块的调度、取指和执行。第一路由器250和第二路由器270二者可以将数据发送回到指令(例如,作为用于指令块内的其他指令的操作数)。

如本领域的普通技术人员将容易理解到,个体核内的部件不限于图2中所示的那些部件,而是可以根据特定应用的要求而变化。例如,核可以具有更少或更多的指令窗口,单个指令译码器可以由两个或两个以上指令窗口共享,并且所使用的功能单元的数目和类型可以取决于用于基于块的处理器的特定目标应用而变化。在利用指令核选择并且分配资源时应用的其他考虑包括性能要求、能量使用要求、集成电路芯片、处理技术和/或成本。

对于本领域的普通技术人员而言将容易明显的,可以通过处理器核110的指令窗口(例如,指令窗口210)和控制逻辑205内的资源的设计和分配来在处理器性能中做出折中。面积、时钟周期、能力和限制实质上确定个体核110的实现性能和基于块的处理器核110的吞吐量。

指令调度器206可以具有不同的功能。在某些较高的性能示例中,指令调度器是高并发的。例如,每个周期(一个或多个)译码器将指令的译码就绪状态和译码指令写入到一个或多个指令窗口中,选择要发出的下一个指令,并且作为响应后端发送第二就绪事件——以特定指令的输入槽(断言、左操作数、右操作数等)为目标的任一目标就绪事件或者以所有指令为目标的广播就绪事件。每指令就绪状态位连同译码就绪状态可以用于确定指令准备好发出。

在一些示例中,指令调度器206使用存储装置(例如,先进先出(fifo)队列、内容可寻址存储器(cam))被实现,存储装置存储指示被用于根据所公开的技术调度指令块的执行的信息的数据。例如,关于指令依存性的数据、控制的传递、推测、分支预测和/或数据加载和存储被布置在存储装置中,以促进将指令块映射到处理器核中的确定。例如,指令块依存性可以与标签相关联,标签被存储在fifo或者cam中并且后续由用来将指令块映射到一个或多个处理器核的选择逻辑进行访问。在一些示例中,指令调度器206使用耦合到存储器的通用处理器被实现,存储器被配置为存储用于调度指令块的数据。在一些示例中,指令调度器206使用专用处理器或者使用耦合到存储器的基于块的处理器核被实现。在一些示例中,指令调度器206被实现为耦合到存储器的有限状态机。在一些示例中,在处理器(例如,通用处理器或者基于块的处理器核)上执行的操作系统生成优先级、断言和其他数据,其可以至少部分地用于利用指令调度器206来调度指令块。如本领域的普通技术人员将容易地理解到,在集成电路、可编程逻辑或者其他适合的逻辑中实现的其他电路结构可以用于实现用于指令调度器206的硬件。

在一些情况下,调度器206接受目标指令的事件,其尚未被译码并且还必须禁止已发出的就绪指令的重新发出。指令可以是非断言的、或者断言的(基于真或假条件)。断言的指令直到其由另一指令的断言结果作为目标时才变得就绪,并且该结果匹配断言条件。如果相邻的断言未匹配,则指令绝不发出。在一些示例中,断言指令可以推测地被发出并且被执行。在一些示例中,处理器可以随后检查推测地发出和执行的指令被正确地推测。在一些示例中,误推测的发出指令和消耗其输出的块中的指令的特定传递闭包可以被重新执行、或者被误推测取消的副作用。在一些示例中,对误推测的指令的发现导致整个指令块的完全回滚和重新执行。

v.示例指令块流

现在转到图3的示图300,图示了基于块的指令流的一部分310,包括若干可变长度指令块311-315(a-e)。指令流可以用于实现用于用户应用、系统服务、操作系统内核或者任何其他适合的用途的程序。在图3中所示的示例中,每个指令块从指令头部开始,其跟随有不同的数目的长度可变的指令。例如,指令块311包括头部320和十五条指令321。指令321包括具有一个字长度的指令(例如指令1、2、5和6)以及具有双字长度的指令(例如指令0、3、4和9)。指令的各种大小或长度都是可能的,例如包括16位、24位、32位、48位和64位指令。所图示的特定指令头部320包括部分地控制指令块内的指令的执行的若干数据字段,并且还允许改进的性能增强技术,包括例如并行取回和译码、分支预测、推测执行、惰性评估和/或其他技术。指令头部320还可以包括指示头部是指令头部而非指令的id位。

指令头部320包括指令块大小的指示。指令块大小可以被指定为地址或指令的数目。例如,指令块大小可以指定指令、字节、字或更大的指令数据块的数目大于一。作为具体示例,指令块大小可以指示包含于指令块内的4字数据块的数目。换句话说,为了压缩分配给指定指令块大小的头部空间,块的大小被移位4位。因此,大小值0表示最小大小的指令块,其是后面跟随有四个字或指令的块头部。在一些示例中,指令块大小被表示为字节数、字数、n字数据块的数目、地址、地址偏移,或者使用其他合适的表达来描述指令块的大小。在一些示例中,指令块的大小由指令块头部和/或脚部中的终止位模式指示。

指令321可以被组织成指令块311的一个或多个子块或分段,并且指令块头部320可以包括用于定位一个或多个子块的指定起始位置的信息。给定的子块可以包括具有两个或更多个不同长度的指令(例如,一些指令可以是32位长,一些指令可以是64位长,等等),并且指令可以被打包,从而在每个子块中可以存在不超过最大数目的指令。例如,isa可以为每个子块指定预先定义的最大数目的指令。另外或替代地,给定的子块可以包括单个长度的指令,并且不同子块可以具有不同长度的指令。在一个实施例中,可以部分地通过将指令块311的个体子块的大小相加来确定指令块大小。

指令块头部320还可以包括执行标志,其指示特殊指令执行要求。例如,取决于特定应用,分支预测或者存储器依存性预测可以针对某些指令块被禁止。

在所公开的技术的一些示例中,指令头部320包括指示编码数据是指令头部的一个或多个标识位。例如,在一些基于块的处理器isa,最低有效位空间中的单个id位总是被设定为二进制值1,以指示有效指令块的开始。在其他示例中,不同的位编码可以用于(一个或多个)标识位。在一些示例中,指令头部320包括指示相关联的指令块被编码所针对的isa的特定版本的信息。

指令块头部还可以包括用于在例如分支预测、控制流确定和/或坏跳检测中使用的若干块退出类型。退出类型可以指示分支指令的类型是什么,例如:顺序分支指令,其指向存储器中的下一相连的指令块;偏移指令,其是相对于偏移而计算的存储器地址处的另一指令块的分支;子例程调用、或者子例程返回。通过编码指令头部中的分支退出类型,分支预测器可以至少部分地在相同指令块内的分支指令已经被取指和/或被译码之前开始操作。

指令块头部320还包括存储掩码,其标识被指派到存储操作的加载存储队列标识符。指令块头部还可以包括写入掩码,其标识相关联的指令块将写入的(一个或多个)全局寄存器。相关联的寄存器文件必须在指令块可以完成之前接收对每个条目的写入。在一些示例中,基于块的处理器架构可以包括不仅标量指令,而且单指令多数据(simd)指令,这允许具有单个指令内的较大数目的数据操作数的操作。

vi.示例块指令目标编码

图4是描绘c语言源代码的两个部分410和415及其相应的指令块420和425(以汇编语言)的示例的示图400,这图示了基于块的指令可以如何显式地编码其目标。高级c语言源代码可以通过其目标是基于块的处理器的编译器被转换为低级汇编语言和机器代码。高级语言可以提取出底层计算机架构的许多细节,使得程序员可以聚焦于程序的功能。相反,机器代码根据目标计算机的isa来编码程序,使得其可以使用计算机的硬件资源在目标计算机上被执行。汇编语言是机器代码的人类可读形式。

在该示例中,前两个read指令430和431相应地以add指令432的右(t[2r])和左(t[2l])操作数为目标。在所图示的isa中,读指令是从全局寄存器文件(例如寄存器文件230)读取的唯一指令;然而,任何指令可以以全局寄存器文件为目标。当add指令432接收到这两个寄存器读取的结果时,其将变为就绪并且执行。

当tlei(测试小于等于立即(test-less-than-equal-immediate))指令433从add接收其单个输入操作数时,其将变为就绪并且执行。测试然后产生在信道一(b[1p])上广播到在广播信道上监听的所有指令的断言操作数,其在该示例中是两个断言的分支指令(bro_t434和bro_f435)。接收匹配断言的分支将激发。

指令块420的依存性图形440还被图示为指令节点阵列450和其对应的操作数目标455和456。这图示了块指令420、对应的指令窗口条目以及由指令所表示的底层数据流程图之间的对应性。此处,译码指令read430和read431准备好发出,因为其不具有输入依存性。当其发出并且执行时,从寄存器r6和r7读取的值被写入到add432的右操作数缓冲器和左操作数缓冲器中,这使得add432的左操作数和右操作数“就绪”。因此,add432指令变为就绪、发出到alu、执行,并且之和被写入到tlei433的左操作数。

作为比较,传统的乱序risc或者cisc处理器将使用附加的硬件复杂性、功率、面积并且减少时钟频率和性能来在运行时建立依存性图形。然而,依存性图形在编译时是静态地已知的并且edge编译器可以通过isa直接地编码指令之间的生产者-消费者关系,这使得微架构免于动态地重新发现他们。这可以潜在地实现更简单的微架构,减少面积、功率和升压频率和性能。

vii.示例基于块的指令格式

图5是图示用于指令头部510、通用指令520和分支指令530的指令格式的一般化示例的示图。指令头部或者指令中的每一个根据位数而被标记。例如,指令头部510包括四个32位的字并且从其最低有效位(lsb)(位0)被标记直到其最高有效位(msb)(位127)。如所示出的,指令头部包括写入掩码字段(位64-127)、存储掩码字段(位32-63)、多个分段字段(seg.0-seg.n)、多个退出类型字段、多个执行标志字段、指令块大小字段和指令头部id位(指令头部的最低有效位,例如位0)。

分段字段可以用于确定指令块内的一个或多个分段的起始位置。例如,相应的分段字段可以指示对应分段的大小(例如,字节、字或指令的数目)或(例如,从指令块的开始,从指令头部的末尾,从前一个分段等)到分段的偏移。各种类型的分段是可能的,例如具有最大数目的统一或可变长度指令的分段;以及具有可变数目的统一长度指令的分段。给定的isa可以实现单一类型的分段,或者可以使用多种类型的分段。例如,指令头部中的分段类型字段可以指示用于指令块的分段的类型。可以为给定的isa定义用于相应分段字段的位数。例如,位数可以是指令块的分段数目、每个分段的最大指令数目和分段的粒度的函数。

退出类型字段包括可以用于指示被编码在指令块内的控制流指令的类型的数据。例如,退出类型字段可以指示指令块包括以下各项中的一项或多项:顺序分支指令、偏移分支指令、间接分支指令、调用指令、和/或返回指令。在一些示例中,分支指令可以是用于在指令块之间传递控制流的任何控制流指令,包括相对地址和/或绝对地址,并且使用有条件的断言或者无条件的断言。除了确定隐式控制流指令之外,退出类型字段可以用于分支预测和推测执行。在一些示例中,多达六种退出类型可以被编码在退出类型字段中,并且字段与对应的显式或者隐式控制流指令之间的对应性可以通过例如检查指令块中的控制流指令而被确定。

所图示的通用块指令520被存储为一个32位的字,并且包括操作码字段、断言字段、广播id字段(bid)、第一目标字段(t1)、以及第二目标字段(t2)。对于具有比目标字段更大的消费者的指令而言,编译器可以使用移动指令来构建扇出树,或者其可以将高扇出指令指派到广播。广播支持通过轻量网络将操作数发送到核中的任何数目的消费者指令。广播标识符可以被编码在一般块指令520中。

虽然由通用指令520概述的通用指令格式可以表示由基于块的处理器处理的一些或全部指令,但是本领域的技术人员将容易理解到,即使对于isa的特定示例而言,指令字段中的一个或多个指令字段也可以偏离用于特定指令的通用格式。操作码字段指定指令520的长度或宽度以及由指令520执行的(一个或多个)操作,诸如存储器读取/写入、寄存器加载/存储、加法、减法、乘法、除法、移位、旋转、系统操作或者其他适合的指令。断言字段指定指令在其下将执行的条件。例如,断言字段可以指定值“真”,并且指令将仅在对应的条件标志匹配指定的断言值的情况下执行。在一些示例中,断言字段至少部分地指定哪一个被用于比较断言,而在其他示例中,执行在由先前指令(例如,指令块中的先前指令)设定的标志上被断定。在一些示例中,断言字段可以指定指令将总是或者绝不被执行。因此,断言字段的使用可以通过减少分支指令的数目来允许更密集的目标代码、改进的能量效率以及改进的处理器性能。

目标字段t1和t2指定基于块的指令的结果被发送到的指令。例如,在指令槽5处的add指令可以指定其计算结果将被发送到槽3和10处的指令。取决于特定指令和isa,所图示的目标字段之一或二者可以由其他信息替换,例如,第一目标字段t1可以由中间操作数、附加操作码、指定两个目标等来替换。

分支指令530包括操作码字段、断言字段、广播id字段(bid)以及偏移字段。操作码和断言字段在如关于通用指令所描述的格式和功能方面是类似的。偏移可以以四个指令为单位被表达,因此扩展在其上可以执行分支的存储器地址范围。利用通用指令520和分支指令530示出的断言可以用于避免指令块内的附加分支。例如,特定指令的执行可以根据先前指令的结果(例如,两个操作数的比较)被断定。如果断言是假的,则指令将不提交由特定指令计算出的值。如果断言值未匹配所要求的断言,则指令不发出。例如,bro_f(断言假)指令将发出其是否被发送假断言值。

应当容易理解到,如在此所使用的,术语“分支指令”不限于将程序执行改变到相对存储器位置,而且包括跳跃到绝对或者符号存储器位置、子例程调用和返回,以及可以修改执行流的其他指令。在一些示例中,通过改变系统寄存器(例如,程序计数器pc或者指令指针)的值来修改执行流,而在其他示例中,可以通过修改被存储在存储器中的指定位置处的值来改变执行流。在一些示例中,跳跃寄存器分支指令用于跳跃到被存储在寄存器中的存储器位置。在一些示例中,分别使用跳跃和链接以及跳跃寄存器指令来实现子例程调用和返回。

对于给定的isa,各种其他指令格式是可能的。例如,长度为24位、48位和/或64位的指令格式是可能的,并且可以通过为不同长度的指令提供不同的操作码来区分。例如,可以通过移除一个目标字段并改变23位指令的操作码,来将通用块指令520从32位长度修改为23位长度。可能需要在字节边界上保留指令宽度,因此第24位可用于附加功能或保持为保留位。作为另一例子,通过增加额外的目标字段并改变较大指令的操作码,可以将块指令520从32位长度修改为更大的位长度。更大的指令长度也可以允许更大的立即值。

viii.处理器核的示例状态

图6是图示基于块的处理器的计算机核的状态600的进展的示例的流程图。基于块的处理器包括共同地用于运行或者执行软件程序的多个处理器核。程序可以以各种高级语言被编写,并且然后使用以基于块的处理器为目标的编译器针对基于块的处理器而被编译。编译器可以发射当在基于块的处理器上被运行或者被执行时将执行由高级程序指定的功能的代码。编译代码可以被存储在可以由基于块的处理器访问的计算机可读存储器中。编译代码可以包括被分组为一系列指令块的可变长度的指令的流。指令块可以被进一步分组到子块或分段中。在执行期间,指令块中的一个或多个可以由基于块的处理器执行以执行程序的功能。通常,程序将包括比在任一时间可以在核上执行的指令块更多的指令块。因此,程序的块被映射到相应核,核执行由块指定的工作,并且然后相应核上的块利用不同块被替换直到程序完成。指令块中的一些指令块可以被执行超过一次(诸如在程序的循环或者子例程期间)。可以针对每次指令块将被执行时创建指令块的“实例”。因此,指令块的每个重复可以使用指令块的不同实例。当程序运行时,基于架构约束、可用硬件资源和程序的动态流动,相应的指令块可以被映射到处理器核并且在处理器核上执行。在程序的执行期间,相应的处理器核可以通过状态600的进展进行转变,使得一个核可以处于一个状态并且另一核可以处于不同的状态。

在状态605处,相应的处理器核的状态可以是未映射。未映射处理器核是当前未被指派以执行指令块的实例的核。例如,处理器核可以在程序开始基于块的计算机上的执行之前是未映射。作为另一示例,处理器核可以在程序开始执行但是并非所有核正被使用之后是未映射的。特别地,程序的指令块至少部分地根据程序的动态流动而被执行。程序的一些部分可以总体上串行地或者顺序地流动(诸如当后续的指令块取决于来自较早的指令块的结果时)。程序的其他部分可以具有更多平行流,诸如当在不使用并行执行的其他块的结果的情况下多个指令块可以同时执行时。较少的核可以用于在程序的更多顺序流期间执行程序,并且较多的核可以用于在程序的更多并行流期间执行程序。

在状态610处,相应的处理器核的状态可以是映射。映射的处理器核是当前被指派以执行指令块的实例的核。当指令块被映射到特定处理器核时,指令块在运行中。运行中的指令块是以基于块的处理器的特定核为目标的块,并且块将或正在推测地或者非推测地在特定处理器核上执行。特别地,运行中的指令块对应于被映射到状态610-650中的处理器核的指令块。在程序将使用由执行指令块提供的工作的块映射期间块是已知的时,块非推测地执行。在映射程序将使用或将不使用由执行指令块所提供的工作期间块是未知的时,块推测地执行。推测地执行块能够潜在地提高性能(诸如当比在已知块的工作将被使用之后或之时块将被开始的情况下更早地开始推测块时)。然而,推测地执行可以潜在地增加当执行程序时(诸如当推测工作未由程序使用时)使用的能量。

基于块的处理器包括有限数目的同构或者异构处理器核。典型的程序可以包括比可以适配到处理器核上更多的指令块。因此,程序的相应指令块将通常与程序的其他指令块共享处理器核。换句话说,给定核可以在程序的执行期间执行多个不同的指令块中的指令。具有有限数目的处理器核还意味着在所有处理器核忙于执行指令块并且没有新核可用于分派时,程序的执行可以停止或者被延迟。当处理器核变得可用时,指令块的实例可以被映射到处理器核。

指令块调度器可以指派哪个指令块将在哪个处理器核上执行并且指令块何时将被执行。映射可以基于各种因素,诸如将被用于执行的目标能量、处理器核的数目和配置、处理器核的当前和/或先前使用、程序的动态流、推测执行是否被启用、推测块将被执行的置信度水平以及其他因素。指令块的实例可以被映射到当前可用的处理器核(诸如当没有指令块当前正在其上执行时)。在一个实施例中,指令块的实例可以被映射到当前繁忙的处理器核(诸如当核正执行指令块的不同实例时),并且后续映射的实例可以在较早映射的实例完成时开始。

在状态620,可以取回相应处理器核的状态。例如,处理器核的if流水线阶段在取回状态期间可以是活跃的。取回指令块可以包括将块从存储器(例如l1高速缓存、l2高速缓存或主存储器)传送到处理器核,并且从处理器核的本地缓冲器读取指令,以使得指令可以被译码。例如,指令块的指令可以被加载到处理器核的指令高速缓存、缓冲器或寄存器中。可以在同一时钟周期期间并行地(例如,同时)取回来自一个或多个分段的多条指令。取指状态可以是多个周期长并且可以与在处理器核被流水线化时的译码(630)和执行(630)状态重叠。

当指令块中的指令被加载到处理器核上时,指令块驻留在处理器核上。指令块在指令块的一些但非所有指令被加载时部分驻留。指令块在指令块中的所有指令被加载时完全驻留。指令块将驻留在处理器核上,直到处理器核被重置或者不同的指令块被取指到处理器核上。特别地,当核处于状态620-670时,指令块驻留在处理器核中。

在状态630处,相应的处理器核的状态可以是译码。例如,处理器核的dc流水线阶段可以在取指状态期间是活跃的。在译码状态期间,指令块中的指令正在被译码,使得其可以被存储在处理器核的指令窗口的存储器存储库中。特别地,指令可以从相对地紧凑的机器代码被转换为可以用于控制处理器核的硬件资源的较不紧凑的表示。可以在同一始终周期期间并行地对来自一个或多个分段的多条指令进行译码。译码状态可以是多个周期长,并且可以与在处理器核被流水线化时的取指(620)和执行(630)状态重叠。在指令块的执行被译码之后,其可以在指令的所有依存性被满足时被执行。

在状态640处,相应处理器核的状态可以是执行。在执行状态期间,指令块中的指令正被执行。特别地,处理器核的ex和/或ls流水线阶段可以在执行状态期间是活跃的。指令块可以推测地或者非推测地执行。推测块可以执行到完成或者其可以在完成之前被终止(诸如当确定由推测块执行的工作将不被使用时)。当指令块被终止时,处理器可以转变为中止状态。当确定块的工作将被使用时(例如,所有寄存器写入被缓冲,对存储器的所有写入被缓冲,并且分支目标被计算),推测块可以完成。当例如所有寄存器写入被缓冲、对存储器的所有写入被缓冲并且分支目标被计算时,非推测块可以执行到完成。执行状态可以是多个周期长,并且可以与在处理器核被流水线化时的取指(620)和译码(630)状态重叠。当指令块完成时,处理器可以转变为提交状态。

在状态650处,相应的处理器核的状态可以是提交或者中止。在提交期间,指令块的指令的工作可以原子地被提交,使得其他块可以使用指令的工作。特别地,提交状态可以包括其中本地缓冲架构状态被写入到由其他处理器核可见或者可访问的架构状态的提交阶段。当可见架构状态被更新时,提交信号可以被发出并且处理器核可以被释放,使得另一指令块可以在处理器核上被执行。在中止状态期间,核的流水线可以被停止以减少动态功率耗散。在一些应用中,核可以功率选通来减少静态功率耗散。在提交/中止状态的结束处,处理器核可以接收在处理器核上待执行的新的指令块,核可以被刷新,核可以被空闲,或者核可以被重置。

在状态660处,可以确定驻留在处理器核上的指令块是否可以被刷新。如在此所使用的,指令块刷新或者处理器核刷新意味着使得处理器核能够重新执行驻留在处理器核上的一个或多个指令块。在一个实施例中,刷新核可以包括重置针对一个或多个指令块的活跃就绪状态。当指令块是循环或者重复的子例程的一部分时或者当推测块被终止并且将被重新执行时,在相同处理器核上重新执行指令块可以是期望的。刷新的决策可以由处理器核自身(连续的重新使用)或者由处理器外部(非连续的重新使用)做出。例如,刷新的决策可以来自另一处理器核或者执行指令块调度的控制核。当与在不同核上执行指令块相反在已经执行指令的核上刷新指令块时,可以存在潜在能量节省。能量被用于对指令块中的指令取指并且译码,但是刷新块可以通过旁路这些状态来节省取指和译码状态中使用的大部分能量。特别地,刷新块可以在执行状态(640)时重新开始,因为已经由核取指并且译码指令。当块被刷新时,译码指令和译码就绪状态可以被维持,同时活跃就绪状态被清除。刷新指令块的决策可以作为提交操作的一部分或在后续时间发生。如果指令块未被刷新,则处理器核可以是空闲的。

在状态670处,相应的处理器核的状态可以是空闲。基于在给定时间活跃的处理器核的数目,基于块的处理器的性能和功耗可以潜在地被调节或者被折中。例如,如果推测误预测速率很高,则在并行地运行的核上执行推测工作可以增加计算的速度而不是增加功率。作为另一示例,在提交或者中止较早执行的指令块之后立即向处理器地指派新指令块可以增加并行地执行的处理器的数目,但是可以减少重新使用驻留在处理器核上的指令块的机会。重新使用可以在空闲处理器核的高速缓存或者池被维持时增加。例如,当处理器核提交常用的指令块时,处理器核可以被放置在空闲池中,使得核可以在下次相同指令块将被执行时被刷新。如上文所描述的,刷新处理器核可以节省用来对驻留指令块取指和译码的时间和能量。在空闲高速缓存中放置的指令块/处理器核可以基于由编译器执行的静态分析或者由指令块调度器执行的动态分析而被确定。例如,指示指令块的潜在重新使用的编译器提示可以被放置在块的头部中,并且指令块调度器可以使用提示来确定块是将空闲还是在提交指令块之后被重新分配到不同的指令块。当空闲时,处理器核可以被放置在低功率状态中以减少例如动态功率消耗。

在状态680处,可以确定驻留在空闲处理器核上的指令块是否可以被刷新。如果核要被刷新,则块刷新信号可以被声明并且核可以转变为执行状态(640)。如果核不将被刷新,则块重置信号可以被声明并且核可以转变为未映射状态(605)。当核被重置时,核可以被放入具有未映射核的池中,使得指令块调度器可以将新指令块分配到核。

ix.基于块的编译器方法的示例

图7是图示用于编译到基于块的计算机架构的示例方法700的流程图。方法700可以被实现于在基于块的处理器或者常规处理器上执行的编译器的软件中。编译器可以在一个或多个阶段或者传递中将程序的高级源代码(诸如c、c++或java)转换为在目标基于块的处理器上可执行的低级目标或者机器代码。例如,编译器阶段可以包括:词法分析,用于从源代码生成标记流;语法分析或解析,用于将标记流与源代码语言的语法进行比较并生成语法或解析树;语义分析,用于在语法树上执行各种静态检查(例如类型检查,检查变量被声明等等)并且生成注释的或抽象的语法树;根据抽象语法树生成中间代码;对中间代码进行优化;以及机器代码生成,用于根据中间代码产生用于目标处理器的机器代码。机器代码可以被存储到基于块的处理器的存储器中,使得基于块的处理器可以执行程序。

在过程框710处,可以将指令分组到以在基于块的处理器上执行为目标的指令块中。例如,编译器可以生成机器代码作为顺序的指令流,其可以根据基于块的计算机的硬件资源和数据以及代码的控制流而被分组为指令块。例如,给定指令块可以包括单个基本块、基本块的一部分或者多个基本块,只要指令块可以在isa和目标计算机的硬件资源的约束内被执行。基本块是代码块,其中控制可以仅在块的第一指令处进入块,并且控制可以仅在基本块的最后指令处离开块。因此,基本块是一起执行的指令的序列。使用断言的指令可以将多个基本块组合为单个指令块,从而将指令块内分支转换为数据流指令。

指令可以被分组以使得不超出和/或有效利用处理器核的资源。例如,处理器核可以包括固定数目的资源,如一个或多个指令窗口、固定数目的加载和存储队列条目等。可以对指令进行分组,以使每组的指令少于指令窗口内可用的指令。例如,指令窗口可以具有用于32条指令的存储容量,第一基本块可以具有8条指令,并且第一基本块可以有条件地分支到具有23条指令的第二基本块。两个基本块可以被分组在一起成为一个指令块,从而该组包括31条指令(小于32-指令容量),并且第二基本块的指令在分支条件为真时被断言。作为另一例子,指令窗口可以具有用于32条指令的存储容量,并且基本块可以具有38条指令。前31条指令可以被分组到具有无条件分支(第32条指令)的一个指令块中,接下来的7条指令可以被分组到第二指令块中。作为另一例子,指令窗口可以具有用于32条指令的存储容量,并且循环体可以包括八条指令并且被重复三次。分组可以包括通过将循环体的多次迭代组合在更大的循环体内来展开循环。通过展开循环,可以增加指令块中的指令数目,并且潜在地可以更有效地利用指令窗口资源。

在过程框720处,可以将相应指令块的指令分组到相应指令块的分段中。分段的数目和组织可以由目标基于块的处理器的isa定义。分段是用于指令的一个连续范围的存储位置。因此,指令块可以包括指令头部和指令,其中指令被组织成与指令头部相关联的一个或多个分段。在一个实施例中,分段位于紧接在指令头部之后的存储位置中,从而指令块可以存储于存储器的连续部分中。例如,分段可以在不同的边界上开始或对齐,例如字节、字或双字边界。每个分段可以包括固定数目或可变数目的指令以及固定量或可变量的存储位置。分段内的指令可以具有统一长度或不同长度。分段内的指令可以被紧密打包,从而分段内的所有字节都是指令的一部分。替代地,在指令之间或分段末端可以有填充(非指令字节),例如帮助在指令块内或指令块之间进行对齐。例如,可能需要减少填充量以便可以将指令打包在较小的存储器占用空间中,这可以增加高速缓存局部性和/或减少存储器存取时间。

可以至少基于顺序指令流内的指令的顺序、指令的长度或大小、指令的依赖性或资源需求、分段的对齐考虑、指令块的指令数目和/或给定分段内的其他指令的性质(例如指令块的控制流)来将特定指令指派给分段。在一个例子中,可以按照与指令在顺序指令流中被排序的顺序相同顺序将指令指派给分段。例如,指令块的前八条指令可以被指派给第一分段,接下来的八条指令可以被指派给第二分段,以此类推。因此,指令块内的分段的数目可以变化,其中与具有较少数目指令的指令块相比,具有较多数目指令的指令块可以包括更多的分段。

作为另一例子,可以将指令指派给分段,使得分段以高利用率被打包和/或在存储器中被对齐。作为具体例子,每个分段可以包括最大数目的指令,并且指令可以被打包到分段中。例如,每个分段的指令的最大数目可以是由isa预先定义的数目。将指令打包到分段中可以包括为每个分段指派最大数目的指令,使得可能除了最后的分段之外的所有分段都具有最大数目的指令。作为具体例子,指令块可以包括30条指令,每个分段的指令的最大数目可以是8条指令。可以将指令打包到分段0-2中,导致分段0-2具有8条指令,而分段3具有6条指令。这里,最后的分段(分段3)被指派了指令块的总指令数取每个段的最大指令数的模。作为另一具体例子,指令块可以包括16条指令,并且每个分段的最大指令数可以是8条指令。可以将指令打包到分段0-1中,导致分段0-1中的每一个恰好具有8条指令。这里,指令块的指令数除以每个分段的最大指令数是一个整数(例如,它可被整除),因此所有指派的分段具有最大数目的指令。在打包指令块时,一些分段可能不会被指派任何指令,例如当指令块的指令数目与处理器核的指令窗口的大小相比相对较小时。

作为另一例子,可以将指令打包到分段中,使得指令被高效地打包在分段内和/或在字或双字边界上对齐。例如,通过按照指令宽度和对齐宽度的最小公倍数(lcm)的倍数来对指令进行分组,可以将给定长度或宽度的指令高效地打包到分段中。作为具体例子,isa可以包括24位、32位、48位和64位指令,并且分段可以在32位或64位边界上对齐(例如,对齐宽度是32位或64位)。24、32、48和64的lcm是192,对应于三条64位指令,四条48位指令,六条32位指令和八条24位指令。24、32和48的最小公倍数(lcm)是96,对应于两条48位指令,三条32位指令和四条24位指令。因此,将四条24位指令打包到给定分段中可能比仅将一条或三条24位指令打包到给定分段中导致更高效的打包。当将可变长度指令打包到分段中时,指令混合可能无法实现最佳打包,因此可将填充字节添加到分段的末尾,从而对齐下一分段。

作为另一例子,指令块可以包括不同长度的指令,但是给定分段内的所有指令可以是相同的长度。因此,不同的相应分段可以具有不同长度的指令。例如,第一分段可以仅包括24位长度的指令,第二分段可以仅包括32位长度的指令,第三分段可以仅包括48位长度的指令,并且第四分段可以仅包括64位长度的指令。另外,一些分段可以具有相同长度的指令。例如,如果32位指令是最常见的指令,则可以将指令块的24位、48位和64位指令分别指派给它们自己相应的分段(例如,分段0、1和2),并且可以将32位指令指派给多个分段(例如,分段3和更高段)。

作为另一例子,可以基于指令块的控制流将指令分组到分段中。例如,可以将彼此独立的指令指派给不同的分段。因此,当来自不同分段的指令被并行取回并译码时,如果它们是独立的,则这些指令也可以并行执行。

应该注意,与传统的risc型处理器相比,基于块的处理器的指令潜在地可以被更自由地重新排序(例如,放置在指令块的不同分段中)。对于基于块的处理器,指令的任何块内依赖性在指令内被明确编码,并且指令将不会执行直到指令的依赖性得到满足。因此,取回和译码顺序可能不那么重要,因为通过指令的明确编码的依赖性来启用正确的程序操作。相比之下,对针对传统risc型处理器的指令进行重新排序的灵活性较低,这是因为这些指令没有明确编码的依赖性。相反,传统指令通过共享寄存器文件或存储器传递值,并且如果在执行程序期间乱序执行指令,则重新排序指令可能导致违反依赖性。

在过程框730处,可以为相应的指令块生成指令块头部。例如,指令块头部可以以由目标基于块的处理器的isa定义的格式进行编码。指令块头部可以包括用于确定指令块的分段数目、指令块内的分段的指定起始位置以及当isa支持多种类型的分段时分段类型的格式的信息。例如,第一分段类型可以允许分段内的可变长度指令,并且第二分段类型可以仅允许分段内的统一长度指令。指令头部中的标志可以用于对给定指令块的分段类型进行编码(例如,1可以用于指示具有可变长度指令的分段,并且0可以用于指示具有统一长度指令的分段)。

指令块的分段数目可以在与指令块相关联的指令块头部中进行编码。在一个例子中,头部内的字段可以指示指令块的分段数目。可以基于isa所支持的最大分段数目来选择字段的大小。例如,可以使用三位来编码八个数字。在另一例子中,指令块的相应分段可以在头部内具有分段字段以指示分段的指令数目或者到分段或到下一分段的偏移。可以根据非零分段字段的数目来计算指令块的分段数目。

可以使用指令块头部的分段字段来对指令块内的分段的起始位置进行编码。根据isa的管理,用于每个分段字段的位数可以基于每个分段允许的最大指令数目。因此,如果指令头部位短缺,则可以在分段的数目和每个分段的最大指令数目之间进行权衡。例如,可以存在n个分段字段用于编码n个或n+1个分段的起始位置。

在一个实施例中,每个分段字段可以指示其对应分段的大小。作为具体例子,isa可以支持每个指令块四个分段,并且给定的指令块包括分段0中的4条指令,分段1中的10条指令,分段2中的5条指令,以及分段3中的0条指令。每个分段字段可以是至少四位宽,并且分段字段0-3可以分别用值4、10、5和0进行编码。由于三个分段字段的值非零,因此指令块的分段的数目为三。在该实施例中,n个分段字段被用于编码n个分段的大小。

在另一实施例中,每个分段字段可以指示到其对应分段的偏移。分段0可以由isa指定为从指令头部之后的第一地址开始。因此,由于分段0的位置由isa定义,所以分段0可以没有对应的分段字段。分段1可以在分段0之后在下一可用地址处直接开始和/或与分段0之后的边界对齐。基于分段0的指令的数目和大小来确定分段0的大小。分段1的起始位置可以被编码为从指令头部的末尾起的偏移,并且可以取决于分段0的大小。因此,在对应于分段1的分段字段中编码的偏移可以考虑分段0的大小以及任何对齐填充。类似地,基于较低或较早分段的指令的数目和大小来确定较高或较晚分段的起始位置。例如,相应分段的偏移都可以相对于指令头部的末尾(例如,使得更容易译码),或者可以相对于前一分段的末尾(例如,用于更复杂的译码,但更紧凑的编码)。

在过程框740处,可以针对要在基于块的处理器上执行的指令块发出目标代码。例如,指令块可以以由目标基于块的处理器的isa定义的格式发出。在一个实施例中,可以发出相应的指令块,使得指令(被按照分段进行分组)顺序地跟随指令块的指令头部。与程序关联的不同指令块可以按各种顺序被发出。作为一个例子,指令块可以按照在对程序的依赖图进行深度优先或宽度优先遍历时遇到它们的顺序而被发出。在替代实施例中,指令头部可以在一个流中被发出,并且指令可以在不同的流中被发出。

在过程框750处,所发出的目标代码可以被存储在计算机可读存储器或者存储设备中。例如,所发出的目标代码可以被存储到基于块的处理器的存储器中,使得基于块的处理器可以执行程序。作为另一示例,所发出的目标代码可以被加载到存储设备(诸如基于块的处理器的硬盘驱动器),使得基于块的处理器可以执行程序。在运行时,所发出的目标代码的全部或一部分可以从存储设备中获取并被加载到基于块的处理器的存储器中,从而基于块的处理器可以执行该程序。

图8-图9是针对基于块的处理器的指令块内的可变长度指令的不同布置的示例。图8-图9的指令块例如可以由方法700生成。图8是指令块的例子,其中相应分段可以具有可变长度指令,并且分段被打包以具有最大数目的指令,其中最大值由isa预先定义。图9是具有可变长度指令的指令块的例子,其中相应分段内的所有指令具有相同的长度。

转到图8的例子,指令块800包括指令头部810和指令820。指令820被布置或分组成三个子块或分段830、840和850。在该指令块中有23条指令,并且每分段的最大指令数目是八条指令。前两个分段各自具有八条指令,其中分段830具有三个双字指令(指令0、3和4)和五个单字指令(指令1-2和5-7);分段840具有两个双字指令和六个单字指令。最后一个分段850只有7条指令(23条指令取8的模,8是每分段的最大指令数目),其中4条指令是子字指令(例如在使用32位字大小时的24位指令),1条指令是双字指令,并且2条指令是字指令。

在这个例子中,对指令进行分组,使得分段830、840、850在字边界上对齐,并且在分段830、840、850内没有填充。分段830在指令头部之后在地址0x0000处立即开始。在这个例子中,地址是字节可寻址的,并且字大小是四个字节(32位),因此对于每个字地址增加四。地址可以用基数16或十六进制数字(用0x前缀指示)表示或用基数10或十进制数字(用无前缀指示)表示。分段830中的指令占用44个字节,因此分段840的起始地址是0x002c(十进制44)。分段840中的指令占用40个字节,因此从分段840的开始到分段850的开始的偏移是0x0028。分段850的起始地址是0x0054(十进制数44+40)。

指令头部810可以包括用于确定指令块800内的分段的起始位置的信息。特别地,指令头部810可以包括分段字段860和870以分别指示分段840和850的起始位置。作为一个例子,分段字段860可以用值0x002c编码以指示分段840开始于地址0x002c,并且分段字段870可以用值0x0054编码以指示分段850开始于地址0x0054。这里,分段字段中的偏移是相对于共同起始位置(指令头部的末尾或指令的开始)测量的。作为另一例子,分段字段860可以用值0x002c编码以指示分段840开始于地址0x002c,并且分段字段870可以用值0x0028编码以指示分段850开始于地址0x0054。这里,分段字段中的偏移是相对于前一分段的起始位置测量的。当相对于前一分段的起始位置测量位置时,可以使用较少的位来编码起始位置。使用更少的位可能是可取的,以减小指令头部的大小。作为又一例子,可以使用字地址而不是字节地址对偏移进行编码,例如当isa指定分段在字边界上对齐时。字地址可以用比字节地址少两位的位来编码。因此,使用字地址和与前一分段的偏移,分段字段860可以用值0x000b编码以指示分段840开始于字节地址0x002c,并且分段字段870可以用值0x000a编码以指示分段850开始于字节地址0x0054。

图9示出了在指令块内布置可变长度指令的示例,其与图8中的例子不同。具体地,图9的指令820与图8的指令820相同,但是指令820在图9中被不同地分组。图9示出了具有可变长度指令820的指令块900的例子,其中相应分段内的所有指令具有相同长度。指令块900包括指令头部910和指令820。指令820被布置或分组为三个分段930、940和950。第一分段930仅由双字指令组成并且包括六条指令;第二分段940仅由单字指令组成并且包括十三条指令;且第三分段950仅由子字指令(例如,24位指令)组成并且包括四条指令。

在这个示例中,指令被分组,从而分段930、940、950在字边界上对齐,并且在分段930、940、950内没有填充。分段930在指令头部之后在字节地址0x0000处直接开始。分段930中的指令占用48个字节(6条指令*8字节/指令),所以分段940的起始地址是0x0030(十进制的48)。分段940中的指令占用52个字节,所以从分段940的开始到分段950的开始的偏移是0x0028。分段950的起始地址是0x0064(十进制48+52)。

指令头部910可以包括用于确定指令块900内的分段的起始位置的信息。在一个实施例中,如参考图8所描述的,可以对分段的起始位置进行编码,其中分段字段用于使用字节或字地址对从指令头部的末尾起或从前一分段的开始起的偏移进行编码。

在替代实施例中,可以通过在分段字段中对每个分段的字节计数、字计数或指令计数进行编码来确定分段的起始位置。特别地,指令头部910可以包括分段字段960、970和980,以分别指示分段930、940和950的字节计数、字计数或指令计数。如果isa允许不同大小的指令占用特定分段,则字节计数或字计数对于编码对应的分段字段可能是期望的。然而,如果只有单个大小的指令可以占用特定分段,则对于编码对应的分段字段可能需要指令计数。作为一个例子,分段字段960可以用值0x0030编码以指示分段930包括48字节的指令,用值0x000c编码以指示分段930包括12字的指令,或者用值0x0006编码以指示分段930包括6条指令。作为另一例子,分段字段970可以用值0x0034编码,以指示分段940包括52字节的指令,用值0x000d编码以指示分段940包括13字的指令,或者用值0x000d编码以指示分段940包括13条指令。这里,由于指令具有单字长度,因此字的数目和指令的数目相同。作为另一例子,分段字段980可以用值0x000c编码以指示分段950包括12字节的指令,用值0x0003编码以指示分段950包括3字的指令,或者用值0x0004编码以指示分段950包括4条指令。在该例子中,由于指令具有子字长度,所以字的数目小于指令的数目。

通过加上给定分段之前的任何分段的大小以获得给定分段的偏移,可以从分段字段确定给定分段的起始位置。例如,分段930在它之前没有分段,所以它从字节地址0x0000开始。分段940之前是分段930,所以分段940的起始字节地址可以通过加上分段930的大小来得到字节地址0x0030而被计算出。分段950之前是分段930和940,所以分段950的起始字节地址可以通过将分段930和940的大小相加来获得字节地址0x0064而被计算出。

分段930、940、950可以以各种顺序布置。例如,可以对分段进行排序,使得具有较大大小的指令的分段在具有较小大小的指令的分段之前。作为另一例子,可以对分段进行排序,使得具有长度可被对齐宽度整除的指令的分段在具有长度不能被对齐宽度整除的指令的分段之前。如图9所示,由双字指令组成的分段在由单字指令组成的分段之前,单字指令组成的分段在由子字指令组成的分段之前。因此,由于较早的分段具有长度为字倍数(字和双字)的指令并且最后的分段是具有不是字倍数(子字)的指令的唯一段,所以在字边界上可以自动发生分段的起始位置的对齐。如果组成前面的分段的指令的大小与对齐宽度匹配或者为对齐宽度的倍数,则后续分段的地址的计算可能不那么复杂。x.取回和译码逻辑的示例性架构

图10-图11是基于块的处理器核的取回和译码逻辑的不同配置或架构的例子。例如,可以在处理器核中使用取回和译码逻辑,来针对指令块的不同分段或子块执行并行取回和译码操作。在一些示例中,取回和译码逻辑至少部分地使用以下中的一个或多个来实现:硬连线有限状态机,可编程微码,可编程门阵列,或其他合适的控制电路。图10是可用于取回和译码指令块的取回和译码逻辑的例子,所述指令块被组织为使得给定子块内的所有指令具有相同长度(例如图9的指令块900)。图11是可用于取回和译码指令块的取回和译码逻辑的例子,所述指令块被组织为使得给定子块内的指令可以是由isa支持的任何长度(例如图8的指令块800)。

在图10中,处理器核1000包括控制单元1010、指令高速缓存1020以及指令译码逻辑1030、1040和1050。控制单元1010可以包括用于使核1000顺序地通过其各个阶段(例如参考图6所描述的)的逻辑,所述各个阶段为取回、译码、执行和提交指令块的指令。例如,控制单元1010可以包括:头部译码逻辑1012,用于译码指令块头部的字段;以及取回逻辑1014,用于发起指令块的指令的并行取回和译码操作。

指令高速缓存1020可以用于临时存储将由处理器核1000执行的指令块。例如,响应于指令块被分配到处理器核1000,可以向指令高速缓存1020加载指令块。指令块例如可以从二级(l2)高速缓存、主存储器或从次级存储设备加载。存储于指令高速缓存1020中的指令可以由处理器核1000内的其他逻辑使用指令高速缓存1020的一个或多个读取端口进行读取。每个读取端口可以提供被存储在读取地址处的数据,所述读取地址被提供给指令高速缓存1020。指令高速缓存1020可以以各种粒度被访问并且可以以各种宽度输出数据。例如,指令高速缓存1020可以是可字节寻址的、可字寻址的或可双字寻址的。作为另一例子,指令高速缓存1020可以输出32位、64位、96位、128位、192位或256位宽的数据。读取地址可以在每个时钟周期更改。如图所示,指令高速缓存1020包括三个读取端口,用于在单个时钟周期期间并行输出三个128位值。

头部译码逻辑1012可以译码指令块头部以确定指令块内的多个子块的起始位置。isa可以指定如何确定每个子块的起始位置。在一个实施例中,指令头部的分段字段被用于使用字节或字地址对从指令头部的末尾或从前一分段的开始的偏移进行编码。在另一实施例中,指令头部的分段字段用于对与分段字段对应的每个子块的字节计数、字计数或指令计数进行编码。头部译码逻辑1012可以通过将在给定子块之前的任何子块的大小相加以获得给定子块的偏移,来计算每个子块的起始位置。每个子块的偏移可以用作用于从指令高速缓存1020读取相应子块的指令的初始地址。

取回逻辑1014可以发起对子块的并行取回和译码操作。最初,可以将每个子块的起始位置(地址)提供给指令高速缓存1020的相应读取端口。如图所示,可以将三个不同地址提供给指令高速缓存1020,从而可以针对三个不同的子块并且取回指令。特别地,可以使用分段0地址来取回64位指令,可以使用分段1地址来取回32位指令,可以使用分段2地址来取回24位指令。所取回的指令可以由流水线寄存器(未示出)缓存,并提供给指令译码逻辑1030、1040和1050。

在一个实施例中,指令译码逻辑1030、1040、1050可被划分为针对不同宽度指令而被优化的不同指令译码器。例如,指令译码器1030可用于仅译码64位指令,指令译码器1040可用于仅译码32位指令,而指令译码器1050可用于仅译码24位指令。通过使这些译码器专门用于单一宽度的指令,这些译码器可以变得更小且更快。指令译码逻辑1030、1040、1050可以并行操作,从而来自分段0的64位指令、来自分段1的32位指令和来自分段2的24位指令可以在同一周期期间被并行译码。指令译码器1030、1040、1050可以将相对紧凑的机器代码指令转换为可用于在指令块的执行期间控制处理器核1000的硬件资源的不太紧凑的表示。译码的指令可以由流水线寄存器(未示出)缓存并提供给处理器核1000的指令窗口,从而指令可以被调度用于执行。通过并行取回和译码多条指令,潜在地可以更快地执行指令块,这是因为更多的指令可用于调度和执行。在其他示例中,使用相同的译码逻辑来译码具有两个或更多个不同长度的指令。在一些示例中,使用可重配置的逻辑来配置译码逻辑以能够译码具有一个或多个不同长度的指令。

在一些例子中,可以在单个周期中并行地取回和译码给定子块的多条指令。例如,可以使用可选译码器1032、1042、1044、1052和1054中的一个或多个来译码指令。特别地,指令译码器1032可以用于译码来自分段0的第二个64位指令;指令译码器1042、1044可用于译码来自分段1的额外的32位指令;并且指令译码器1052、1054可以用于译码来自分段2的额外的24位指令。在并行译码的指令的数目与用于译码、路由和存储译码的指令的硬件资源的量之间可以进行折衷。在一个实施例中,用于每个子块的译码器的数目可以与指令高速缓存的数据总线宽度匹配。例如,支持64位、48位、32位和24位指令的isa可以将指令划分成四个子块,并且核可以包括192位的指令高速缓存输出总线以及对应于相应子块的三个64位指令译码器、四个48位指令译码器、六个32位指令译码器以及八个24位指令译码器。作为硬件密集性较低的实现的例子,核可以包括96位的指令高速缓存输出总线以及对应于相应子块的一个64位指令译码器、两个48位指令译码器、三个32位指令译码器和四个24位指令译码器。以这种方式,可以在单个时钟周期内针对不同的子块对不同数目的指令进行译码。

指令取回逻辑1014可以通过依次通过与每条指令相关联的地址来控制指令块的所有指令的取回。例如,对于被译码的每个64位指令,与分段0相关联的地址可以与双字成比例地增加,使得序列中的下一条指令可以被译码,例如,对于字寻址而言地址可以增加2;并且对于字节寻址而言地址可以增加8。类似地,对于被译码的每个32位指令,与分段1相关联的地址可以与字成比例地增加;并且与分段2相关联的地址可以与被译码的每个24位指令成比例地增加。以这种方式,取回逻辑1014可以依次通过与指令块的所有指令相关联的所有地址。因此,所有分段的所有指令都可以由处理器核1000的取回和译码逻辑取回和译码。

图11是可用于取回和译码指令块的取回和译码逻辑的例子,所述指令块被组织成使得给定子块内的指令可以具有由isa支持的任何长度(例如图8的指令块800))。因此,给定的子块可以包括例如24位、32位和64位指令中的一个或多个。

在图11中,处理器核1100包括控制单元1110、指令高速缓存1120、指令译码逻辑1130以及多路复用器和路由逻辑1160。控制单元1110可以包括用于使核1100依次通过其各个阶段的逻辑,所述各个阶段为取回、译码、执行和提交指令块的指令。例如,控制单元1110可以包括:头部译码逻辑1112,用于译码指令块头部的字段;以及取回逻辑1114,用于发起指令块的指令的并行取回和译码操作。可以将译码的指令提供给多路复用器和路由逻辑1160,从而译码的指令可以存储在处理器核1100的一个或多个指令窗口(未示出)中。指令高速缓存1120可以包括多个读取端口,使得可以并行地从指令高速缓存1120中读出与不同子块关联的指令。

头部译码逻辑1112可以译码指令块头部以确定指令块内的多个子块的起始位置。isa可以指定如何确定每个子块的起始位置。在一个实施例中,指令头部的分段字段被用于使用字节或字地址对从指令头部的末尾或从前一分段的开始的偏移进行编码。在另一实施例中,指令头部的分段字段用于对与分段字段对应的每个子块的字节计数、字计数或指令计数进行编码。头部译码逻辑1112可以通过将在给定子块之前的任何子块的大小相加以获得给定子块的偏移,来计算每个子块的起始位置。每个子块的偏移可以用作用于从指令高速缓存1120读取相应子块的指令的初始地址。

取回逻辑1114可以发起子块的并行取回和译码操作。最初,可以将每个子块的起始位置(地址)提供给指令高速缓存1120的相应读取端口。如图所示,可以将三个不同的地址提供给指令高速缓存1120,从而对于三个不同的子块可以并且取回指令。特别地,可以使用分段0地址来取回与分段0相关联的指令,可以使用分段1地址来取回与分段1相关联的指令,并且可以使用分段2地址来取回与分段2相关联的指令。与图10的取回逻辑1014相比,取回的指令的长度可能是未知的,直到指令被译码。与分段0相关联的取回的指令可以由流水线寄存器(未示出)缓存,并提供给指令译码逻辑1130。类似地,与分段1和2相关联的取回的指令可以由流水线寄存器(未示出)缓存,并提供给与分段1和2相关联的指令译码逻辑(未示出)。

指令译码逻辑1130可以区分并译码不同宽度的指令。特别地,指令译码器1130可以确定特定指令的长度或大小,并且可以用于译码24位、32位和64位指令。关于该指令的长度信息可被提供给取回逻辑1114和/或可选译码器1132、1140、1142、1150和1152。可选译码器1132、1140、1142、1150和1152可用于在单个周期内并行译码给定分段的多条指令。作为一个示例,来自指令高速缓存1120的读取端口的输出可以是128位总线,并且指令译码逻辑1130可以连接到128位总线的低64位(例如,位0-63),并且指令译码逻辑1132可以连接到128位总线的高64位(例如,位64-127)。因此,针对给定分段,可以在同一始时钟周期内对两个64位指令进行译码。

作为另一例子,来自指令高速缓存1120的读取端口的输出可以是128位数据总线,并且指令译码逻辑1130可以连接到128位总线的低64位(例如,位0-63),并且指令译码逻辑1140可以连接到128位总线的第二字(例如,位32-63)。如果指令译码逻辑1130确定特定指令的长度是64位,则不使用来自指令译码逻辑1140的输出,这是因为不可能存在与64位指令重叠的32位指令(指令是有顺序的并且不重叠)。因此,来自指令译码逻辑1130的译码的长度信息可用于确定是否使用来自指令译码逻辑1140的输出。然而,如果指令译码逻辑1130确定在位0-31处存在有效的32位指令,则可以使用来自指令译码逻辑1140的输出,这是因为可以存在顺序的32位指令位32-63。类似地,可以沿数据总线布置指令译码器(例如译码器1142、1150和1152)以译码跟随先前指令的指令。

与不同分段相关联的指令译码逻辑可以并行操作,从而来自每个分段的指令可以在同一周期内被并行译码。译码的指令可以由流水线寄存器(未示出)进行缓冲,并且经由多路复用器和路由逻辑1160提供给处理器核1100的指令窗口,从而指令可以被调度用于执行。多路复用器和路由逻辑1160可以位于流水线寄存器之前或之后。

多路复用器和路由逻辑1160可以用于将译码的指令路由到指令窗口的写入端口。多路复用器和路由逻辑1160的输出的数目可以与在单个周期期间能够并行译码的指令的数目匹配。例如,如果四条指令可以被并行译码(例如当存在四个不同的指令译码器时),则多路复用器和路由逻辑1160可以具有四个输出。作为具体例子,来自指令高速缓存1120的128位数据总线可被译码为:两条64指令;四条32位指令;一条64位指令和两条32位指令;五条24位指令;一条64指令,一条32位指令,以及一条24位指令;等等。来自每条指令的译码的长度信息可用于将来自译码器的有效输出复用到指令窗口。

指令取回逻辑1114可以通过顺序通过与每条指令相关联的地址来控制指令块的所有指令的取回。在下一周期期间增加地址的量可以基于被译码的指令的数目和宽度。具体地,地址可以与译码的指令的长度之和成比例地递增。例如,如果使用单一指令译码器(例如指令译码器1130),则当译码的指令分别是64位、32位或24位指令时,地址可以递增双字、字或子字。作为另一例子,如果24位指令和32位指令在相同的周期内被译码,则字节地址可以增加7以顾及被译码的七个字节的指令。以这种方式,取回逻辑1114可以顺序通过与指令块的所有指令相关联的所有地址。因此,所有分段的所有指令可以由处理器核1100的取回和译码逻辑取回和译码。

xi.取回和译码指令的示例性方法

图12是示出在基于块的处理器核中取回和译码指令的示例性方法1200的流程图。例如,可以使用由编译器生成的指令来执行方法1200,该编译器按照分段组织相应指令块的指令。编译器可以在执行方法1200的相同的基于块的处理器核上执行,或者编译器可以在不同的计算机上执行。方法1200可以用于并行地取回和译码不同分段的指令。因此,方法1200可以潜在地增加处理器核的执行速度,因为与指令未被组织到分段相比,可以更快地调度更多数目的指令用于执行。

在过程框1210,接收指令块的指令块头部。例如,当指令块被分配给处理器核时,可以由指令头部译码逻辑接收指令块头部。指令块可以包括第一分段和第二分段,其中第一分段和第二分段中的每一个包括一条或多条指令。不同的isa可能支持不同类型的分段。在一个实施例中,第一分段的一条或多条指令中的每一条可以具有第一长度(例如64位),并且第二分段的一条或多条指令中的每一条可以具有第二长度(例如32位),其中第二长度不同于第一长度。在另一实施例中,第一分段的一条或多条指令中的每一条可以具有不同的长度,并且第二分段的一条或多条指令中的每一条可以具有不同的长度。第一分段和第二分段可以具有预先定义数目的指令,例如每分段八条指令。换句话说,可以将指令打包到分段中,使得除了最后分段之外的所有分段都具有相同数目的指令,并且最后分段的指令的数目是指令块的总指令与预先定义的指令数目的模。分段的数目可以根据指令块的指令数目而变化,所以最后分段可以是具有待执行指令的最高编号的分段。

在过程框1220处,可至少基于对指令块头部译码来可选地确定第一分段的第一指令数目和第二分段的第二指令数目。例如,可以使用指令块头部的相应分段字段对指示对应分段的指令数目的值进行编码。通过对分段字段进行译码,可以确定每个分段的指令数目。替代地,可以在不译码指令块头部的情况下确定第一分段的第一指令数目和第二分段的第二指令数目。例如,第一指令数目和第二指令数目可以是分段的预定指令数目。

在过程框1230处,可至少基于对指令块头部进行译码来确定第一分段的地址。作为示例,指令块头部的相应分段字段可以用于对与第一分段的初始指令相关联的偏移进行编码。该偏移可以相对于指令块头部的末尾或相对于另一个分段。例如,可以使用各种粒度来指示偏移,例如字节数目、字数目、双字数目或指令数目。第一分段的地址可以是分段字段的译码的值,例如当分段字段包括相对于指令块头部的末尾的偏移时。第一分段的地址可以通过将先前分段的偏移相加来计算,先前分段的偏移被编码在其相应的分段字段中。作为另一例子,指令块头部的分段字段可以指示相应分段的大小,并且可以根据分段的指令的大小对分段进行排序。因此,一个排序可以是从最大指令到最小指令,使得64位指令位于分段0中(紧接指令头部之后),32位指令位于分段1中(紧接分段0之后),以及24位指令位于分段2中(紧接分段1)。分段0的地址可以被计算为0x0000;分段1的地址可以计算为分段0的大小;并且分段2的地址可以被计算为分段0的大小加上分段1的大小。

在过程框1240,可以从第一分段取回第一指令,并且可以从第二分段取回第二指令。这些指令可以被并行取回(例如,在同一时钟周期内)。例如,可以将与第一指令相关联的第一读取地址和与第二指令相关联的第二读取地址提供给基于块的处理器核的指令高速缓存。具体地,可以将不同的读取地址提供给指令高速缓存的不同端口,使得指令高速缓存可以在不同的相应输出数据总线上输出第一指令和第二指令。

在过程框1250,第一指令和第二指令可以被并行译码(例如,在同一时钟周期期间)。例如,用于译码第一指令的第一指令译码器可以与指令高速缓存的第一输出端口通信,并且用于译码第二指令的第二指令译码器可以与指令高速缓存的第二输出端口通信。对指令译码可以包括确定相应指令的长度。相应指令的长度可以用来标识分段内的后续指令。后续指令可以在同一时钟周期或后续时钟周期内被译码。作为具体例子,第一指令的长度可以用来标识同一分段内的第三指令。在一个实施例中,可以使用与第一指令译码器并行的第三指令译码器对第三指令进行译码,从而第一和第三指令可以在同一周期中被译码。在替代实施例中,第一指令的长度可以用于计算第三指令的地址,从而可以取回第三指令,然后在后续周期由第一指令译码器来对第三指令译码。以这种方式,可以取回并译码每个分段的所有指令,从而指令块的指令可以在基于块的处理器核上被执行。

图13示出了合适的计算环境1300的通用示例,其中可以实现所描述的实施例、技术和技艺,包括编译用于基于块的处理器的分段指令块。例如,如本文所述,计算环境1300可以实现用于编译、取回和译码指令的公开技术。

计算环境1300不旨在提出关于技术的使用或者功能的范围的任何限制,因为技术可以被实现在不同的通用或者专用计算环境中。例如,所公开的技术可以利用其他计算机系统配置被实现,包括手持式设备、多处理器系统、可编程消费者电子产品、网络pc、微型计算机、大型计算机,等等。所公开的技术还可以被实践在分布式计算环境中,其中任务由通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块(包括用于基于块的指令块的可执行指令)可以被定位在本地存储器存储设备和远程存储器存储设备二者中。

参考图13,计算环境1300包括至少一个基于块的处理单元1310和存储器1320。在图13中,该最基本配置1330被包括在虚线内。基于块的处理单元1310执行计算机可执行指令并且可以是真实处理器或者虚拟处理器。在多处理系统中,多个处理单元执行计算机可执行指以增加处理能力,并且如此多个处理器可以同时运行。存储器1320可以是易失性存储器(例如,寄存器、高速缓存、ram)、非易失性存储器(例如,rom、eeprom、闪速存储器等)、或者两者的组合。存储器1320存储可以例如实现在此所描述的技术的软件1380、图像和视频。计算环境可以具有附加的特征。例如,计算环境1300包括存储装置1340、一个或多个输入设备1350、一个或多个输出设备1360以及一个或多个通信连接1370。互连机制(未示出)(诸如总线、控制器或者网络)将计算环境1300的部件相互连接。通常,操作系统软件(未示出)提供用于在计算环境1300中执行的其他软件的操作环境,并且协调计算环境1300的部件的活动。

存储装置1340可以是可移除或者不可移除的,并且包括磁盘、磁带或者磁带盒、cd-rom、cd-rw、dvd或者可以用于存储信息并且可以在计算环境1300内访问的任何其他介质。存储装置1340存储用于软件1380的指令、插入数据和消息,其可以用于实现在此所描述的技术。

(一个或多个)输入设备1350可以是触摸输入设备,诸如键盘、小键盘、鼠标、触屏显示器、笔或轨迹球、语音输入设备、扫描设备或者向计算环境1300提供输入的另一设备。对于音频而言,(一个或多个)输入设备1350可以是以模拟或者数字形式接受音频输入的声卡或者类似设备,或者向计算环境1300提供音频样本的cd-rom读取器。(一个或多个)输出设备1360可以是显示器、打印机、扬声器、刻录机或者提供来自计算环境1300的输出的另一设备。

(一个或多个)通信连接1370实现通过通信介质(例如,连接网络)与另一计算实体的通信。通信介质传达诸如计算机可执行指令、压缩图形信息、视频或者调制数据信号中的其他数据的信息。(一个或多个)通信连接1370不限于有线连接(例如,兆比特或吉比特以太网、无限带宽、电气或光纤连接上的光纤信道),而且包括无线技术(例如,经由蓝牙、wifi(ieee802.11a/b/n)、wimax、蜂窝、卫星、激光、红外的rf连接)以及用于提供用于所公开的代理、网桥和代理数据消费者的网络连接的其他适合的通信连接。在虚拟主机环境中,(一个或多个)通信连接可以是由虚拟主机所提供的虚拟化网络连接。

可以使用实现计算云1390中的所公开的技术的全部或部分的计算机可执行指令执行所公开的方法的一些实施例。例如,所公开的编译器和/或基于块的处理器的服务器被定位在计算环境1330中,或者所公开的编译器可以在被定位在计算云1390中的服务器上执行。在一些示例中,所公开的编译器在传统的中央处理单元(例如,risc或者cisc处理器)上执行。

计算机可读介质是可以在计算环境1300内访问的任何可用介质。以示例而非限制的方式,利用计算环境1300,计算机可读介质包括存储器1320和/或存储装置1340。如应当容易理解的,术语计算机可读存储介质包括用于数据存储的介质(诸如存储器1320和存储装置1340)而非传输介质(诸如调制数据信号)。

xiii.所公开的技术的附加示例

根据上文所讨论的示例在此讨论了所公开的主题的附加示例。

在一个实施例中,处理器包括可用于执行指令块的基于块的处理器核。指令块包括指令头部和一条或多条指令,其中指令被布置在指令块的多个子块内。指令块的特定布置可以由基于块的处理器的isa指定。不同的指令可以具有不同的长度。基于块的处理器核包括彼此通信的头部译码逻辑和取回逻辑。头部译码逻辑被配置为译码指令块头部以确定多个子块的指定的起始位置。取回逻辑被配置为针对多个子块中的一个或多个子块的多条指令发起并行取回和译码操作。

在指令块的一个布置中,多个子块中的给定子块内的所有指令具有相同的长度。一个或多个子块中的相应子块内的指令的数目可以不同。基于块的处理器核可以包括被配置为译码多个子块的指令的指令译码逻辑。在给定时钟周期期间,可以对多个子块中的第一子块的第一数目的指令进行译码,并且可以对多个子块中的第二子块的第二数目的指令进行译码,其中第一数目与第二数目不同。

在指令块的另一布置中,多个子块中的给定子块可以包括不同长度的指令。指令块的多个子块可以被打包以具有最大预定数目的指令。因此,指令块的多个子块中没有子块可以具有多于最大数目的指令,其中指令的最大数目由基于块的处理器核的指令集架构预先定义。基于块的处理器核可以包括指令译码逻辑,其被配置为确定与给定子块的下一指令的起始位置对应的取回地址。

基于块的处理器可以用于各种不同的计算系统中。例如,服务器计算机可以包括非易失性存储器和/或存储设备;网络连接;存储一个或多个分段指令块的存储器;以及用于执行分段指令块的基于块的处理器。作为另一例子,设备可以包括用户接口组件;非易失性存储器和/或存储设备;蜂窝和/或网络连接;存储一个或多个分段指令块的存储器;以及用于执行分段指令块的基于块的处理器。用户接口组件可以包括以下中的至少一个或多个:显示器,触摸屏显示器,触觉输入/输出设备,运动感测输入设备和/或语音输入设备。

在一个实施例中,一种在基于块的处理器核中取回和译码指令的方法包括:接收指令块的指令块头部。所述指令块包括第一分段和第二分段,所述第一和第二分段中的每一个包括一条或多条指令。指令块可以包括不同长度的指令。所述方法包括:至少基于对所述指令块头部进行译码来确定所述第一分段的地址。所述方法包括:并行地取回来自第一分段的第一指令和来自第二分段的第二指令。所述方法包括:并行译码所述第一指令和第二指令。取回第一指令和第二指令可以包括:将与第一指令相关联的第一读取地址和与第二指令相关联的第二读取地址提供给基于块的处理器核的指令高速缓存。译码第一指令可以包括确定第一指令的第一长度,并且译码第二指令可以包括确定第二指令的第二长度。译码第一指令和第二指令可以包括:基于所述第一指令的长度确定第三指令的地址,以及基于所述第二指令的长度确定第四指令的地址。第一分段的一条或多条指令中的每一条指令可以具有第一长度,并且第二分段的一条或多条指令中的每一条指令可以具有不同于第一长度的第二长度。所述方法可以包括:至少基于对指令块头部进行译码来确定第一分段的第一指令数目和第二分段的第二指令数目。替代地,第一分段和第二分段具有预定数目的指令,其中预定数目由基于块的处理器核的指令集架构指定。

在一个实施例中,一个或多个计算机可读存储介质存储当由计算机执行时使计算机执行方法的计算机可读指令。所述指令包括用于使计算机将指令分组为以在基于块的处理器上执行为目标的多个指令块的指令。这些指令包括用于使计算机将相应指令块的指令分组到相应指令块的多个分段的指令。所述指令包括用于使计算机为相应指令块生成指令块头部的指令。头部包括用于确定多个分段中的分段的起始位置的信息。所述指令包括用于使计算机在计算机可读存储器或存储设备中发出由基于块的处理器执行的多个指令块的指令。所述指令还可以包括用于将发出的多个指令块存储在一个或多个计算机可读存储介质或设备中的指令。相应指令块的相应分段的所有指令可以具有统一的长度。将相应指令块的指令分组到多个分段可以包括用预定数目的指令打包相应分段。用于确定多个分段中的分段的起始位置的信息可以是相对于指令块的位置的偏移。用于确定多个分段中的分段的起始位置的信息可以是多个分段中的不同分段的大小。

鉴于所公开的主题的原理可以应用的许多可能实施例,应当认识到所图示的实施例仅是优选的示例并且不应该当作将权利要求的范围限于那些优选的示例。相反,要求保护的主题的范围由所附的权利要求进行限定。我们因此根据我们的发明要求保护落在这些权利要求的范围内的全部内容。

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