使用寄存器访问指令发起指令块执行的制作方法

文档序号:14394558阅读:481来源:国知局



背景技术:

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



技术实现要素:

公开了用于使用寄存器访问指令(例如,寄存器读取指令)发起指令块执行来配置、操作和编译用于包括显式数据图执行(edge)架构的基于块的指令集架构(bb-isa)的代码的方法、装置和计算机可读存储设备。所描述的技术和工具可以潜在地提高处理器性能,并且可以被分开实施,或者以彼此的各种组合被实施。如将在下面更充分地描述的,所描述的技术和工具可以在数字信号处理器、微处理器、专用集成电路(asic)、软处理器(例如,使用可重新配置的逻辑在现场可编程门阵列(fpga)中被实现的微处理器核)、可编程逻辑或其他合适的逻辑电路中被实现。如对于本领域的普通技术人员来说将显而易见的是,所公开的技术可以在各种计算平台中被实现,这些计算平台包括但不限于服务器、大型机、蜂窝电话、智能电话、pda、手持设备、手持式计算机、pda、触摸屏平板设备、平板计算机、可穿戴计算机和膝上型计算机。

在所公开的技术的一些示例中,基于块的处理器包括被配置为执行至少一个指令块的多个处理器核。该至少一个指令块对数据流指令集架构(isa)编码,其中数据流isa至少包括第一多个指令和第二多个指令。例如,第一多个指令指定一个或多个目标指令而不指定数据源操作数(例如,加法指令),并且第二多个指令指定一个或多个其他目标指令和数据源操作数。寄存器访问指令(例如,寄存器读取指令)可以是第二多个指令的一部分。一个或多个寄存器读取指令可以被用作指令块中的初始指令,其中寄存器读取指令可以取读数据,该数据可以作为操作数而被提供给一个或多个后续指令(例如,加法指令)。可以执行寄存器读取指令,并且可以将来自读取指令执行的结果转发给用于一个或多个后续目标指令的操作数缓冲器。此外,即使在目标指令被取读和译码之前,来自读取指令的结果也可以被转发给操作数缓冲器。另外,寄存器读取指令可以根据与断言的指令相关联的条件的满足而被断言。

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

附图说明

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

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

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

图4图示了如可以在所公开的技术的一些示例中使用的源代码的各部分以及相应的指令块。

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

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

图7图示了如可以在所公开的技术的一些示例中使用的若干指令块和处理器核。

图8a是用于基于块的处理器的程序的源代码的示例片段。

图8b是来自图7a的源代码示例片段的依赖关系图的示例。

图9a是与来自图8a的源代码片段对应的另一示例指令块。

图9b是参照图9a的指令块的指令注释的来自图8a的源代码的示例片段的依赖关系图的示例。

图10图示了如可以在所公开的技术的某些示例中使用的示例源代码和汇编代码。

图11至图12是概述了如可以在所公开的技术的某些示例中使用的指令块执行的示例方法的流程图。

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

具体实施方式

i.总体考虑

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

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

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

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

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

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

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

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

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

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

所公开的技术可以通过应用包括高指令级并行(ilp)、乱序(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)控制器。在一些示例中,存储器接口140可以包括用于管理并且分配虚拟存储器、扩展可用的主存储器155的存储器管理单元(mmu)。

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

基于块的处理器100也可以包括控制单元160。控制单元可以经由核互连120或边带互连(未示出)而与处理核110、i/o接口145和存储器接口140通信。控制单元160监督处理器100的操作。可以由控制单元160执行的操作可以包括用于执行指令处理的核分配和解除分配,对在核、寄存器文件、存储器接口140和/或i/o接口145中的任意者之间的输入数据和输出数据的控制,执行流程的修改,以及验证分支指令的一个或多个目标位置、指令头部和控制流程中的其他变化。控制单元160可以根据表示指令块的出口点和控制流程概率的控制流程和元数据信息来生成和控制处理器。

控制单元160也可以处理硬件中断,以及控制特殊系统寄存器的读取和写入,特殊系统寄存器例如是被存储在一个或多个寄存器文件中的程序计数器。在所公开的技术的一些示例中,控制单元160至少部分地使用处理核110中的一个或多个而被实现,而在其他示例中,控制单元160使用基于非基于块的处理核(例如,被耦合到存储器的通用risc处理核)而被实现。在一些示例中,控制单元160至少部分地使用以下各项中的一项或多项而被实现:硬连线的有限状态机、可编程微码、可编程门阵列或其他合适的控制电路。在备选示例中,控制单元功能可以由核110中的一个或多个执行。

控制单元160包括用于向处理器核110分配指令块的调度器165。如本文所使用的,调度器分配是指用于引导指令块的操作的硬件,指令块的操作包括发起指令块映射、取读、译码、执行、提交、放弃、空闲以及刷新指令块。在一些示例中,硬件接收使用计算机可执行指令而被生成的信号以引导指令调度器的操作。处理器核110在指令块映射期间被指派给指令块。所列举的指令操作的阶段是为了说明的目的,并且在所公开的技术的一些示例中,某些操作可以被组合、省略、分成多个操作或者添加附加的操作。调度器165调度包括以下各项的指令流:用于执行指令处理的核的分配和解除分配,在核、寄存器文件、存储器接口140和/或i/o接口145中的任意者之间的输入数据和输出数据的控制。

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

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

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

在所公开的技术的一些示例中,处理器核111可以被用于执行和提交程序的指令块。如图2中所示,处理器核111包括控制单元205,其生成控制信号来调节核操作并且使用指令调度器206来调度核内的指令流。可以由控制单元205和/或指令调度器206执行的操作可以包括生成和使用存储器访问指令编码,用于执行指令处理的核的分配和解除分配,在核、寄存器文件、存储器接口140和/或i/o接口145中的任何者之间的输入数据和输出数据的控制。控制单元也可以控制加载—存储队列、调度器、全局控制单元、其他单元,或者被用来确定指令发出的速率和顺序的这些单元的组合。

在一些示例中,使用被耦合到存储器的通用处理器来实现指令调度器206,该存储器被配置为存储用于调度指令块的数据。在一些示例中,使用专用处理器或使用被耦合到存储器的基于块的处理器核来实现指令调度器206。在一些示例中,指令调度器206被实现为被耦合到存储器的有限状态机。在一些示例中,在处理器(例如,通用处理器或基于块的处理器核)上执行的操作系统生成优先级、预测,并且可以至少部分地被用来使用指令调度器206来调度指令块的其他数据。如对于相关领域的普通技术人员将是显而易见的,可以使用在集成电路、可编程逻辑或其他合适的逻辑中被实现的其他电路结构来实现指令调度器206的硬件。

控制单元205还包括用于存储控制流信息和元数据(例如,用于存储器访问指令顺序的数据)、存储掩码、存储矢量等的存储器(例如,在sram或寄存器中)。控制单元205也可以处理硬件中断,以及控制对特殊系统寄存器的读取和写入,特殊系统寄存器例如是被存储在一个或多个寄存器文件中的程序计数器。在所公开的技术的其他示例中,使用非基于块的处理核(例如,被耦合到存储器的通用risc处理核)来实现控制单元205和/或指令调度器206。在一些示例中,至少部分地使用以下各项中的一项或多项来实现控制单元205和/或指令调度器206:硬连线的有限状态机、可编程微码、可编程门阵列或其他合适的控制电路。

示例性处理器核111包括两个指令窗口210和211,每个指令窗口可以被配置为执行指令块。在所公开的技术的一些示例中,指令块是基于块的处理器指令的原子集合,其包括指令块头部和多个一个或多个指令。如将在下面进一步讨论的,指令块头部可以包括描述指令块的执行模式的信息和可以被用来进一步定义指令块内的多个指令中的一个或多个指令的语义的信息。取决于所使用的特定isa和处理器硬件,也可以在指令的执行期间使用指令块头部,并且通过例如允许指令和/或数据的早期取读、改进的分支预测、推测执行、改进的能源效率以及改进的代码紧凑性来提高执行指令块的性能。在其他示例中,诸如一个、四个、八个或其他数量的指令窗口之类的不同数量的指令窗口是可能的。

指令窗口210和211中的每一个都可以从连接到互连总线和指令高速缓存227的输入端口220、221和222中的一个或多个接收指令和数据,指令高速缓存227继而被连接到指令译码器228和229。也可以在附加的输入端口225上接收附加的控制信号。指令译码器228和229中的每一个对指令块的指令头部和/或指令译码,并且将译码后的指令存储在位于每个相应的指令窗口210和211中的存储器存储区215和216内。另外,译码器228和229中的每一个都可以将数据发送给控制单元205,例如以根据在指令块头部中或在指令中指定的执行标志来配置处理器核111的操作。

处理器核111还包括被耦合到l1(一级)高速缓存235的寄存器文件230。寄存器文件230存储在基于块的处理器架构中定义的寄存器的数据,并且可以具有一个或多个读取端口和一个或多个写入端口。例如,寄存器文件可以包括用于将数据存储在寄存器文件中的两个或更多个写入端口,以及具有用于从寄存器文件内的各个寄存器读取数据的多个读取端口。在一些示例中,单个指令窗口(例如,指令窗口210)一次仅可以访问寄存器文件的一个端口,而在其他示例中,指令窗口210可以访问一个读取端口和一个写入端口,或者可以同时访问两个或更多个读取端口和/或写入端口。在一些示例中,寄存器文件230可以包括64个寄存器,每个寄存器保存32位数据的字。(为了便于解释,除非另有说明,本申请将32位数据称为一个字。根据所公开的技术的合适处理器可以对8位、16位、64位、128位、256位或另一数目个位的字操作)。在一些示例中,寄存器文件230内的一些寄存器可以被分配给特殊目的。例如,一些寄存器可以专用为系统寄存器,其示例包括存储恒定值(例如,全零字)的寄存器、指示正被执行的程序线程的当前地址的一个或多个程序计数器(pc)、物理核编号、逻辑核编号、核指派拓扑、核控制标志、执行标志、处理器拓扑或其他合适的专用目的。在一些示例中,对于一个或每个程序计数器存在多个程序计数器寄存器,以允许跨一个或多个处理器核和/或处理器并发执行多个执行线程。在一些示例中,程序计数器被实现为指定的存储器位置而不是寄存器文件中的寄存器。在一些示例中,可以通过操作系统或其他监控计算机指令来限制对系统寄存器的使用。在一些示例中,寄存器文件230被实现为触发器的阵列,而在其他示例中,可以使用锁存器、sram或其他形式的存储器存储来实现寄存器文件。给定处理器(例如,处理器100)的isa规范指定如何定义和使用寄存器文件230内的寄存器。

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

如图2中所示,指令窗口210的存储器存储215包括若干译码指令241、左操作数(lop)缓冲器242、右操作数(rop)缓冲器243、断言缓冲器244、三个广播信道245,以及指令记分板247。在所公开的技术的一些示例中,指令块的每个指令被分解成一行译码指令、左操作数和右操作数以及记分板数据,如图2所示。译码指令241可以包括作为比特级控制信号而被存储的部分译码版本或完全译码版本的指令。操作数缓冲器242和243存储操作数(例如,从寄存器文件230接收的寄存器值,从存储器接收的数据,被编码在指令内的立即操作数,由先前发布的指令计算的操作数或其他操作数值),直到其相应的译码指令准备好执行。分别从操作数缓冲器242和243以及断言缓冲器244读取指令操作数和断言,而不是从寄存器文件读取指令操作数和断言。指令记分板247可以包括用于指向指令的断言的缓冲器,包括用于组合由多个指令发送到指令的断言的线“或”逻辑。

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

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

译码指令241不需要按照它们被布置在指令窗口210的存储器存储215内的相同顺序来执行。相反,指令记分板245被用来跟踪译码的指令的依赖关系,并且当依赖关系已经得到满足时,相关联的单独译码的指令被调度用于执行。例如,当对相应指令而言依赖关系已经得到满足时,可以将对相应指令的引用推送到准备就绪队列上,并且可以从准备就绪队列以先入先出(fifo)顺序调度指令。对于编码有加载存储标识符(lsid)的指令,执行顺序也将遵循在指令lsid中枚举的优先级,或者按照看起来好像指令按指定顺序执行的顺序来执行。

存储在记分板247中的信息可以包括但不限于相关联的指令的执行断言(诸如该指令是否正在等待断言位被计算以及在断言位为真或假的情况下该指令是否执行)、操作数对指令的可用性,或者在执行相关联的单独指令之前所需的其他先决条件。

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

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

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

如图2中所示,具有若干执行流水线寄存器255的第一路由器250被用来将数据从指令窗口210和211中的任一个发送给功能单元260中的一个或多个,功能单元260可以包括但不限于:整数alu(算术逻辑单元)(例如,整数alu264和265)、浮点单元(例如,浮点alu267)、移位/旋转逻辑(例如,桶形移位器268)或其他合适的执行单元,其可以包括图形功能、物理功能和其他数学运算。第一路由器250还包括唤醒/选择逻辑258,其被用来确定何时将存储器指令发送到加载/存储队列275。例如,唤醒/选择逻辑258可以确定是否所有的源操作数和断言条件语句对于存储器访问指令都是可用的,并且基于该确定而将地址(和数据,如果适用的话)发送到加载/存储队列275。

根据正被执行的特定指令的要求,来自功能单元260的数据然后可以通过第二路由器270而被路由到输出290、291和292,路由回到操作数缓冲器(例如,lop缓冲器242和/或rop缓冲器243),或者反馈到另一功能单元。第二路由器270包括可以被用来发出存储器指令的加载/存储队列275,将正在输入到核或从核中输出的数据存储到存储器的数据高速缓存277,以及加载/存储流水线寄存器278。

加载/存储队列275接收并临时存储用于执行存储器访问指令的信息。指令块可以将所有存储器访问指令作为单个原子事务块来执行。换句话说,要么全部存储器访问指令被执行,要么全部存储器访问指令都不被执行。基于与每个存储器访问指令相关联的lsid(例如,与对应指令编码在一起的lsid)并且在一些情况下基于存储掩码来确定存储器访问指令的相对顺序。在一些示例中,通过不按照lsid指定的相对顺序执行存储器访问指令可以获得附加的性能,但是存储器的状态必须仍然表现得好像指令按顺序执行一样。加载/存储队列275也接收加载指令的地址,以及存储指令的地址和数据。在一些示例中,加载/存储队列等待执行排队的存储器访问指令,直到确定包含指令块将实际提交。在其他示例中,加载/存储队列275可以推测性地发出至少一些存储器访问指令,但是在块未提交的情况下将需要冲刷存储器操作。在其他示例中,控制单元205通过提供被描述为由唤醒/选择逻辑和/或加载/存储队列275执行的功能来确定存储器访问指令被执行的次序。在一些示例中,处理器100包括调试模式,其允许在调试器的帮助下逐步发出存储器访问指令。可以使用控制逻辑(例如,利用有限状态机)和存储器(例如,寄存器或sram)分别执行存储器事务和存储存储器指令操作数来实现加载/存储队列275。

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

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

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

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

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

在一些情况下,调度器206接受尚未被译码的目标指令的事件,并且还必须禁止所发出的准备就绪指令的重发。指令可以是非断言的,或是断言的(基于真或假的条件)。直到断言的指令被另一指令的断言结果作为目标并且该结果与断言条件相匹配,该断言的指令才会变得准备就绪。如果关联的断言条件不匹配,则该指令永远不会发出。在一些示例中,可以推测性地发出和执行断言的指令。在一些示例中,处理器可以随后检查推测性地发出和执行的指令是否被正确地推测。在一些示例中,错误推测的发出指令和块中的消耗其输出的指令的特定传递闭包可以被重新执行,或者错误推测的副作用被取消。在一些示例中,发现错误推测的指令导致整个指令块的完整的回滚和重新执行。在一些示例中,调度器执行被描述为由上面讨论的唤醒/选择逻辑和/或加载/存储队列执行的操作中的一些或全部。

在分支到新的指令块之后,一个或多个相应指令窗口的就绪状态被清除(块复位)。然而,当指令块分支回到自己(块刷新)时,只有活动的就绪状态被清除。因此可以保留指令块的译码的就绪状态,从而使得不需要重新取读和译码块的指令。因此,可以使用块刷新来节省循环中的时间和能量。

v.指令块的示例流

现在转到图3的示图300,图示了包括若干可变长度指令块311-314的基于块的指令流的一部分310。指令流可以被用来实现用户应用程序、系统服务或任何其他合适的用途。指令流可以被存储在存储器中,被从存储器中的另一进程接收,被通过网络连接接收,或以任何其他合适的方式被存储或接收。在图3中所示的示例中,每个指令块以指令头部开始,指令头部后面是不同数量的指令。例如,指令块311包括头部320和二十个指令321。所示出的特定指令头部320包括部分地控制指令块内的指令的执行的若干数据字段,并且还允许改进的性能增强技术,其包括例如分支预测、推测执行、懒惰评估和/或其他技术。指令头部320也包括id位,其指示该头部是指令头部而不是指令。指令头部320也包括对指令块大小的指示。指令块大小可以按照比一个更大的指令分块,例如,包含在指令块内的4指令分块的数量。换句话说,为了压缩为指定指令块大小分配的头部空间,块的大小被移位4位。因此,0的大小值表示最小大小的指令块,该指令块是后跟有四个指令的块头部。在一些示例中,指令块大小被表示为字节的数量、表示为字的数量,表示为n字分块的数量、表示为地址、表示为地址偏移量,或者使用用于描述指令块大小的其他合适的表达式来表示。在一些示例中,指令块大小由指令块头部和/或页脚中的终止位模式来指示。

指令块头部320也可以包括指示特殊指令执行要求的执行标志。例如,取决于特定的应用,对于某些指令块可以禁止分支预测或存储器依赖性预测。作为另一示例,可以使用执行标志来控制是在缺省执行模式下执行指令块还是在调试执行模式下执行指令块。

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

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

所图示的指令块头部320也包括指示将在块指令中编码的加载—存储队列标识符中的哪一些指派给存储操作的存储掩码。例如,对于具有八个存储器访问指令的块,存储掩码01011011将指示存在三个存储器存储指令(位0,对应于lsid0、2和5)和五个存储器加载指令(位1,对应于lsid1、3、4、6和7)。指令块头部也可以包括写入掩码,其标识相关联的指令块将写入哪个或哪些全局寄存器。在一些示例中,通过例如指令译码器(例如,译码器228或229)将存储掩码存储在存储向量寄存器中。在其他示例中,指令块头部320不包括存储掩码,但是存储掩码是在译码指令块时通过分析指令依赖关系由指令译码器动态生成的。例如,译码器可以分析指令块指令的加载存储标识符以确定存储掩码并将存储掩码数据存储在存储向量寄存器中。类似地,在其他示例中,写入掩码不被编码在指令块头部中,而是被指令译码器动态地生成(例如,通过分析指令块中的指令所引用的寄存器)并被存储在写入掩码寄存器中。存储掩码和写入掩码可以被用来确定指令块的执行何时已经完成,并且因此发起指令块的提交。在指令块可以完成之前,相关联的寄存器文件必须接收对每个条目的写入。在一些示例中,基于块的处理器架构不仅可以包括标量指令,而且可以包括单指令多数据(simd)指令,其允许在单个指令内对更大数量的数据操作数操作。

可以用于指令321的合适的基于块的指令的示例可以包括用于执行整数和浮点算术运算、逻辑运算、类型转换、寄存器读取和写入、存储器加载和存储、分支和跳转的执行以及其他合适的处理器指令的指令。在一些示例中,指令包括一个或多个寄存器访问指令(例如,寄存器读取指令),其可以被用来发起指令块的指令处理。

在所公开的技术的另一示例中,指令块头部320可以不具有任何寄存器访问(例如,寄存器读取)命令。相反,可以在指令块321内使用寄存器读取指令。就这一点而言,可以生成更高效和紧凑的存储器头部,这是因为可以从头部移除用于整个寄存器组的寄存器读取命令,并且只有作为目标的寄存器读取命令可以在指令块中被使用。这导致节省的块头部资源空间以及在指令块执行期间更高效的寄存器访问。

vi.示例块指令目标编码

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

在以下示例中,汇编语言指令使用以下命名法:“i[<编号>]指定指令块内的指令的编号,其中对于在指令头部之后的指令,编号从零开始,并且对于每个后续指令,指令编号被递增;指令的操作(诸如read(读取)、addi(加法)、div(除法)等)遵循指令编号;可选值(如立即值1)或对寄存器的引用(例如,寄存器0的r0)遵循该操作;并且将接收指令结果的可选目标遵循值和/或操作。目标中的每一个可以是通向另一指令、通向其他指令的广播通道,或是当指令块被提交时可以对另一指令块可见的寄存器。指令目标的一个示例是t[1r],其以指令1的右操作数为目标。寄存器目标的一个示例是w[r0],其中目标被写入到寄存器0。

在图400中,可以使用两个寄存器读取指令(430-431)来发起指令块执行。指令块420的前两个read指令430和431分别以add指令432的右(t[2r])操作数和左(t[2l])操作数为目标。在所图示的isa中,读取指令是从全局寄存器文件读取的唯一指令;然而任何指令都可以以全局寄存器文件为目标。当add指令432接收到两个寄存器读取的结果时,它将变为就绪并执行。注意,本公开有时将右操作数称为op0,并将左操作数称为op1。

当tlei(少于相等立即的测试)指令433从add接收到其单个输入操作数时,其将变得准备好发布和执行。测试然后产生断言操作数,该断言操作数在通道一(b[1p])上被广播到在该广播通道上监听的所有指令,其在本示例中是两个断言分支指令(bro_t434和bro_f435)。接收到匹配断言的分支将发出(执行),但是编码有互补断言的另一指令将不会激发/执行。

用于指令块420的依赖性图形440也被图示为指令节点的阵列450和存储在操作数缓冲器455和456以及断言缓冲器457中的其相应操作数目标。这示出了块指令420、对应的指令窗口条目和由指令表示的底层数据流图之间的对应关系。在这里,经译码的指令read430和read431准备好发出,因为它们没有输入依赖关系。当它们发出并执行时,从寄存器r0和r7读取的值被写入到add432的右操作数缓冲器和左操作数缓冲器中,从而将add432的左操作数和右操作数标记为“就绪”。作为结果,add432指令变为就绪,发出到alu,执行,并且和被写入到tlei指令433的左操作数。

依赖关系图440也可以包括计分板247,其指示译码的就绪状态448和活动就绪状态449。译码的就绪状态由指令译码器初始化,并且活动就绪状态在指令的执行期间由控制器初始化。例如,译码的就绪状态可以对以下各项编码:相应指令是已被译码,是等待可能经由广播通道的断言和/或某个或某些操作数,还是立即准备好发出。活动就绪状态可以对以下各项编码:相应的指令是等待断言和/或某个或某些操作数,是准备好发出,还是已经被发出。译码的就绪状态可以在块复位或块刷新之后被清除。在分支到新的指令块之后,译码的就绪状态和活动就绪状态被清除(块或核的复位)。然而,当在核上重新执行指令块时,诸如当指令块分支回到自己(块刷新)时,仅活动就绪状态被清除。块刷新可以立即发生(当指令块分支到自己时)或者在执行若干其他中间指令块之后发生。因此可以保留指令块的译码的就绪状态,从而不需要重新取读和译码该块的指令。因此,在循环和其他重复程序结构中可以使用块刷新来节省时间和能量。

在一个示例实施例中,指令块420包括两个初始寄存器读取指令430-431,其发起块420的执行。更具体地,代替在头部中具有寄存器读取命令,寄存器读取指令可被包括在指令块中,其中寄存器读取命令指定目标指令并且读取指令的结果被转发到目标指令的操作数缓冲器。例如,如上所述,初始的两个读取指令430-431分别访问寄存器r0和r7,并且获得的数据被转发到指令#2(加法指令)的右操作数缓冲器和左操作数缓冲器。就这一点而言,读取指令可以被执行,并且读取指令的结果被转发给后一指令(例如,432)的操作数缓冲器。

甚至在取读和译码这样的指令之前,可以将执行读取指令的结果转发给后一指令的操作数缓冲器。例如,译码的就绪状态448可以指示初始的两个读取指令被译码(即,指令430-431的译码的就绪状态位448被设置为“1”)。由于读取指令430-431具有执行所必需的信息(例如,要访问哪些寄存器),所以活动就绪状态449也被设置为“1”。依赖关系图440指示当初始的2个指令430-431已经执行但是加法指令432尚未被取读或译码时的状态位448-449。活动就绪状态449可以被设置为“1”,从而指示加法指令432使其所有操作数缓冲器数据可用(来自两个读取指令430-431的执行)。加法指令432一旦被取读和译码就可以被执行。

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

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

图5是示出指令头部510、寄存器read指令519、通用指令520、分支指令530和存储器访问指令540(例如,存储器加载或存储指令)的指令格式的一般化示例的示图。这些指令格式可以被用于根据在指定操作模式的指令头部中指定的若干执行标志执行的指令块。根据位的数量来标记指令头部或指令中的每一个。例如,指令头部510包括四个32位字并且从其最低有效位(lsb)(位0)直到其最高有效位(msb)(位127)被标记。如所示,指令头部包括写入掩码字段、存储掩码字段515、若干退出类型字段、若干执行标志字段、指令块大小字段,以及指令头部id位(指令头部的最低有效位)。对于在不同断言路径上具有不同数量的存储指令的指令块,可以使一个或多个指令无效,并且增加存储指令的执行次数,从而使得每个断言路径将指示的相同数量的存储指令已经在运行时执行。

执行标志字段可以指示特殊的指令执行模式。例如,“禁止分支预测器”标志当该标志被设置时可以被用来禁止指令块的分支预测。作为另一示例,“禁止存储器依赖性预测”标志当该标志被设置时可以被用来禁止指令块的存储器依赖性预测。作为另一示例,当提交指令块时,可以使用“在块之后中断”标志来停止指令线程并引发中断。作为另一示例,在指令块头部被译码时并且在指令块的指令被执行之前,可以使用“在块之前中断”标志来停止指令线程并引发中断。作为另一示例,可以使用“调试模式”标志来控制是在缺省执行模式下执行指令块还是在调试执行模式下执行指令块。

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

寄存器read指令519包括操作码字段、断言字段、通用寄存器(gr)编号(其标识要读取的通用寄存器),以及目标字段(t0和t1)。所图示的通用块指令520被存储为一个32位字,并且包括操作码字段、断言字段、广播id字段(bid)、向量操作字段(v)、单指令多数据(simd)字段、第一目标字段(t1)以及第二目标字段(t2)。对于具有比目标字段更多的消费者的指令,编译器可以使用移动指令来构建扇出树,或者其可以将高扇出指令指派给广播。广播支持通过轻量级网络将操作数发送给核中的任意数量的消费者指令。

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

目标字段t1和t2指定基于块的指令的结果被发送给的指令。例如,指令槽5处的add指令可以指定其计算结果将被发送给槽3和10处的指令,包括操作数槽的规格(例如,左操作、右操作数或断言操作数)。取决于具体的指令和isa,所图示的目标字段中的一者或两者可以被其他信息替换,例如,第一目标字段t1可以被立即操作数、附加操作码替换,指定两个目标,等等。

分支指令530包括操作码字段、断言字段、广播id字段(bid)和偏移量字段。操作码和断言字段在格式和功能上与关于通用指令描述的类似。偏移量可以以四个指令的组为单位来表示,从而扩展了分支所可以被执行于的存储器地址范围。用通用指令520和分支指令530示出的断言可以被用来避免指令块内的附加分支。例如,特定指令的执行可以以前一指令的结果(例如,两个操作数的比较)为基础。如果断言为假,则指令将不会提交由特定指令计算的值。如果断言值与所需断言不匹配,则指令不会发出。例如,bro_f(断言假)指令在其被发送假断言值的情况下将会发出。

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

存储器访问指令540格式包括操作码字段、断言字段、广播id字段(bid)、加载存储id字段(lsid)、直接字段(imm)、偏移量字段以及目标字段。操作码、广播、断言字段在格式和功能上与关于通用指令描述的类似。例如,特定指令的执行可以以前一指令的结果(例如,两个操作数的比较)为基础。如果断言为假,则指令将不会提交由特定指令计算的值。如果断言值与所需断言不匹配,则指令不会发出。直接字段(例如,并移位若干位)可以被用作发送给加载或存储指令的操作数的偏移量。操作数加(移位)立即偏移量被用作加载/存储指令的存储器地址(例如,存储器中的要从读取数据或将数据存储到的地址)。lsid字段指定加载和存储指令在块中的相对顺序。换句话说,较高编号的lsid指示该指令应当在较低编号的lsid之后执行。在一些示例中,处理器可以确定两个加载/存储指令不冲突(例如,基于指令的读取/写入地址)并且可以按照不同顺序执行指令,但是机器的结果状态不应当不同于好像指令已经按照指定的lsid顺序执行。在一些示例中,具有互斥断言值的加载/存储指令可以使用相同的lsid值。例如,如果第一加载/存储指令以值p为真作为基础,并且第二加载/存储指令以值p为假作为基础,则每个指令可以具有相同的lsid值。

viii.处理器核的示例状态

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

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

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

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

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

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

当指令块的指令被加载到处理器核上时,指令块驻留在处理器核上。当指令块的一些但不是全部指令被加载时,指令块是部分驻留的。当指令块的全部指令都被加载时,指令块是完全驻留的。指令块将驻留在处理器核上,直到处理器核被复位或者另一指令块被取读到处理器核上。特别地,当核处于状态620-670时,指令块驻留在处理器核中。

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

在状态640处,相应处理器核的状态可以是“执行”。执行状态可以包括各种操作模式,诸如缺省执行模式和调试模式。在执行状态的缺省模式期间,正在执行指令块的指令。特别地,处理器核的ex和/或ls流水线级在执行状态期间可以是活动的。指令块可以推测性地或非推测性地执行。推测性块可以执行到完成或者其可以在完成之前终止,诸如当确定推测性块所执行的工作将不被使用时。当指令块被终止时,处理器可以转换到中止状态。例如,当确定块的工作将被使用、所有的寄存器写入都被缓冲、所有对存储器的写入都被缓冲并且分支目标被计算时,推测性块可以完成。例如,当所有的寄存器写入都被缓冲、所有对存储器的写入都被缓冲并且分支目标被计算时,非推测性块可以执行到完成。执行状态可以是多个周期长,并且当处理器核是流水线式时可以与取读(620)和译码(630)状态重叠。当指令块完成时,处理器可以转换到提交状态。

在执行状态的调试模式期间,指令块的指令可以是单步的或被一次执行一个。例如,处理器核在执行状态的调试模式下可以被停止,诸如当控制信号被断言时或者当指令头部指定调试模式将被用于指令块时。在接收到执行单步操作的指示之后,可以执行指令块的一个指令。处理器核的中间状态可以被扫描或被从处理器核读出。在接收到执行单步操作的另一指示之后,可以针对指令块的下一指令重复该过程。可以基于编译器生成的顺序、调度器生成的顺序或者在处理器核之外(诸如通过在另一核上运行的调试软件)生成的顺序来确定“下一”指令。块的指令在提交条件得到满足之前可以继续是单步的,然后处理器可以转换到提交状态。

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

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

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

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

ix.示例基于块的处理器和存储器配置

图7是图示了包括基于块的处理器710的装置的示图700,基于块的处理器710包括被配置为根据用于一个或多个操作模式的数据来执行指令块的控制单元720。控制单元720包括核调度器725和存储器访问硬件结构730。核调度器725调度包括以下各项的指令的流程:用于执行指令处理的核的分配和解除分配,在核、寄存器文件、存储器接口和/或i/o接口中的任何者之间的输入数据和输出数据的控制。存储器访问硬件结构730存储包括例如存储掩码数据和/或控制流数据的数据。可以使用包括sram、寄存器(例如,包括触发器或锁存器的阵列)或其他合适的存储器技术的任何合适的技术来实现存储器访问硬件结构730。

基于块的处理器710包括被配置为取读和执行指令块的一个或多个处理器核740-747。所图示的基于块的处理器710具有多达八个核,但是在其他示例中,可以存在64个、512个、1024个或其他数量的基于块的处理器核。基于块的处理器710被耦合到存储器750,存储器750包括若干指令块,该若干指令块包括指令块a和b,并且基于块的处理器710被耦合到计算机可读存储介质盘755,该计算机可读存储介质盘755可以存储用于执行本文描述的一个或多个方法的计算机可执行指令。

指令块a和b可以分别包括头部737和738,以及包括多个指令(例如,如图3中可见)。在一个示例实施例中并且参照图7,指令块(例如,块b)包括第一多个指令751(即,指令i0,...,ix)和第二多个指令752(即,指令iy,...,iz)。第一多个指令751可以包括指定目标(例如,另一指令)而不指定操作数(即,没有明确指定操作数)的指令。来自第一多个指令751的示例指令是加法指令(例如,图4中的指令432,其将指令#3的左操作数指定为目标,而不指定加法指令操作数;加法指令借助执行读取指令430-431而从操作数缓冲器455-456中获得其操作数)。第二多个指令752可以包括指定目标(例如,接收来自执行指令的结果的目标指令)以及至少一个操作数的指令。来自第二多个指令的示例指令是寄存器读取指令(例如,图4中的指令430-431,其将后一指令432的右操作数缓冲器和左操作数缓冲器指定为目标,并将寄存器r0和r7指定为指示数据源的操作数)。在一个示例实施例中,代替在指令块头部中具有寄存器读取命令,指令块可以使用一个或多个寄存器读取指令(例如,在指令752内)作为指令集的一部分。

在另一示例中,缓冲器455-456的内容(例如,常数)可以被存储在另一位置中,或者可以与操作码一起被存储在阵列450中。

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

图8a是用于基于块的处理器的程序的源代码800的示例性片段。图8b是来自图8a的源代码800的示例性片段的依赖关系图805的示例。在该示例中,使用源代码语句801-804来更新变量x、y和z。源代码800可以被编译或转换为可以在基于块的处理器中的处理器核上被原子地执行的指令块。

编译源代码可以包括通过分析源代码800来生成依赖关系图805,以及使用依赖关系图805来发出指令块的指令。依赖关系图805中的节点(例如,810、820和830)可以表示被用来执行源代码800的功能的操作。例如,节点可以直接对应于处理器核所要执行的操作。或者,节点可以对应于处理器核所要执行的宏操作或微操作。连接节点的有向边(例如,811、812和821)表示节点之间的依赖关系。具体而言,消费者或目标节点取决于生成结果的生产者节点,因此在消费者节点之前执行生产者节点。有向边从生产者节点指向消费者节点。在块原子执行模型中,中间结果仅在处理器核中可见,并且在提交指令块时使最终结果对所有处理器核都可见。使用单个圆圈示出产生中间结果的节点(810、820、840和860),并且使用双圆圈示出产生最终结果的节点(830、850、870和880)。

作为具体示例,可以至少根据源代码800的片段来生成依赖关系图805。语句801生成依赖关系图805的三个节点(810、820和830)。节点810表示从寄存器或内存位置读取变量x的值。类似地,节点820表示从寄存器或存储器位置读取变量y的值。如分别由边812和821表示,x和y的值被节点830消耗。节点830表示将x和y的值相加以生成存储在变量z中的值。

语句802可以生成节点840和850。节点840表示从寄存器或存储器位置读取变量b的值。如分别由边831和841表示,z和b的值被节点850消耗。节点850表示将z和b的值相加以生成存储在变量a中的值。

语句803可以生成表示使x的值增加的节点8600。如由边811所示,节点860消耗来自节点810的x的值,并且如由边861所示,节点860为节点870产生x的值。语句804可以生成节点870,节点870表示将值x除以a的值以生成变量x的新值。

节点880不直接对应于源代码语句801-804中的任一个,而是作为源代码语句801-804被分组在指令块内的结果而被生成的。在所公开的技术的一些示例中,指令块将具有到该程序的另一指令块的至少一个分支。节点880表示到下一个指令块的分支。该分支不以依赖关系图805的任何其他节点为条件。

编译源代码800可以包括按照特定顺序发出指令块的指令。在传统的非基于块的处理器中,通过指令的排序来维持指令之间的依赖关系,从而使得依赖性指令必须跟随它们所取决于的指令。相比之下,可以按照任何顺序发出要在基于块的处理器上执行的指令块内的指令,因为依赖关系被编码在指令自身内而不是按照指令的顺序。具体而言,基于块的处理器的指令调度逻辑可以确保恰当的执行顺序,因为调度逻辑将仅在指令的依赖关系得到满足时才发出供执行的指令。因此,以基于块的处理器为目标的编译器可以具有更多的自由度来对指令块内的发出的指令排序。例如,可以基于诸如下列标准的各种标准对指令排序:当指令具有可变长度时的指令大小(从而使得将大小相似的指令分组在一起或使得指令在指令块内保持特定对齐);机器代码指令到源代码语句的映射;指令的类型(从而使得类型相似的指令(例如,具有相同的操作码)被分组在一起,或者某种类型的指令被排在其他类型之前);和/或依赖关系图805的遍历。

如图8b中可见,寄存器读取指令发起指令块执行(例如,节点810、820中的指令),并且也被在指令块内使用(例如,节点840的寄存器读取指令)。

图9a是与来自图8a的源代码800的片段对应的另一示例指令块。图9b是通过参考指令块900的指令来注释依赖关系图805而生成的注释依赖关系图905的示例。具体而言,通过执行对依赖关系图805的宽度优先遍历来生成注释依赖图905。遍历的第一阶段包括标识没有依赖关系的任何节点。具体而言,遍历节点810、820、840和880,从而导致分别发出指令块900的指令i[0]、i[1]、i[4]和i[7]。应当注意的是,在遍历的给定阶段内,可以按照任何顺序发出对应于所遍历节点的指令。具体而言,对于来自第一阶段的三个指令,可能存在三个阶乘(3!)的可能排序。遍历的下一个阶段包括标识仅取决于在遍历的更早阶段中先前已经遍历的节点的任何节点。具体而言,遍历节点860、830和850,从而导致分别发出指令块900的指令i[2]、i[3]和i[5]。遍历的阶段可以继续,直到没有剩下要遍历的节点。在遍历的最后阶段中,遍历节点870,从而导致发出指令块900的指令i[6]。

在所图示的示例中,指令块900的指令都没有对指令目标的向后引用。换句话说,这些指令要么不引用指令目标(例如,i[7]分支指令和i[6]除法指令),要么向前引用指令目标(例如,i[0]和i[1]读取指令,i[2]立即加法指令,i[3]加法指令,i[4]读取指令,以及i[5]加法指令)。因此,指令块900的任何指令的任何依赖关系将来自顺序更早的指令。在操作期间,指令块900的指令可以被顺序地执行,因为在指令被执行之前,每个指令的操作数将准备就绪。例如,寄存器读取指令i[0]和i[1]的结果被转发给后续加法指令i[3]的操作数缓冲器。即使在指令i[3]被取读并译码之前,也可以发生初始读取指令i[0]和i[1]的执行以及将结果存储在i[3]的操作数缓冲器中。就这一点而言,指令i[3]一被取读并译码就可以执行,因为它将有所有其操作数可用。

xi.示例源和目标代码

图10图示了如可以在所公开的技术的某些示例中使用的示例性的源1010和汇编代码1020。源代码1010包括if/else语句。if/else语句的每个部分内的语句包括对阵列a和b的若干存储器读取和存储器写入,包括断言寄存器读取指令,如图10中所图示的。当将源代码1010转换为目标代码时,将生成若干加载和存储汇编指令。

源代码部分1010的汇编代码1020包括被编号为0至25的26个指令。汇编指令指示若干字段,例如指令操作代码pneumonic、由指令指定的源数据,例如,广播标识符或直接参量、加载存储id标识符和目标指定。汇编代码包括寄存器读取指令(0-2和17)、寄存器写入指令(指令25)、算术指令(例如,指令3和4),以及用于将数据发送到多个目标的移动指令(例如,移动指令5和6)。汇编代码1020也包括测试指令(断言的指令)11,其在大于将在广播信道2上生成断言值的指令的情况下是测试。另外,汇编代码包括两个未断言的存储器加载指令7和8,以及一个断言的加载指令16。加载指令24也不是断言的。汇编代码1020也包括若干将把数据存储到存储器地址的存储器存储指令,例如断言的存储指令12、13和19以及未断言的存储指令22。

如在汇编代码1020中所示,加载指令和存储指令中的每一个都已被指派了唯一的lsid。例如,加载指令7被指派给lsid0,加载指令8被指派给lsid1,并且断言的存储指令12被指派给lsid2。lsid指示要执行指令的相对排序。例如,指令12和13取决于首先执行的加载指令7和8。由于加载指令7和8被用来生成将被存储指令12和13存储的值,因此该顺序被强制执行。在一些示例中,两个或更多个加载存储指令可以共享lsid。在一些示例中,指令集架构要求lsid是连续的,而在其他示例中,lsid可以是稀疏的(例如,中间lsid值被跳过)。还应当注意的是,在一些示例中,可以执行对块中的指令的推测性执行或乱序执行,但是处理器仍然必须保持语义,好像lsid所指定的存储器依赖关系未被违反一样。汇编代码部分1020可以被转换为机器代码,以用于基于块的处理器的实际执行。

如图10中所示,汇编代码1020也包括断言的读取指令17。更具体地说,在代码部分1010中的“else”语句必须执行的情况下,断言的寄存器读取指令被用来获得变量s的值。断言的寄存器读取指令17的结果被转发到后一指令18的左操作数缓冲器。

xii.指令块执行的示例方法

图11至图12是概述了如可以在所公开的技术的某些示例中使用的指令块执行的示例方法的流程图。参考图11,当在指令执行期间检测到至少一个寄存器访问指令时,示例方法100开始于1110。例如并参照图4,在指令执行期间可以检测到两个初始寄存器读取指令430-431。该至少一个寄存器访问指令指定目标指令和数据源操作数。例如,寄存器读取指令430将寄存器r0指定为数据源,并将指令i[2]的右操作数指定为目标。在1120处,访问处理器核的寄存器,其中该寄存器与数据源操作数相关联。例如,当执行指令430时访问寄存器r0。在1130,从寄存器取回数据。在1140处,在取读目标指令之前将数据转发到目标指令的操作数缓冲器。例如,指令430-431可以在取读指令432之前执行。就这一点而言,指令432的操作数缓冲器将具有来自指令430-431的所有其操作数值,并且指令432一被取读并译码就可以执行。

参考图10和图12,示例方法1200开始于1210,此时指令块的多个指令被译码。例如,汇编代码1020中的指令0-25可以被译码为指令窗口。这多个指令至少包括发起指令块的执行的第一寄存器读取指令(例如,指令0是寄存器读取指令)。在1220处,检测这多个指令中的断言的指令,该断言的指令具有关联的条件。例如,该断言的指令是图10中的指令11,其以条件“a[i]>a[i+1]”为基础。在1230处,执行第二寄存器读取指令,其中第二寄存器读取指令以关联的条件是否得到满足为基础。例如,指令17是断言的寄存器读取指令,其在当与指令11相关联的条件未得到满足时将会执行(即,指令17在“a[i]≤a[i+1]”时将会执行)。在1240处,执行第二寄存器读取指令的结果被转发给后一目标指令的操作数缓冲器。例如,执行断言的17号寄存器读取指令的结果被转发到18号指令的左操作数缓冲器。

xiii.示例性计算环境

图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可以是显示器、打印机、扬声器、cd刻录机或者提供来自计算环境1300的输出的另一设备。

一个或多个通信连接1370使能通过通信介质(例如,连接网络)到另一计算实体的通信。通信介质在调制数据信号中传送诸如计算机可执行指令、压缩的图形信息、视频或其他数据之类的信息。一个或多个通信连接1370不限于有线连接(例如,兆位或千兆位以太网、无限带宽、通过电连接或光纤连接的光纤通道),而是也包括无线技术(例如,经由蓝牙、wifi(ieee802.11a/b/n)、wimax、蜂窝、卫星、激光、红外的rf连接)以及用于为所公开的方法提供网络连接的其他合适的通信连接。在虚拟主机环境中,一个或多个通信连接可以是由虚拟主机提供的虚拟化网络连接。

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

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

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

根据上面讨论的示例,本文讨论了所公开的主题的附加示例。本领域的普通技术人员将容易理解,本文描述的示例性系统、方法和装置不应被解释为以任何方式限制,并且不限于任何特定的方面或特征或其组合。

在所公开的技术的一些示例中,一种装置包括存储器以及被配置为执行至少一个指令块的一个或多个基于块的处理器核。该至少一个指令块对数据流指令集架构(isa)编码。数据流isa包括第一多个指令和第二多个指令。第一多个指令中的一个或多个指令至少指定第一目标指令而不指定数据源操作数。第二多个指令中的一个或多个指令至少指定第二目标指令以及指定寄存器的数据源操作数。多个处理器核中的一个或多个包括寄存器文件,并且数据源操作数指向该寄存器文件。第二多个指令包括至少一个读取指令。在取读第三目标指令之前,执行至少一个读取指令的结果被转发给至少第三目标指令的操作数缓冲器。也可以在发出或执行第三目标指令之前转发该结果。多个处理器核中的一个或多个处理器核被配置为在完成取读至少一个指令块之前执行至少一个读取指令。至少一个读取指令是至少一个指令块的初始指令。第二多个指令中的一个或多个指令指定指向第二目标指令的指针。数据流isa包括与条件相关联的断言的指令。第二多个指令包括寄存器读取指令,并且寄存器读取指令的执行以该条件是否得到满足为基础。

在所公开的技术的一些示例中,一种操作处理器以执行指令块(该块包括指令块头部和多个指令)的方法包括在指令执行期间检测至少一个寄存器访问指令,该至少一个寄存器访问指令指定目标指令和数据源操作数;访问处理器核的寄存器,该寄存器与数据源操作数相关联;从该寄存器取回数据;以及将该数据转发给目标指令的操作数缓冲器。在取读目标指令之前(和/或在发出或执行目标指令之前)将该数据转发给目标指令的操作数缓冲器。在一些示例中,代替将结果写入到操作数缓冲器,依赖的指令可以从结果总线获得输入,从而避免将结果写入到操作数缓冲器。目标指令在至少一个寄存器访问指令之后被译码。该至少一个寄存器访问指令是根据与断言的指令相关联的条件的满足而被断言的寄存器读取指令。至少一个寄存器访问指令是寄存器读取指令。在译码至少一个寄存器访问指令之后,可以发起取决于至少一个寄存器访问指令的一个或多个指令的执行。该至少一个寄存器访问指令在完成取读该指令块的多个指令之前被执行。该指令块包括多个寄存器读取指令,这些指令仅是多个指令的一部分,而不是指令块头部。

在所公开的技术的一些示例中,一种或多种计算机可读存储介质存储计算机可读指令,这些计算机可读指令当被基于块的处理器执行时使该处理器执行一种方法,这些计算机可读指令包括用于对指令块的多个指令译码的指令。所述多个指令至少包括发起指令块的执行的第一寄存器读取指令。计算机可读指令还包括用于检测所述多个指令中的断言的指令的指令,该断言的指令具有关联的条件。计算机可读指令还包括用于执行第二寄存器读取指令的指令,其中第二寄存器读取指令以关联条件是否得到满足为基础。计算机可读指令还包括用于将执行第二寄存器读取指令的结果转发给后一目标指令的操作数缓冲器的指令。

计算机可读指令还包括用于在取读目标指令之前将该结果转发给操作数缓冲器的指令。在一些示例实施例中,可以使用寄存器分配断言。在这种情况下,断言可以被存储在寄存器文件(例如,专用断言寄存器文件或通用寄存器文件)中。可以用读取指令获得(读取)该断言,并且另一指令(例如,另一读取指令)可以是被用来获得该断言的读取指令的目标。就这一点而言,用读取指令而被读取的寄存器操作数可以是断言。

计算机可读指令还包括用于执行用于从寄存器读取值的第三寄存器读取指令的指令,其中第三寄存器读取指令的目标操作数是从寄存器读取的值的广播。

鉴于可以应用所公开的主题的原理的许多可能的实施例,应当认识到,所示出的实施例仅是优选示例,并且不应该被认为是将权利要求的范围限制为那些优选示例。不如说,所要求保护的主题的范围由以下权利要求限定。因此,我们声称属于这些权利要求的范围内的全部内容是我们的发明。

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