基于块的处理器中的加载-存储顺序的制作方法

文档序号:17123686发布日期:2019-03-16 00:05阅读:177来源:国知局
基于块的处理器中的加载-存储顺序的制作方法

由于根据摩尔定律预测的持续的晶体管缩放,微处理器受益于晶体管计数、集成电路成本、制造资本、时钟频率和能量效率的持续增益,其中相关联的处理器指令集架构(isa)几乎没有变化。然而,在过去40年中驱动半导体行业的光刻技术缩放所带来的好处正在减缓甚至逆转。多年来,精简指令集计算(risc)架构一直是处理器设计中的主要范例。乱序的超标量实现没有表现出面积或性能上的持续改进。相应地,有足够的机会改进处理器isa以扩展性能改进。



技术实现要素:

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

在所公开的技术的一些示例中,处理器包括解码逻辑和发布逻辑。解码逻辑被配置为解码指令块的存储掩码。指令块可以包括加载指令和存储指令,其中每个加载指令和存储指令包括指定指令块内的加载指令或存储指令的相对程序次序的标识符。存储掩码标识指令块的程序次序内的存储指令的位置。发布逻辑被配置为脱离程序次序地发布指令块中的至少一个指令。发布逻辑可以被配置为使用经解码的存储掩码仅在已经发布在加载指令之前的所有存储指令之后才发布加载指令。

提供本发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步被描述。本发明内容不旨在标识所要求保护的主题内容的关键特征或必要特征,也不旨在被用来限制所要求保护的主题内容的范围。通过参考附图进行的以下详细描述,所公开的主题内容的前述和其他对象、特征和优点将变得更加明显。

附图说明

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

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

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

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

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

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

图7图示了用于基于块的处理器的程序的指令的示例片段。

图8图示了包括用于在基于块的处理器核上执行指令块的乱序处理器的示例系统,如可以在所公开的技术的一些示例中所使用的。

图9图示了加载-存储发布逻辑的示例,如可以在所公开的技术的一些示例中所使用的。

图10是图示维护加载-存储发布逻辑的加载-存储数据结构的示例方法的流程图,如可以在所公开的技术的一些示例中所执行的。

图11是图示发布加载指令和存储指令的示例方法的流程图,如可以在所公开的技术的一些示例中所执行的。

图12至图13是图示在基于块的处理器核上执行指令块的示例方法的流程图,如可以在所公开的技术的一些示例中所执行的。

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

具体实施方式

i.一般考虑因素

在不旨在以任何方式进行限制的代表性实施例的上下文中阐述本发明。

除非上下文另有明确规定,否则如本申请中所使用的单数形式“一”、“一个”和“该”包括复数形式。附加地,术语“包括(include)”表示“包括(comprise)”。此外,术语“所耦合的”涵盖将项目耦合或链接在一起的机械、电气、磁性、光学以及其他实际方式,并且不排除在所耦合的项目之间的中间元件的存在。此外,如本文所使用的,术语“和/或”表示短语中的任何一个项目或项目的组合。

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

尽管为了方便呈现而以特定的顺序的次序描述了一些所公开的方法的操作,但应当理解,这种描述方式涵盖重新排列,除非下面所阐述的特定语言要求特定次序。例如,被顺序描述的操作在一些情况下可以重新排列或同时执行。此外,为了简单起见,附图可能未示出所公开的内容和方法可以与其他内容和方法结合使用的各种方式。附加地,该描述有时使用如“产生”、“生成”、“显示”、“接收”、“发出”、“核实”、“执行”和“启动”之类的术语来描述所公开的方法。这些术语是对被执行的实际操作的高级描述。对应于这些术语的实际操作将根据特定实现而变化,并且本领域技术人员可容易地辨别。

出于更好理解的目的,提供了本文中参考本公开的装置或方法而被呈现的操作理论、科学原理或其他理论描述,并且它们不旨在限制范围。所附权利要求中的装置和方法不限于以这种操作理论所描述的方式起作用的那些装置和方法。

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

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

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

ii.所公开的技术的介绍

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

所公开的技术可以通过应用包括高指令级并行(ilp)、乱序、超标量执行的技术来实现能量效率和/或性能增强,同时避免处理器硬件和相关联的软件两者上的巨大的复杂性和开销。在所公开的技术的一些示例中,包括多个处理器核的基于块的处理器使用显式数据图执行(edge)isa(被设计用于区域和能量高效的高ilp执行)。在一些示例中,edge架构和相关联的编译器的使用巧妙地避开了许多寄存器重命名、cam和复杂性。在一些示例中,基于块的处理器的相应的核可以存储或缓存可以被重复执行的所获取的和经解码的指令,并且可以重复使用所获取和经解码的指令以潜在地实现降低的功率和/或增加的性能。

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

在所公开的技术的一些示例中,在指令块内被组织的指令被原子地获取、执行和提交。由原子指令块内的指令产生的中间结果可以在本地被缓冲,直到提交指令块为止。当提交指令块时,对由执行指令块的指令而导致的可见架构状态的更新对其他指令块是可见的。块内的指令以数据流次序执行,这减少或消除了使用寄存器重命名并提供节能的乱序执行。编译器可以被用来通过isa显式地编码数据依赖性,从而减少或消除了处理器核控制逻辑在运行时重新发现依赖性的负担。使用断言(predicate)的执行,可以将块内分支转变为数据流指令,并且除了存储器依赖性之外的依赖性可以被限于直接数据依赖性。所公开的目标形式编码技术允许块内的指令直接经由操作数缓冲器通信它们的操作数,从而减少对耗电的、多端口物理寄存器文件的访问。

在指令块之间,指令可以使用诸如存储器和寄存器的可见架构状态进行通信。因此,通过利用混合数据流执行模型,edge架构仍然可以支持命令式编程语言和顺序存储器语义,但在具有接近有序的功率效率和复杂性的情况下,还理想地享有乱序执行的好处。

乱序处理器可以包括用于追踪未完成(in-flight)的加载指令和存储指令的硬件以用于访问存储器。未完成的指令可以包括已被发布但尚未响应加载数据的加载,以及已被发布但尚未写入回存储器的存储。当典型的乱序处理器乱序地执行加载指令和存储指令时,处理器使用加载-存储队列来加强顺序存储器语义。加载-存储队列可以在将数据写入存储器之前缓冲加载指令和存储指令的数据。典型的加载-存储队列使用内容可寻址存储器(cam)来追踪未完成的加载指令和存储指令并且标识潜在的数据依赖性。虽然cam可以实现高性能,但是在芯片面积和能量使用方面它们可能是昂贵的。例如,cam可以针对cam中的每个条目具有不同的比较器,以便可以在单个周期中测试cam中的所有条目。每个不同的比较器消耗芯片面积和能量。

如本文所公开的,处理器可以在不使用加载-存储队列的情况下执行脱离程序次序的指令。特别地,处理器可以包括指令调度器,该指令调度器加强顺序存储器语义,同时使一些指令能够执行脱离程序次序执行。通过使用调度器来加强顺序存储器语义,可以减少或消除用于加载-存储队列的能量和电路区域。换言之,通过省略加载-存储队列,可以使处理器更小并且更节能。当调度器使用由编译器生成的关于程序结构的信息和关于加载指令和存储指令的序列信息时,可以潜在地使调度器更加有效。例如,程序可以被分成具有最大数目的加载指令和存储指令的预定义指令块。加载指令和存储指令相对于彼此的顺序的次序可以在指令本身内进行编码。可以在指令块的指令头部中标识和编码在顺序的次序内的存储指令的位置。调度器可以使用每个指令的经编码的次序信息中的一个或多个以及存储指令的位置来调度将脱离程序次序被执行的指令,同时遵守存储器操作的次序。

如本领域技术人员将容易理解的,利用各种面积、性能和功率的权衡,所公开的技术的一系列实现是可能的。

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中的每个核可以接收和传送信号量,该信号量指示当前由相应的核中的每个核执行的指令的执行状态。在一些示例中,核互连120被实施成连接核110和存储器系统的导线,而在其他示例中,核互连可以包括用于在(多个)互连导线、开关和/或路由发送组件上多路复用数据信号的电路,包括有源信号驱动程序和中继器,或其他合适的电路。在所公开的技术的一些示例中,在处理器100内部和向/从处理器100传送的信号不限于全摆幅电数字信号,而是处理器可以被配置为包括差分信号、脉冲信号或用于传送数据和控制信号的其他合适信号。

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

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

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

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

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

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

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

在所公开的技术的一些示例中,处理器核111可以被用来执行和提交程序的指令块。指令块是基于块的处理器指令的原子集合,该原子集合包括指令块头部和多个指令。如下面将进一步讨论的,指令块头部可以包括描述指令块的执行模式的信息以及可以被用来进一步定义指令块内的多个指令中的一个或多个指令的语义的信息。取决于所使用的特定isa和处理器硬件,还可以在指令的执行期间使用指令块头部,以通过例如允许提前获取指令和/或数据、改进的分支预测、推测性执行、改进的能量效率以及改进的代码紧凑性来改进执行指令块的性能。

指令块的指令可以是数据流指令,其显式地编码指令块的生产者-消费者指令之间的关系。特别地,指令可以通过仅为目标指令保留的操作数缓冲器将结果直接传送给目标指令。被存储在操作数缓冲器中的中间结果通常对执行核之外的核不可见,因为块原子执行模型仅在指令块之间传递最终结果。当指令块被提交时,使执行原子指令块的指令的最终结果在执行核之外可见。因此,由每个指令块生成的可见架构状态可以表现为执行核之外的单个事务,并且中间结果在执行核之外通常是不可观察的。

如在图2中所示,处理器核111包括控制单元205,其可以从其他核接收控制信号并且生成控制信号以调节核操作并使用指令调度器206来调度核内的指令流。控制单元205可以包括状态访问逻辑207以用于检查核的状态和/或配置处理器核111的操作模式。控制单元205可以包括执行控制逻辑208以用于在处理器核111的一个或多个操作模式期间生成控制信号。可以由控制单元205和/或指令调度器206执行的操作可以包括对核进行分配和解除分配以用于执行指令处理、控制在任何核、寄存器文件、存储器接口140和/或i/o接口145之间的输入数据和输出数据。控制单元205还可以处理硬件中断,并且控制特殊系统寄存器(例如,被存储在一个或多个寄存器文件中的程序计数器)的读取和写入。在所公开技术的其他示例中,使用非基于块的处理核(例如,被耦合到存储器的通用risc处理核)来实施控制单元205和/或指令调度器206。在一些示例中,至少部分地使用以下中的一个或多个来实施控制单元205、指令调度器206、状态访问逻辑207和/或执行控制逻辑208:硬连线的有限状态机、可编程微码、可编程门阵列,或者其他合适的控制电路。

控制单元205可以解码指令块头部以获得关于指令块的信息。例如,可以通过各种执行标记在指令块头部中指定指令块的执行模式。经解码的执行模式可以被存储在执行控制逻辑208的寄存器中。基于执行模式,执行控制逻辑208可以生成控制信号以调节核操作并调度(诸如通过使用指令调度器206)核111内的指令流。例如,在默认执行模式期间,执行控制逻辑208可以对在处理器核111的一个或多个指令窗口(例如,210、211)上执行的一个或多个指令块的指令进行排序。具体地,指令中的每个可以通过指令获取、解码、操作数获取、执行和存储器/数据访问阶段来进行排序,以使指令块的指令可以被流水线化并且并行执行。当指令的操作数可用时,该指令准备好执行,并且指令调度器206可以选择执行指令的次序。

状态访问逻辑207可以包括用于其他核和/或处理器级控制单元(诸如,图1的控制单元160)的接口,以与核111通信并访问核111的状态。例如,状态访问逻辑207可以被连接到核互连(诸如,图1的核互连120),并且其他核可以经由控制信号、消息、读取和写入寄存器等进行通信。

状态访问逻辑207可以包括控制状态寄存器或其他逻辑以用于修改和/或检查指令块的模式和/或状态,和/或核的状态。作为示例,核的状态可以指示:指令块是被映射到核111还是核111的指令窗口(例如,指令窗口210、211)、指令块是否驻留在核111上、指令块是否正在核111上执行、指令块是否准备好提交、指令块是否正在执行提交,以及指令块是否空闲。作为另一示例,指令块的状态可以包括指示指令块是正在执行的最老的指令块的令牌或标记,以及指示指令块正在推测性地执行的标记。

控制状态寄存器(csr)可以被映射到被保留以供基于块的处理器使用的唯一存储器位置。例如,控制单元160(图1)的csr可以被分配给第一地址范围,存储器接口140(图1)的csr可以被分配给第二地址范围,第一处理器核可以被分配给第三地址范围,第二处理器核可以被分配给第四地址范围,等等。在一个实施例中,可以使用基于块的处理器的通用存储器读取和写入指令来访问csr。附加地或备选地,可以使用用于csr的特定读取和写入指令(例如,指令具有与存储器读取和写入指令不同的操作码)来访问csr。因此,一个核可以通过从对应于不同核的csr的地址读取来检查不同核的配置状态。类似地,一个核可以通过写入对应于不同核的csr的地址来修改不同核的配置状态。附加地或备选地,可以通过将命令通过串行扫描链移位到状态访问逻辑207中来访问csr。以这种方式,一个核可以检查不同核的状态访问逻辑207,并且一个核可以修改不同核的状态访问逻辑207或模式。

指令窗口210和211中的每个可以从输入端口220、221和222中的一个或多个接收指令和数据,输入端口220、221和222连接到互连总线和指令高速缓存227,指令高速缓存227又被连接到指令解码器228和229。还可以在附加输入端口225上接收附加的控制信号。指令解码器228和229中的每个为指令块解码指令并将经解码的指令存储在位于每个相应的指令窗口210和211中的存储器存储库215和216内。

处理器核111还包括被耦合到l1(级一)高速缓存235的寄存器文件230。寄存器文件230存储用于在基于块的处理器架构中定义的寄存器的数据,并且可以具有一个或多个读取端口和一个或多个写入端口。例如,寄存器文件可以包括两个或多个写入端口以用于在寄存器文件中存储数据,以及具有多个读取端口以用于从寄存器文件内的各个寄存器读取数据。在一些示例中,单个指令窗口(例如,指令窗口210)一次只能访问寄存器文件的一个端口,而在其他示例中,指令窗口210可以同时访问一个读取端口和一个写入端口,或者可以同时访问两个或多个读取端口和/或写入端口。在一些示例中,寄存器文件230可以包括64个寄存器,寄存器中的每个保持32位数据的字。(本申请将32位数据称为字,除非另有说明。)在一些示例中,寄存器文件230内的寄存器中的一些可以被分配用于特殊目的。例如,寄存器中的一些可以专用作系统寄存器,其示例包括存储常量值的寄存器(例如,全零字)、指示正在被执行的程序线程的当前地址的(多个)程序计数器(pc)、物理核数目、逻辑核数目、核分配拓扑结构、核控制标记、处理器拓扑结构或其他合适的专用目的。在一些示例中,针对一个或每个程序计数器存在多个程序计数器寄存器,以允许跨一个或多个处理器核和/或处理器地并发执行多个执行线程。在一些示例中,程序计数器被实施成指定的存储器位置而不是被实施成寄存器文件中的寄存器。在一些示例中,系统寄存器的使用可能受操作系统或其他监督计算机指令的限制。在一些示例中,寄存器文件230被实施成触发器(flip-flop)阵列,而在其他示例中,可以使用锁存器、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中的每个中。在备选实施例中,控制单元可以在每个时钟周期获取1个、4个或另一数目的指令并将其解码到对应数目的指令窗口中。控制单元205提供指令窗口数据流调度逻辑,以使用记分板245监测每个经解码的指令的输入(例如,每个相应的指令的(多个)断言和(多个)操作数)的就绪状态。当特定的经解码的指令的所有输入就绪时,指令准备好发布。然后,控制逻辑205在每个周期启动一个或多个下一指令(例如,编号最小的就绪指令)的执行,并且其经解码的指令和输入操作数被发送到一个或多个功能单元260以用于执行。经解码的指令还可以编码多个就绪事件。控制逻辑205中的调度器接受来自其他源的这些和/或事件,并更新窗口中其他指令的就绪状态。因此,从处理器核的111个就绪的零输入指令开始,继续执行由零输入指令所针对的指令,等等。

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

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

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

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

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

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

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

本领域技术人员将容易明白,通过在处理器核110的指令窗口(例如,指令窗口210)和控制逻辑205内设计和分配资源,可以在处理器性能上进行折衷。面积、时钟周期、能力和限制基本上确定了各个核110的所实现的性能以及基于块的处理器核110的吞吐量。

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

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

在一些情况下,调度器206接受针对尚未被解码的目标指令的事件,并且还必须禁止重发所发布的就绪指令。指令可以是非断言的或断言的(基于真或假条件)。所断言的指令在被另一指令的断言结果作为目标,并且该结果与断言条件匹配之前不会就绪。如果相关联的断言不匹配,则指令永远不会发布。在一些示例中,可以推测性地发布和执行所断言的指令。在一些示例中,处理器可以随后检查推测性地发布和执行的指令被正确推测。在一些示例中,可以重新执行错误推测的所发布的指令和消耗其输出的块中的指令的特定传递闭包,或者取消错误推测的副作用。在一些示例中,发现错误推测的指令导致整个指令块的彻底的回滚以及重新执行。

v.示例指令块的流

现在转向图3的图300,图示了基于块(包括多个可变长度指令块311-315(a-e))的指令的流的一部分310。指令的流可以被用来实施用户应用、系统服务或任何其他合适的用途。在图3所示的示例中,每个指令块以指令头部开始,跟随有变化数目的指令。例如,指令块311包括头部320和二十个指令321。所图示的特定指令头部320包括多个数据字段,其部分地控制指令块内的指令的执行,并且还允许改进的性能增强技术(包括例如分支预测、推测性执行、惰性评估和/或其他技术)。指令头部320还包括id位,该id位指示头部是指令头部而不是指令。指令头部320还包括对指令块大小的指示。较大块(chunk)的指令的指令块大小可以大于一,例如,指令块内所包含的4个指令的块的数目。换言之,块的大小被移位4位,以便压缩被分配成指定指令块大小的头部空间。因此,大小值0指示最小大小的指令块,该最小大小的指令块是跟随有4个指令的块头部。在一些示例中,指令块大小被表达为字节的数目、字的数目、n字的块的数目、地址、地址偏移,或者使用其他合适的表达来用于描述指令块的大小。在一些示例中,指令块大小由指令块头部和/或脚注中的终止位模式指示。

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

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

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

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

vi.示例块指令目标编码

图4是描绘c语言源代码的两个部分410和415以及它们相应的指令块420和425(以汇编语言)的示例的图400,图400图示了基于块的指令如何能够显式地编码它们的目标。高级c语言源代码可以由目标是基于块的处理器的编译器转变为低级汇编语言和机器代码。高级语言可以抽象出底层计算机架构的许多细节,以便程序员能够专注于程序的功能。相比之下,机器代码根据目标计算机的isa对程序进行编码,以便可以使用计算机的硬件资源在目标计算机上执行程序。汇编语言是一种人类可读形式的机器代码。

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

在图400中,指令块420的前两个read指令430和431分别将具有iid=2的add指令432的右(t[2r])操作数和左(t[2l])操作数作为目标。在所图示的isa中,读取指令是从全局寄存器文件被读取的唯一指令;然而任何指令可以将全局寄存器文件作为目标。当add指令432接收两个寄存器读取的结果时,它将变成就绪并执行。

当tlei(小于等于立即测试)指令433从add接收其单个输入操作数时,它将变成就绪并执行。然后,测试产生断言操作数,该断言操作数在信道1(b[1p])上被广播到在广播信道上收听的所有指令,这些指令在该示例中是两个断言的分支指令(bro(广播)p1t434和brop1f435)。在图400的汇编语言中,“p1f”指示在广播信道1(“1”)上发射的指令在假结果(“f”)上被断言(“p”),并且“p1t”指示在广播信道1上发射的该指令在真结果上被断言。接收匹配断言的分支将触发。

还图示了用于指令块420的依赖性图440,如指令节点的阵列450及其对应的操作数目标455和456。这图示了块指令420、对应的指令窗口条目和由指令表示的底层数据流图之间的对应关系。这里,经解码的指令read430和read431准备发布,因为它们没有输入依赖性。当它们发布和执行时,从寄存器r6和r7读取的值被写入到add432的右和左操作数缓冲器中,将add432的左和右操作数标记为“就绪”。结果,add432指令变成就绪、发布到alu、执行,并将总和写入到tlei433的左操作数。

作为比较,常规的乱序risc或cisc处理器将使用附加的硬件复杂性、功率、面积和降低的时钟频率和性能在运行时动态地构建依赖性图。然而,依赖性图在编译时是静态已知的,并且edge编译器可以通过isa直接编码指令之间的生产者-消费者关系,从而使微架构不再动态地重新发现它们。这可以潜在地实现更简单的微架构、减少的面积、功率和提高的频率和性能。

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

图5是图示用于指令头部510、通用指令520、分支指令530、加载指令540和存储指令550的指令格式的一般化示例的图。根据位的数目来标记指令头部中的每个指令头部或指令中的每个指令。例如,指令头部510包括4个32位字,并从其最低有效位(lsb)(位0)标记直到其最高有效位(msb)(位127)。如所示的,指令头部包括写入掩码字段、存储掩码字段、多个退出类型字段、多个执行标记字段(x标记)、指令块大小字段和指令头部id位(指令头部的最低有效位)。

执行标记字段可以指示特殊的指令执行模式。例如,“禁止分支预测器”标记可以被用来在设置标记时禁止针对指令块的分支预测。作为另一示例,“禁止存储器依赖性预测”标记可以被用来在设置标记时禁止对指令块的存储器依赖性预测。作为另一示例,“块后中断”标记可以被用来在指令块被提交时停止指令线程并引发中断。作为另一示例,“块前中断”标记可以被用来在指令块头部被解码时并且在执行指令块的指令之前停止指令线程并引发中断。

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

所图示的通用块指令520被存储为一个32位字,并且包括操作码字段、断言字段、广播id字段(bid)、第一目标字段(t1)和第二目标字段(t2)。对于消费者多于目标字段的指令,编译器可以使用移动指令构建扇出树,或者它可以向广播分配高扇出指令。广播支持在轻量级网络上向核中的任意数目的消费者指令发送操作数。可以在通用块指令520中编码广播标识符。

虽然由通用指令520概述的通用指令格式可以表示由基于块的处理器处理的一些或所有指令,但是本领域技术人员将容易理解,即使对于isa的特定示例,对于特定指令,一个或多个指令字段也可以偏离通用格式。操作码字段指定指令520的长度或宽度以及由指令520执行的(多个)操作,诸如存储器加载/存储、寄存器读取/写入、加、减、乘、除、移位、旋转、无效、系统操作或其他合适的指令。

断言字段指定指令将在其下执行的条件。例如,断言字段可以指定值“真”,并且只有在对应的条件标记与所指定的断言值匹配时指令才会执行。在一些示例中,断言字段至少部分地指定被用来比较该断言的字段、操作数或其他资源,而在其他示例中,在由先前指令(例如,指令块中的在前指令)设置的标记上断言该执行。在一些示例中,断言字段可以指定指令将始终或从不被执行。因此,通过减少分支指令的数目,断言字段的使用可以允许更紧凑的目标代码、改进的能量效率和改进的处理器性能。

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

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

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

加载指令540被用于取回被存储在存储器的目标地址处的数据,以便数据可以由处理器核使用。可以在运行时动态地计算数据的目标地址。例如,地址可以是加载指令540的操作数和加载指令540的立即数字段之和。作为另一示例,地址可以是加载指令540的操作数和加载指令540的符号扩展和/或移位的立即数字段之和。作为另一示例,数据的地址可以是加载指令540的两个操作数之和。加载指令540可以包括加载-存储标识符字段(lsid)以提供指令块内的加载的相对程序次序。特别地,lsid可以提供加载指令相对于指令块的其他加载指令和存储指令的相对位置,以便可以在运行时标识存储器操作的编程的序列。例如,编译器可以在编译时向指令块的每个加载和存储分配lsid。在一个实施例中,编译器可以在加载指令540的字段内显式地编码lsid。在备选的实施例中,编译器可以基于发出加载指令和存储指令的次序隐式地编码加载指令540的lsid。例如,可以向第一发出的加载指令或存储指令分配lsid=0,可以向第二发出的加载指令或存储指令分配lsid=1,等等。在另一备选的实施例中,编译器可以对指令块的头部中的加载指令和存储指令的lsid进行编码。例如,头部可以包括将lsid映射到iid的字段。可以以各种方式取回和/或格式化数据的量和类型。例如,数据可以被格式化为有符号或无符号值,并且所取回的数据的数量或大小可以变化。例如,可以使用不同的操作码来将加载指令540的类型标识为,诸如,加载无符号字节、加载有符号字节、加载双字、加载无符号半字、加载有符号半字、加载无符号字和加载有符号字。加载指令540的输出可以被引导到如目标字段(t0)所指示的目标指令。

断言的加载指令是基于与指令相关联的结果是否与断言测试值匹配而有条件地执行的加载指令。例如,可以将结果从另一指令递送到断言的加载指令的操作数,并且断言测试值可以在断言的加载指令的字段中进行编码。作为具体示例,当断言字段(pr)的一个或多个位不为零时,加载指令540可以是断言的加载指令。例如,断言字段可以是两位宽,其中一位被用来指示指令被断言,并且一位被用来指示断言测试值。具体地,编码“00”可以指示加载指令540未被断言;“10”可以指示加载指令540被断言在假条件上(例如,断言测试值是“0”);“11”可以指示加载指令540被断言在真条件上(例如,断言测试值是“0”);并且“10”可以被保留。因此,可以使用两位的断言字段来将所接收的结果与真或假条件进行比较。可以使用更宽的断言字段来将所接收的结果与更大的数字进行比较。

在一个示例中,可以经由一个或多个广播操作数或信道将要与断言测试值进行比较的结果传递给指令。可以使用广播标识符字段(bid)在加载指令540内标识断言的广播信道。例如,广播标识符字段可以是两位宽以编码四种可能的广播信道,在该四种可能的广播信道上接收该值以与断言测试值进行比较。作为具体示例,如果在所标识的广播信道上所接收的值与断言测试值匹配,则执行加载指令540。然而,如果在所标识的广播信道上被接收的值与断言测试值不匹配,则不执行加载指令540。

作为32位加载指令540的具体示例,操作码字段可以被编码在位[31:25]中;断言字段可以被编码在位[24:23]中;广播标识符字段可以被编码在位[22:21]中;lsid字段可以被编码在位[20:16]中;立即数字段可以被编码在位[15:9]中;并且目标字段可以被编码在位[8:0]中。

存储指令550被用于在存储器的目标地址处存储数据。可以在运行时动态地计算数据的目标地址。例如,地址可以是存储指令550的第一操作数和存储指令550的立即数字段之和。作为另一示例,地址可以是存储指令550的操作数和存储指令550的符号扩展和/或移位的立即数字段之和。作为另一示例,数据的地址可以是存储指令550的两个操作数之和。存储指令550可以包括加载-存储标识符字段(lsid)以在指令块内提供存储的相对程序次序。特别地,lsid可以提供存储指令相对于指令块的其他加载指令和存储指令的相对位置,以便可以在运行时标识存储器操作的编程的序列。如上面参考加载指令540所描述的,lsid可以在存储指令550的字段中被显式地编码、基于指令块内的存储指令550的发出的次序被隐式地编码,或者在指令块的头部中的字段(例如,lsid-iid映射字段)中被编码。例如,要被存储的数据量可以基于存储指令550(诸如存储字节、存储半字、存储字和存储双字)的操作码而变化。可以从存储指令550的第二操作数输入要被存储在存储器位置处的数据。第二操作数可以由另一指令生成或被编码为存储指令550的字段。

断言的存储指令是基于与指令相关联的结果是否与断言测试值匹配来有条件地执行的存储指令。例如,可以将结果从另一指令递送到断言的存储指令的操作数,并且可以在断言的存储指令的字段中编码断言测试值。例如,当断言字段(pr)中的一个或多个位不为零时,存储指令550可以是断言的存储指令。可以经由一个或多个广播操作数或信道将要与断言测试值进行比较的结果传递给指令。可以使用广播标识符字段(bid)在存储指令550内标识断言的广播信道。作为具体示例,如果在所标识的广播信道上被接收的值与断言测试值匹配,则执行存储指令550。然而,如果在所标识的广播信道上被接收的值与断言测试值不匹配,则不执行存储指令550。

作为32位存储指令550的具体示例,操作码字段可以被编码在位[31:25]中;断言字段可以被编码在位[24:23]中;广播标识符字段可以被编码在位[22:21]中;lsid字段可以被编码在位[20:16]中;并且立即数字段可以被编码在位[15:9]中。位[8:0]可以被保留以用于附加功能或供将来使用。

断言的加载指令和存储指令的使用可能导致加载指令和存储指令中的一些不被执行的条件。例如,第一组指令可以被断言在真值上,并且第二组指令可以被断言在假值上。因此,只有指令组中的一组可以执行,因为变量不能既为真又为假。指令组可以包括相同数目(平衡数目)的加载指令和存储指令或不同数目(不平衡数目)的加载指令和存储指令。例如,当第一组包括两个加载指令和存储指令而第二组包括六个加载指令和存储指令时,组是不平衡的;当第一组和第二组各自包括两个加载指令和存储指令时,组是平衡的。编译器可以根据处理器硬件的功能以各种方式向这些指令分配lsid。作为一个示例,可以向指令块内的每个加载指令和存储指令分配唯一的lsid。作为另一示例,可以对沿着互斥路径的平衡数目的加载指令和存储指令分配重叠的lsid。换言之,如果加载指令和存储指令是互斥的,则指令块内的加载指令和存储指令可以共享相同的lsid。作为具体示例,可以对被断言在真值上的加载指令和被断言在假值上的加载指令两者分配相同的lsid(例如,lsid=1)。可以对任何不平衡的加载指令和存储指令分配唯一的lsid。

无效指令可以取消对应于特定lsid或iid的加载指令或存储指令。在一些处理器实施例中,处理器的控制逻辑可以等待具有特定lsid的指令执行。例如,处理器可以以与lsid匹配的顺序的次序执行加载指令和存储指令,并且控制逻辑可以等待发布加载指令或存储指令,直到在前的(如由lsid所指示的)加载指令或存储指令执行为止。然而,不会执行具有不匹配断言值的断言的加载指令和存储指令。无效指令可以指示将不执行一个或多个加载指令或存储指令。特别地,无效指令可以以由其lsid或iid标识的一个或多个加载指令或存储指令为目标。因此,无效指令可以是用于执行具有特定lsid或iid的加载指令或存储指令的替代。例如,可以由执行的或被无效的加载指令或存储指令来触发等待具有特定lsid的加载指令或存储指令的控制逻辑,以执行动作。

作为一个示例,可以使用通用块指令520的格式对无效指令进行编码。无效指令可以以将不执行的加载指令和存储指令为目标。当未执行的加载指令和存储指令从无效指令接收空操作数时,可以更新控制逻辑,就像未执行的加载指令和存储指令被执行一样。例如,备选的断言的路径可以是不平衡的,其中一条路径上有两个存储指令(例如,真路径),并且另一条路径上有三个存储指令(例如,假路径)。平衡的存储指令可以共享lsid,并且非平衡的存储指令将具有唯一的lsid。较短的路径(真路径)可以包括以不平衡的存储指令为目标的无效指令,以便在控制逻辑看来好像执行了三个存储指令,而不管哪个路径被执行。

作为32位无效指令的具体示例,操作码字段可以被编码在位[31:25]中;断言字段可以被编码在位[24:23]中;广播标识符字段可以被编码在位[22:21]中;第一目标字段可以被编码在位[17:9]中;并且第二目标字段可以被编码在[8:0]中。取决于isa,目标字段可以以具有特定iid或lsid的指令为目标。位[20:18]可以被保留以用于附加功能或供将来使用。作为另一示例,批量无效指令可以使用掩码(使用位掩码来标识被无效的指令)来批量地使一组加载指令或存储指令无效。可以对位掩码进行编码,以便位掩码的每个位对应于不同的lsid。当指令块可以包括比由批量无效指令的单个位掩码字段所支持的更多的lsid时,批量无效指令可以包括掩码移位字段,该掩码移位字段可以被用来在lsid整个范围上移位位掩码。例如,可以使用两位掩码移位字段和八位位掩码来覆盖32个lsid的范围。特别地,每个指令可以使八个lsid无效,并且四个不同的指令可以使所有32个lsid无效,其中每个指令使用在掩码移位字段中的不同的值。作为32位批量无效指令的具体示例,操作码字段可以被编码在位[31:25]中;断言字段可以被编码在位[24:23]中;广播标识符字段可以被编码在位[22:21]中;掩码移位字段可以被编码在[9:8]中;并且掩码字段可以被编码在[7:0]中。位[20:10]可以被保留以用于附加功能或供将来使用。

viii.处理器核的示例状态

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

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

在状态610处,相应的处理器核的状态可以被映射。被映射的处理器核是当前被分配用于执行指令块的实例的核。当指令块被映射到特定处理器核时,指令块未完成。未完成的指令块是以基于块的处理器的特定核为目标的块,并且该块将在该特定处理器核上推测性地或非推测性地执行,或正在执行。特别地,未完成的指令块对应于被映射到处于状态610-650的处理器核的指令块。当在块的映射期间已知程序将使用由执行指令块提供的工作时,块非推测性地执行。当在映射期间不知道程序是否将使用由执行的指令块提供的工作时,块推测性地执行。推测性地执行块可以潜在地提高性能,诸如当比在已经知道将使用块的工作时或之后启动块更早地启动推测性的块时。然而,推测性地执行可能潜在地增加执行程序时所使用的能量,诸如当程序没有使用推测性的工作时。

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

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

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

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

在状态630处,可以解码相应的处理器核的状态。例如,处理器核的dc流水线阶段可以在获取状态期间活跃。在解码状态期间,指令块的指令被解码,以便它们可以被存储在处理器核的指令窗口的存储器存储库中。特别地,指令可以从相对紧凑的机器代码被转变为可以被用来控制处理器核的硬件资源的不太紧凑的表示。可以在解码状态期间标识断言的加载指令和断言的存储指令。当处理器核被流水线化时,解码状态可以是多个周期长并且可以与获取(620)状态和执行(640)状态重叠。在解码指令块的指令之后,可以在满足指令的所有依赖性时执行该指令。

在状态640处,可以执行相应的处理器核的状态。在执行状态期间,正在执行指令块的指令。特别地,处理器核的ex和/或ls流水线阶段可以在执行状态期间活跃。如下面进一步详细描述的,可以以基于指令块的数据流的序列或次序和/或基于指令块的存储器操作的序列来调度指令块的各个指令以用于执行。可以在执行状态期间获取和/或预获取与加载指令和/或存储指令相关联的数据。可以推测性地或非推测性地执行指令块。推测性的块可以执行到完成,或者其可以在完成之前被终止,诸如当确定将不使用由推测性的块执行的工作时。当终止指令块时,处理器可以转换到中止状态。例如,当确定将使用块的工作、缓冲所有寄存器写入、缓冲所有对存储器的写入并且计算分支目标时,可以完成推测性的块。例如,当缓冲所有寄存器写入、缓冲所有对存储器的写入并计算分支目标时,非推测性的块可以执行到完成。当处理器核被流水线化时,执行状态可以是多个周期长并且可以与获取(620)和解码(630)状态重叠。当指令块完成时,处理器可以转换到提交状态。

在状态650处,相应的处理器核的状态可以是提交或中止。在提交期间,指令块的指令的工作可以被原子地提交,以便其他块可以使用该指令的工作。特别地,提交状态可以包括提交阶段,其中被本地缓冲的架构状态被写入到对其他处理器核可见或由其他处理器核可访问的架构状态。当更新该可见的架构状态时,可以发布提交信号并且可以释放处理器核,以便可以在处理器核上执行另一指令块。

在中止状态期间,可以停止核的流水线以降低动态功率耗散。在一些应用中,可以对核进行功率门控,以降低静态功率耗散。与提交/中止状态重叠或在提交/中止状态结束时,处理器核可以接收要在处理器核上被执行的新指令块、可以刷新核、可以使核空闲,或者可以将核复位。

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

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

在状态680处,可以确定是否可以刷新驻留在空闲处理器核上的指令块。如果要刷新核,则可以声明(asserted)块刷新信号,并且核可以转换到执行状态(640)。如果不打算刷新核,则可以声明块复位信号,并且核可以转换到未被映射的状态(605)。当核被复位时,可以将该核与其他未被映射的核一起放到池中,以便指令块调度器可以向核分配新的指令块。

ix.乱序架构的示例

图7图示了用于基于块的处理器的程序的指令700的示例片段。程序可以包括多个指令块,诸如指令块710-712。基于程序的控制决策,在运行时动态地确定指令块710-712的执行次序。如所图示的,块710跟随有块711,块711跟随有块712。指令块是要作为组被执行的预定义的指令组。例如,编译器可以将程序划分成一个或多个指令块。给定指令块可以包括单个基本块、基本块的一部分或多个基本块,只要指令块可以在isa和目标计算机的硬件资源的约束内被执行即可。基本块是代码的块,其中控制只能够在块的第一条指令处进入块,并且控制只能够在基本块的最后一条指令处离开块。因此,基本块是被一起执行的指令的序列。可以使用断言的指令将多个基本块组合成单个指令块,以使指令块内的分支转变为数据流指令。指令块710-712可以各自在处理器的基于块的处理器核上被原子地执行。例如,给定指令块的指令被一起执行,并且,由指令块的任何指令对可见架构状态做出的任何改变在下一指令块访问可见架构状态之前进行。更新可见架构状态可以包括写入到寄存器和/或存储器。

指令块710-712中的每个可以包括用于以各种粒度对存储器写入和读取的加载指令和存储指令、以及用于执行不访问存储器的功能的非加载-存储指令。例如,非加载-存储指令可以包括用于从寄存器读取的读取指令和用于将两个操作数相加的相加指令。加载指令可以包括加载字(lw,例如,四个字节)、加载半字(lh,例如,两个字节)和加载字节(1b,例如,一个字节)指令。类似地,存储指令可以包括存储字(sw,例如,四个字节)、存储半字(sh,例如,两个字节)和存储字节(sb,例如,一个字节)指令。加载指令和存储指令中每个可以包括从其加载或存储数据的存储器地址。例如,存储器可以是字节可寻址的。如在图7中所图示的,利用“@”符号来指示地址,并且地址是十六进制的字节地址。存储指令可以包括要被写入到存储器的数据。如在图7中所图示的,在“=”符号之后呈现指令的存储数据并且存储数据是十六进制的。加载指令可以利用从存储器读取或加载的数据进行响应或将该数据返回。如在图7中所图示的,在“=>”符号之后呈现指令的预期的加载响应数据并且该数据是十六进制的。

在指令块内将指令排序。指令的程序次序是由源代码和/或目标代码程序指定的次序。例如,程序可以体现程序员想要的执行次序。程序通常以源代码编写,并且编译器可以将源代码转变成处理器可以执行的目标代码或机器代码。机器代码可以从编译器发出并按顺序的次序被存储在存储器中。例如,块710包括被标记为i[0]到i[18]的十九个指令。因此,指令块中的每个指令可以具有唯一的标识符,该唯一标识符指示指令被存储在存储器中的次序。指令被存储在存储器中的次序可以与程序次序相同或不同。附加地,存储器操作相对于彼此的次序可以与指令块内的所有指令的次序被分开追踪。具体地,每个加载指令和存储指令可以包括由编译器分配的加载-存储标识符(lsid或lsid)。lsid指示加载指令和存储指令相对于彼此的相对程序次序,同时排除非加载-存储指令。作为一个示例,具有较低lsid的指令可以指示该指令在程序次序中比具有较高lsid的指令更早。特别地,指令720(具有指令标识符=8,并且lsid=4)在程序次序上比指令721(具有指令标识符=14,并且lsid=a)早并且在程序次序上比指令722(具有指令标识符=5,并且lsid=1)晚。应当注意,为了便于说明,可以从图7中省略加载指令和存储指令的一些方面。例如,示例代码700的加载指令和存储指令使用常量地址而不是通过将基础地址加到偏移而生成的地址。

乱序处理器可以以与程序次序不同的次序和/或以与指令被存储在存储器中的次序不同的次序来执行指令。例如,处理器可以以与程序次序不同的数据流次序执行指令。为了保持程序的正确操作,执行次序必须考虑指令之间的数据依赖性。可以使用与调度加载指令和存储指令时不同的标准来调度非加载-存储指令以用于执行。

通常,如果加载指令和存储指令的目标地址不重叠,则可以脱离程序次序完成加载指令和存储指令。但是,如果加载指令和存储指令具有重叠的目标地址,则在完成加载指令和存储指令时会考虑加载指令和存储指令的程序次序。因为可以在运行时计算地址,所以确定加载和存储是否到重叠的地址是动态的运行时决策。在硬件资源和能量消耗方面,确定一系列加载和存储是否到重叠的地址可能是昂贵的。例如,加载-存储队列可以被用来确定哪些加载和存储具有重叠地址,并且当乱序执行加载指令和存储指令时可以将存储数据转发到加载指令。备选地,如果加载和存储中的特定的一些被调度为以程序次序执行,则可以省略加载-存储队列。如上所述,编译器可以使用针对每个加载指令和存储指令的显式编码的lsid字段、指令块的指令头部中的映射字段,或者加载指令和存储指令的发出的次序,将程序次序运送到解码/执行逻辑。

到重叠的目标地址的加载和存储可以创建数据依赖性,诸如写入后读取(raw)、读取后写入(war)和写入后写入(waw)依赖性。对于写入后读取依赖性,在程序次序上比到相同的目标地址的存储指令晚发生的加载指令应当返回由存储指令写入的数据。对于读取后写入依赖性,在存储指令更新目标地址处的数据之前,在程序次序上比到相同的目标地址的存储指令早发生的加载指令应当返回被存储在目标地址处的数据。对于写入后写入依赖性,由在程序次序上比到相同的目标地址的第二存储指令早发生的第一存储指令写入的数据应当由第二存储指令的数据覆盖。

数据依赖性可以在指令块内和指令块之间发生。示例700图示了指令块内和指令块之间的许多不同的raw、war和waw依赖性以及来自加载指令和存储指令的预期的结果。指令块内的写入后读取依赖性的一个示例是跟随块710中的存储指令720的加载指令721。当考虑指令720和指令721的程序次序(如由它们相应的lsid所指示的)时,存储值“10”被写入到地址21,并且“10”由加载指令721读出。因此,由加载721提供的响应数据依赖于存储720。然而,如果脱离程序次序完成指令720和指令721(例如,以相反的次序),则由指令721返回的读取响应数据可能是“bb”(由指令722存储的)而不是由指令720存储的“10”。如果指令721返回“bb”,则将在程序中引入错误。指令块之间的写入后读取依赖性的一个示例是跟随块710中的存储指令720的块711中的加载指令730。为了正确操作,加载指令730将返回由存储指令720写入的数据(例如,“d11a”)。

图8图示了包括乱序指令调度器830的示例计算系统800。计算系统800可以被用于在基于块的处理器核上执行程序。例如,程序可以包括指令块a-e。指令块a-e可以被存储在可以由处理器805可访问的存储器810中。处理器805可以包括多个基于块的处理器核(包括基于块的处理器核820)、可选的存储器控制器和级二(l2)高速缓存840、高速缓存一致性逻辑845、控制单元850和输入/输出(i/o)接口860。基于块的处理器核820可以与被用于存储和取回程序的指令和数据的存储器层级或存储器子系统通信。

存储器层级可以被用来潜在地增加访问被存储在存储器810中的数据的速度。通常,存储器层级包括具有不同速度和大小的多级存储器。处理器核内或更靠近存储器核的级通常比远离处理器核的级更快且更小。例如,存储器层级可以包括处理器核内的级一(l1)高速缓存、由多个处理器核共享的处理器内的级二(l2)高速缓存、处理器片外或外部的主存储器,以及位于存储设备(诸如硬盘驱动器)上的后备存储库。当访问存储器层级时,可以在存储器层级的较慢和较远的级之前访问存储器层级的更快和更近的级。作为一个示例,存储器层级可以包括级一(l1)高速缓存839、存储器控制器和级二(l2)高速缓存840,以及存储器810。存储器控制器和级二(l2)高速缓存840可以被用来生成用于与存储器810通信的控制信号,并且为来自或去往存储器810的信息提供临时存储。如在图8中所图示的,存储器810在处理器805的片外或外部。然而,存储器810可以完全或部分地被集成在处理器805内。

控制单元850可以被用于实施针对程序的全部或部分运行时环境。运行时环境可以被用于管理基于块的处理器核和存储器810的使用。例如,存储器810可被分区成包括指令块a-e的代码段812和包括静态部分、堆部分和堆栈部分的数据段815。作为另一示例,控制单元850可以被用于分配处理器核以执行指令块。可选的i/o接口860可以被用于将处理器805连接到各种输入设备(诸如输入设备866)、各种输出设备(诸如显示器864)和存储设备862。在一些示例中,处理器核820、存储器控制器和l2高速缓存840、高速缓存一致性逻辑845、控制单元850和i/o接口860的组件至少部分地使用以下中的一项或多项来实施:硬连线有限状态机、可编程微码、可编程门阵列或其他合适的控制电路。在一些示例中,高速缓存一致性逻辑845、控制单元850和i/o接口860至少部分地使用外部计算机(例如,执行控制代码并经由通信接口(未被示出)与处理器805通信的片外处理器)来实施。

可以在处理器805上执行程序的全部或一部分。具体地,控制单元850可以分配一个或多个基于块的处理器核(诸如处理器核820)来执行程序。控制单元850可以将指令块的起始地址通信到处理器核820,以便可以从存储器810的代码段812获取指令块。具体地,获取逻辑822可以向存储器控制器和l2高速缓存840发布读取请求以获得包含指令块的存储器块。存储器控制器和l2高速缓存840可以将指令块返回到处理器核820。指令块可以包括指令头部和指令。指令头部可以由头部解码逻辑824解码以确定关于指令块的信息,诸如指令块的存储掩码。指令块的各个指令可以由指令解码逻辑825解码,并且来自经解码的指令的信息可以被存储在指令窗口826和827中。至少基于指令操作数何时变得可用,指令块的指令可以被动态地发布或调度以用于由指令发布逻辑830执行。因此,指令的发布或执行次序可以与指令的程序次序不同。可以使用执行逻辑828(诸如算术逻辑单元)完全或部分地执行指令。当指令执行时,指令块的中间值(诸如指令窗口826和827的操作数缓冲器)被计算并且被本地存储在处理器核820的状态内。执行逻辑828可以包括存储器接口逻辑838或者与存储器接口逻辑838通信以用于使用存储器指令(例如,加载指令和存储指令)来访问存储器。提交逻辑836可以追踪指令块的正在执行的指令的状态,并且可以在完成提交条件时提交指令块。例如,提交条件可以包括完成指令块的所有寄存器写入和存储器存储以及计算针对下一指令块的分支目标地址。在一个实施例中,在当前指令块提交之后,就可以获取下一指令块。以这种方式,在当前指令块提交时,当前指令块的所有指令的工作可以作为单个事务被释放到下一指令块。

指令调度器830可以包括加载-存储发布逻辑832和非加载-存储发布逻辑834。非加载-存储发布逻辑834可以被用来发布非加载-存储指令(诸如,图7中的块710的指令i[0-3]和i[17-18])以用于执行。例如,非加载-存储发布逻辑834可以基于可以与程序次序不同的数据流次序来调度非加载-存储指令以用于执行。特别地,当指令的操作数就绪时,可以调度指令来执行。使用来自图7的示例700,块710的指令i[0-3]可以相对于彼此以任何次序发布,因为指令i[0-3]之间不存在依赖性。然而,指令i[17]直到其操作数由指令i[2]和i[3]计算才能够发布。类似地,指令i[18]直到其操作数由指令i[0]和i[1]计算才能够发布。指令i[17]和i[18]之间没有依赖性关系,因此它们也可以相对于彼此以任何次序发布(当它们的操作数就绪之后)。如所图示的,加载指令和存储指令(i[4-16])和非加载-存储指令之间没有依赖性关系,并且因此非加载-存储指令可以相对于加载-存储指令以任何次序发布。在其他示例中,非加载-存储指令与加载指令和存储指令之间可能存在依赖性。可以使用指令窗口826和827来追踪非加载-存储指令与加载指令和存储指令之间的任何依赖性。例如,非加载-存储指令可以被用于计算加载指令和存储指令的目标地址。

加载-存储发布逻辑832可以被用来发布加载指令和存储指令以用于执行。例如,加载-存储发布逻辑832可以基于何时计算加载和存储地址的目标地址(诸如通过使用非加载-存储指令)并且基于加载指令和存储指令的相对程序次序来发布加载指令和存储指令。具体地,加载-存储发布逻辑832可以发布加载指令和存储指令以用于按次序执行,以便满足加载指令和存储指令之间的所有数据依赖性并且保存顺序存储器语义。不是使用加载-存储队列来缓冲加载和存储数据并在各个加载指令和存储指令内搜索重叠的目标地址,加载-存储发布逻辑832可以使用编译器生成的关于存储器操作的相对次序的信息,来确保满足数据依赖性。通过省略加载-存储队列,存储指令数据被直接写入到存储器层级,并且直接从存储器层级读取加载数据。

图9图示了加载-存储发布逻辑832的不同组件。加载-存储发布逻辑832的组件可以包括待定的加载-存储指令数据结构910和下一加载-存储指令发布逻辑920。在一些示例中,至少部分地使用以下中的一项或多项来实施组件:硬连线有限状态机、可编程微码、可编程门阵列、随机存取存储器或其他合适的控制电路。

待定的加载-存储指令数据结构910可以被用来追踪驻留指令块内的加载指令和存储指令的状态。具体地,待定的加载-存储指令数据结构910可以包括待定的存储数据结构和待定的加载数据结构。例如,数据结构可以包括位掩码,其中位掩码的每个位可以对应于lsid。因此,当指令块可以包括最多32个加载指令和存储指令时,每个位掩码可以是32位宽。

当获取新指令块并且至少部分地将其解码时,可以初始化待定的加载-存储指令数据结构910。例如,指令块的指令头部可以包括存储掩码912。作为另一示例,存储掩码912可以在指定存储掩码912的指令内进行编码。存储掩码912可以从解码逻辑(例如,头部解码逻辑824)被通信到加载-存储发布逻辑832。存储掩码912可以是位掩码,其位对应于指令块的每个可能的lsid。存储掩码912的每个声明的(例如,一个值)位可以指示对应于该位的lsid是存储指令。存储掩码912的每个解除声明的(例如,零值)位可以指示对应于该位的lsid是加载指令或者未被用于指令块。作为具体示例,如果指令块的存储指令被分配了3、6和9的lsid,则将声明存储掩码的位3、6和9。作为另一示例,针对来自图7的块710的存储掩码的低十六位可以是“0001_0000_0001_1110”,因为存储指令具有一、二、三、四和十三(十六进制c)的lsid。当存储掩码912从解码逻辑被通信到加载-存储发布逻辑832时,可以用来自存储掩码的值来初始化待定的存储位掩码,因为块的所有存储在它们被执行之前是待定的。待定的加载位掩码在其被初始化时可以被清除,因为在各个指令被解码之前,可能不知道被分配给加载指令的lsid。备选地,可以在指令头部中包括加载掩码,并且可以使用加载掩码来初始化待定的加载位掩码,其所有加载可以在指令块内被执行。作为又一备选,针对每个lsid使用多个位的组合掩码可以被用来提供关于加载指令和存储指令的构成和位置的信息。例如,两个位的字段可以被用来指示对于给定的lsid是否存在加载指令或存储指令,以及该指令是加载还是存储。作为又一备选,可以省略存储掩码912,并且可以在解码各个存储指令时生成待定的存储位掩码。

当解码指令块的各个指令时,可以更新待定的加载-存储指令数据结构910。例如,解码逻辑(例如,指令解码逻辑825)可以将经解码的指令字段914通信到加载-存储发布逻辑832。作为具体示例,经解码的指令字段914可以包括与对经解码的指令(例如,指令窗口826和827中的存储位置)、lsid和指示指令是加载、存储还是非加载-存储指令的加载-存储字段的引用相对应的指令标识符(iid)。对于指令块的每个经解码的指令,iid可以是唯一的。例如,iid可以是指令块内的指令的顺序编号和/或可以是指令窗口内的经解码的指令的存储位置。当检测到加载指令时,可以更新待定的加载位掩码。具体地,可以在待定的加载位掩码中声明与所检测的加载指令的lsid相对应的位,以指示具有该lsid的加载指令是待定的。当使用存储掩码912时,可以忽略最新解码的存储指令,因为存储掩码912传达关于存储指令使用哪些lsid的信息。如果未使用存储掩码912,则可以在待定的存储位掩码中声明与所检测的存储指令的lsid相对应的位,以指示具有该lsid的存储指令是待定的。

下一加载-存储指令发布逻辑920可以使用待定的加载-存储指令数据结构910来确定何时可以向执行逻辑发布加载指令或存储指令。具体地,下一加载-存储指令发布逻辑920可以基于已经发布指令块的哪些加载指令和存储指令以及加载指令和存储指令关于彼此的相对程序次序来确定要发布的下一个加载指令或存储指令。下一加载-存储指令发布逻辑920可以使用至少两种不同方法来操作。在一种方法中,指令块的加载指令和存储指令通常按照由lsid指示的顺序的次序来发布。因此,具有lsid为零的指令将在具有lsid为一的指令之前被发布,等等。在另一方法中,存储掩码912可以被用来调度加载指令和存储指令,以便仅在加载指令之前的所有存储指令已经被执行之后才调度加载指令来执行。例如,存储掩码912可以被用来标识存储指令,存储指令通常可以按照由lsid指示的顺序的次序来发布,并且一对存储指令之间的加载指令可以脱离程序次序,但是在该对的第一存储指令之后并且在该对的第二存储指令之前被发布。作为具体示例,如果一组加载指令(具有五到七的lsid)被定位在lsid为四和八的存储指令之间,则只要在具有lsid为四的存储指令之后并且在具有lsid为八的存储指令之前发布加载指令,就可以按照任意次序发布该组的各个加载指令。因此,例如,可以以{4,7,5,6,8}或{4,6,5,7,8}的次序发布指令。

下一加载-存储指令发布逻辑920不能发布加载指令或存储指令,除非满足针对加载指令或存储指令的所有依赖性。例如,程序次序中较早的指令可以被用来计算加载指令或存储指令的目标地址。换言之,较早的指令可以为加载指令或存储指令的操作数提供值。因此,iid操作数就绪信号922可以被用来指示针对具有对应的iid的指令的所有操作数已经被存储在指令窗口中并且能够发布指令。iid操作数就绪信号922可以包括位向量,其中向量的每个位对应于给定的iid。因此,可以通过分析iid操作数就绪信号922的位向量来确定指令窗口的所有指令的就绪状态。具体地,所声明的位可以指示具有该iid的指令就绪并且解除声明的位可以表示具有该iid的指令未就绪。

可以在iid和lsid之间执行映射,因为可以存在比lsid更多的指令(和iid),因为指令块中可能存在非加载-存储指令以及加载指令和存储指令。例如,lsid和iid之间的映射可以在指令解码期间被执行并且被存储在由lsid索引的lsid存储器924中。从图7的示例700,指令720包括八的iid和四的lsid,因此可以在lsid存储器924的地址位置四处写入八。作为另一示例,指令721包括十四的iid和十(十六进制a)的lsid,因此可以在lsid存储器924的地址位置十处写入十四。使用lsid存储器924使得经解码的指令能够被放置在指令窗口内的任何位置,以使iid和lsid之间没有固定的关系。作为备选,经解码的加载指令和存储指令总是可以被映射到指令窗口的保留区域,以使在iid和lsid之间存在固定的映射。例如,当isa支持每个指令块最多32个加载指令和存储指令时,可以为加载指令和存储指令保留指令窗口内的32个位置。当编译器将lsid分配给单个指令时,可以对lsid存储器924调整大小以存储单个iid。然而,如果编译器可以将lsid分配给多个指令(例如,当指令处于互斥并行断言的路径中时),则对lsid调整大小以容纳一个以上的iid。

当以由指令的lsid提供的次序,顺序地发布加载指令和存储指令时,下一lsid计数器923可以被用来追踪要执行的下一加载指令或存储指令的lsid。当处理器核获取新的指令块时,下一lsid计数器923可以被初始化为零。每次发布与计数器的当前值匹配的加载指令或存储指令时,下一lsid计数器923可以递增。以这种方式,可以根据加载指令和存储指令的lsid顺序地发布加载指令和存储指令。

要发布的iid信号926的可以被用来指示可以发布与下一lsid计数器923匹配的加载指令或存储指令。具体地,要发布的iid信号926可以指示具有与下一lsid计数器923匹配的lsid的加载指令或存储指令的iid。作为一个示例,要发布的iid信号926可以是位向量,其中向量的每个位对应于指令块的每个可能的iid。因此,如果isa在指令块中允许最多128个指令,则要发布的iid信号926可以是128位宽。备选地,要发布的iid信号926可以是单个位宽,并且下一lsid计数器值和要发布的iid信号926可以被用来指示何时发布指令。当指令的操作数就绪(如由iid操作数就绪信号922所指示的)时,可以声明要发布的iid信号926。

备选地,要发布的iid信号926可以是编码的二进制值(例如,5位可以被用来编码多达32个iid,6位可以被用来编码多达64个iid,等等),并且每个指令的调度器逻辑的片可以将二进制iid值与其(常量)iid进行比较。因此,具有iid=7的经解码的加载/存储指令将等待发布,直到其(多个)输入操作数就绪(例如,断言以及基础地址)并且其iid(例如,7)与要发布的iid信号926匹配为止。在该实施例中,要发布的iid信号926可以与通常的数据流调度器操作数就绪逻辑互补或补充。特别地,如果经解码的指令被指定或标记为“加载/存储存储器访问”,则在发布该指令之前,发布逻辑检查附加条件,其中附加条件是iid与要发布的iid信号926相匹配。

可以调整下一lsid计数器923以考虑在指令块内可能未被执行的断言的加载指令和存储指令。例如,无效指令可以被用来指示加载指令或存储指令将不执行。可选的无效逻辑930可以被用来追踪无效的加载指令或存储指令的lsid和/或iid。例如,当执行无效指令时,无效逻辑930可以从执行逻辑接收信息。所接收的信息可以包括一个或多个要无效的指令的iid或lsid。例如,可以使用lsid存储器924来执行从iid到lsid的映射。无效逻辑930可以包括用于追踪无效的指令的数据结构。例如,该数据结构可以是位掩码或位向量,其中每个位对应于lsid。当具有lsid的加载指令或存储指令被无效时,可以声明针对给定的lsid的位。可以将下一lsid计数器923的输出与由无效逻辑930追踪的无效的指令进行比较。如果下一lsid计数器923的值与无效的指令相匹配,则计数器923可以前进到未被无效的下一指令。附加地,如果计数器923的下一顺序值与无效的指令相匹配,则当计数器923前进时,计数器923可以前进到尚未被无效的下一指令。以这种方式,可以以顺序的次序发布加载指令和存储指令,跳过任何被断言且未被执行的加载指令和存储指令。

存储掩码912可以被用来调度加载指令和存储指令,以便仅在加载指令之前的所有存储指令已经被执行之后才调度加载指令来执行。存储指令相对于彼此以如由存储指令的lsid所指示的相对顺序的次序来执行。可以乱序地执行存储指令之间的加载指令。来自图7的块710的加载指令和存储指令可以被用作具体示例。以相对程序次序发布具有lsid=0-4的指令,但可以乱序地(但在具有lsid=c的存储指令之前)发布具有lsid=5-b的加载指令。例如,可以以基于加载指令的操作数何时就绪的数据流次序来发布具有lsid=5-b加载指令。作为具体示例,可以以{0,1,2,3,4,9,7,5,6,a,b,8,c}的次序发布指令,其中序列中的数字指示lsid。通过脱离程序次序发布加载指令,指令块可以比以程序次序发布加载指令更快地完成。例如,在程序次序中在后的加载指令的操作数可以在程序次序中在前的加载指令的操作数之前就绪。因此,通过脱离程序次序发布加载指令以用于执行,可以潜在地提高处理器的性能。

只要不同指令之间不存在依赖性,就可以与加载指令和存储指令无关地调度指令块的非加载-存储指令。例如,可以以与程序次序不同的数据流次序来调度非加载-存储指令。作为来自图7的具体示例,带有iid为0-3和17-18的非加载-存储指令与加载指令和存储指令无关,并且可以以数据流次序(诸如{0,1,18,2,3,17},其中序列中的数字指示iid)进行调度。

使用存储掩码912来初始化的待定的加载-存储指令数据结构910可以被用来调度加载指令和存储指令。例如,可以确定最低待定的存储指令和最低待定的加载或存储(pending-load-or-store)指令。如果最低待定的加载或存储指令是存储指令,则可以以如由lsid所指示的相对程序次序发布存储指令。然而,如果最低待定的加载或存储指令是加载指令,则可以发布具有比最低待定的存储指令小的lsid的任何加载指令。如果没有待定的存储指令,则可以以任何次序发布剩余的加载指令。可以使用要发布的iid信号926来指示要被发布的所选择的加载指令或存储指令。备选地,可以由lsid来标识要发布的指令。当没有待定的存储指令时,可以声明存储完成信号916。存储完成信号916可以被用作用于确定何时提交指令块的标准中的一个。

x.乱序处理器的示例方法

图10是示出维持加载-存储发布逻辑(诸如图8-图9的加载-存储发布逻辑832)的加载-存储数据结构的示例方法1000的流程图。

在过程框1010处,可以响应于接收存储掩码来更新待定的存储请求数据结构。例如,待定的存储请求数据结构可以包括位掩码,其中位掩码的每个位可以对应于lsid。存储掩码可以通过每个存储指令的lsid指示指令块的所有存储指令的位置。例如,存储掩码可以是位掩码,其中位掩码的每个断言的位对应于存储指令的lsid。例如,可以在将指令块的指令头部解码之后接收存储掩码。可以通过将值从存储掩码复制到待定的存储位掩码来初始化待定的存储位掩码。以这种方式,将待定的存储位掩码初始化以指示对于指令块为待定的所有存储指令。

还可以响应于接收指令块的指令头部被解码的指示来初始化待定的加载数据结构。例如,待定的加载数据结构可以包括待定的加载位掩码。当指令块的指令头部被解码时,可以将待定的加载位掩码初始化为全零。备选地,指令头部可以包括加载掩码,并且可以通过将值从加载掩码复制到待定的加载位掩码来初始化待定的加载位掩码。

在过程框1020处,可以响应于接收经解码的指令信息来更新待定的加载和/或待定的存储请求数据结构。例如,经解码的指令信息可以被用来确定哪些指令是加载指令或存储指令以及每个加载指令和存储指令的lsid。被解码但尚未发布以执行的指令是待定的,直到指令被执行或被无效为止。例如,指令可以保持待定,直到指令的操作数就绪、满足执行具有lsid的加载指令或存储指令的条件、并且硬件资源可用于执行指令为止。当检测到具有该lsid的加载指令时,可以在待定的加载位掩码中声明对应于经解码的加载指令的lsid的位。如果不使用存储掩码来初始化待定的存储位掩码,则当检测到具有该lsid的存储指令时,可以在待定的存储位掩码中声明与经解码的存储指令的lsid相对应的位。

在过程框1030处,可以响应于发布加载和/或存储指令以用于执行来更新待定的加载和/或待定的存储请求数据结构。例如,当发布加载指令时,可以在待定的加载位掩码中解除声明与所发布的加载指令的lsid相对应的位。类似地,当发布存储指令时,可以在待定的存储位掩码中解除声明与所发布的存储指令的lsid相对应的位。

在过程框1040处,可以响应于接收无效请求来更新待定的加载和/或待定的存储请求数据结构。例如,在执行无效指令时,可以由执行逻辑生成无效请求。无效指令可以指示将不执行一个或多个加载指令或存储指令。例如,无效指令可以通过指令的iid来以加载指令或存储指令为目标。作为另一示例,无效指令可以通过指令的lsid来以加载指令或存储指令为目标。作为另一示例,无效指令可以使用掩码来以在lsid范围内的加载指令或存储指令为目标。当指令被无效时,指令不再是待定的。因此,当加载指令被无效时,与无效的加载指令的lsid相对应的位可以在待定的加载位掩码中被解除声明。类似地,当存储指令被无效时,与无效的存储指令的lsid相对应的位可以在待定的存储位掩码中被解除声明。

图11是图示发布加载指令和存储指令的示例方法1100的流程图,诸如可以由图8-图9的加载-存储发布逻辑832执行。

在过程框1110处,可以确定针对待定的存储指令的最低lsid。例如,待定的存储位掩码可以被用来查找待定的存储指令的最低lsid。特别地,待定的存储位掩码可以被用作优先级编码器的输入,该优先级编码器可以输出针对待定的存储指令的最低lsid。

在过程框1120处,可以确定具有最低待定的lsid的指令的类型。例如,待定的加载位掩码可以被用作优先级编码器的输入,该优先级编码器可以输出针对待定的加载指令的最低lsid。可以比较最低待定的加载指令的lsid和最低待定的存储指令的lsid。如果最低待定lsid是存储指令,则方法1100可以在过程框1130处继续。如果最低待定的lsid是加载指令,则方法1100可以在过程框1140处继续。

在过程框1130处,可以在就绪时发布具有最低lsid的存储指令。指令块内的存储指令相对于彼此以程序次序被发布,以便满足写入后写入的依赖性。当满足存储指令的依赖性(诸如存储指令的操作数就绪,并且硬件资源可用于执行存储指令)时,可以发布存储指令。在发布具有最低lsid的存储指令之后,方法1100可以在过程框1160处继续。

在过程框1140处,可以发布就绪的且具有比待定的存储指令的最低lsid更小的lsid的任何加载指令。例如,可以将就绪的加载指令的lsid与最低待定的存储指令的lsid进行比较。当满足加载指令的依赖性时(诸如加载指令的操作数就绪,并且硬件资源可用于执行加载指令),可以将具有比最低待定的存储指令的lsid更小的lsid的任何加载指令发布。因此,具有比最低待定存储指令的lsid更小的lsid的加载指令可以相对于彼此脱离程序次序被发布。作为具体示例,可以在发布具有小于5的lsid的指令之后且在发布具有lsid=c的存储指令之前,以任何次序发布具有5和b之间的lsid的来自图7的框710的加载指令。

附加地,如果没有待定的存储指令,则可以在待定的加载指令就绪时以任何次序发布待定的加载指令。作为具体示例,在发布lsid小于2的指令之后,可以以任何次序发布具有2到3之间的lsid的来自图7的框712的加载指令。

在过程框1150处,可以确定是否存在具有小于待定的存储指令的最低lsid的lsid的附加的待定的加载指令。如果存在具有小于待定的存储指令的最低lsid的lsid的附加的待定的加载指令,则方法1100可以在过程框1140处继续。然而,如果没有更多的具有小于待定的存储指令的最低lsid的lsid的附加待定的加载指令,则方法1100可以在过程框1160处继续。

在过程框1160处,可以确定是否存在更多要发布的加载指令或存储指令。例如,可以将待定的加载位掩码和待定的存储位掩码与零值进行比较(诸如通过执行或功能)。如果两个位掩码都为零,则针对该指令块不再有更多的加载指令或存储指令要发布,并且方法1100可以在过程框1170处继续。如果有更多的加载指令或存储指令要发布,则方法1100可以在过程框1110处继续。

在过程框1170处,可以指示完成了针对指令块的所有加载指令和存储指令,诸如通过声明完成信号。完成信号可以被用来确定指令块是否可以被提交以及是否可以获取下一指令块。当提交指令块时,指令块完成。在备选的实施例中,当完成所有的存储指令时,可以声明完成信号。

图12是图示在基于块的处理器核上执行指令块的示例方法1200的流程图。指令块可以包括加载、存储和/或非加载-存储指令。加载指令和存储指令中的每个可以包括加载-存储标识符(lsid),其指示加载指令和存储指令的相对程序序列。指令块内的每个加载指令和存储指令可以具有唯一的lsid,或者一些加载指令和存储指令可以共享lsid。例如,在互斥路径中的断言的加载指令和存储指令可以共享lsid。取决于在指令块的运行时所执行的断言计算的值,有条件地执行断言的指令。

在过程框1210处,可以解码指令块的存储掩码。存储掩码可以指示指令块内的存储指令的相对程序次序。作为一个示例,存储掩码可以是位掩码,其中位掩码的每个位对应于加载指令和存储指令的lsid,并且存储掩码的声明的位指示存储指令的lsid。存储掩码的未声明的位可以指示加载指令的lsid和/或不存在具有该lsid的加载指令或存储指令。例如,存储掩码可以由编译器生成并被编码在指令块的指令头部中。作为另一示例,存储掩码可以被编码在与包含指令块的程序相关联的数据结构中。作为又一示例,存储掩码可以被编码在被用于标识存储指令的指令块的指令中。

在过程框1220处,经解码的存储掩码可以被用来仅在已经发布在加载指令之前的所有存储指令之后才发布加载指令。可以以与指令块的其他存储指令相对的程序次序发布每个存储指令。可以基于指令的lsid来确定相对程序次序。在一个实施例中,可以以由加载指令和存储指令的lsid指定的相对程序次序来发布指令块的所有加载指令和存储指令。在另一实施例中,可以乱序地发布存储指令之间的加载指令。例如,可以以基于加载指令的操作数何时就绪的数据流次序来发布加载指令。可以以数据流次序来发布非加载-存储指令。当非加载-存储指令与待定的加载指令和存储指令没有依赖性关系时,可以与待定的加载指令和存储指令无关地发布非加载-存储指令。

在过程框1230处,可以以所发布的次序来执行所发布的加载指令和存储指令。例如,发布加载指令或存储指令可以包括将加载指令或存储指令的操作数和控制信号路由发送到执行逻辑。执行逻辑可以包括多个执行单元,诸如算术逻辑单元(alu)、浮点单元(fpu)和/或加载-存储单元。当发布加载指令或存储指令时,执行逻辑可以执行加载指令或存储指令的功能。对于存储指令,执行逻辑可以生成对存储器层级的存储请求。对于加载指令,执行逻辑可以生成对存储器层级的加载请求。在从存储器层级正在返回加载响应数据时,加载请求可以阻止或停滞加载-存储执行逻辑。当加载-存储执行单元忙时,可以延迟在程序次序中在后的加载指令和存储指令,直到加载-存储执行单元完成为止。

在可选的过程框1240处,可以接收无效请求。可以基于接收无效请求来调整发布加载指令和存储指令的次序。无效请求可以指示将不被执行的一个或多个加载指令或存储指令,诸如当指令被断言且断言值不被匹配时。例如,无效请求可以通过iid或lsid指定未执行的指令。批量无效请求可以包括位掩码,该位掩码可以被用来使多个未执行的指令无效。无效的指令将不会被发布,并且因此可以从要发布的待定的指令的列表中移除无效的指令。例如,可以通过跳过无效的指令来调整发布加载指令和存储指令的次序。

图13是图示在基于块的处理器核上执行指令块的示例方法1300的流程图。指令块可以包括加载、存储和/或非加载-存储指令。

在过程框1310处,可以解码指令块的指令以确定指令是加载指令还是存储指令,并且确定指定指令块内的加载指令或存储指令的相对程序次序的加载-存储标识符(lsid)。例如,编译器可以检测程序内的存储器操作的序列,并且编译器可以使用每个指令的lsid字段将所检测到的序列编码到加载指令和存储指令中。因此,lsid字段可以专用于存储器指令(例如,加载指令和存储指令),并且可以对非加载-存储指令被省略。作为另一示例,编译器可以以程序次序发出加载指令和存储指令,以便可以从加载指令和存储指令的所发出的次序来估算每个加载指令和存储指令的lsid。作为另一示例,编译器可以在指令块的指令头部中生成字段。具体地,该字段可以将每个加载指令和存储指令的lsid映射到对应的加载指令或存储指令的iid。

在过程框1320处,可以调度非加载-存储指令来以与指令块的程序次序不同的数据流次序来执行。例如,可以基于非加载-存储指令的操作数何时就绪来调度非加载-存储指令。

在过程框1330处,可以以基于指令的经解码的lsid的次序来调度指令块的每个加载指令和存储指令。作为一个示例,执行指令块的加载指令和存储指令的次序可以遵循加载指令和存储指令的经解码的lsid的顺序的次序。作为另一示例,执行指令块的加载指令和存储指令的次序可以基于指令块的存储掩码。存储掩码可以标识在指令块的程序次序内的存储指令的位置。在一个示例中,可以仅在加载指令之前的所有存储指令已经被执行之后才调度加载指令来执行。加载指令可以相对于其他加载指令乱序地执行。在另一示例中,可以以由lsid和存储掩码指定的次序来调度存储指令来执行。无效指令可以被用来考虑在执行块的给定运行期间未被执行的预测指令。例如,可以基于正在被执行的无效指令来调整指令的发布的次序。

在过程框1340处,可以以经调度的次序来执行指令块的指令。因此,指令块中的一些指令可以脱离程序次序被执行,并且存储器操作可以以保持顺序存储器语义的次序而被执行。通过基于指令的操作数何时就绪而脱离程序次序地执行一些指令,由于处理器内更少的停滞而可以提高处理器的性能。通过在调度加载指令和存储指令时使用存储器操作的程序次序信息,可以在不使用加载-存储队列的情况下保持顺序存储器语义。因此,可以潜在地使处理器更小(例如,更便宜)并且在能力方面更高效。

xi.示例计算环境

图14图示了合适的计算环境1400的一般化示例,其中可以实施所描述的实施例、技术方法和技术。

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

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

存储装置1440可以是可移除的或不可移除的,并且包括磁盘、磁带或盒式磁带、cd-rom、cd-rw、dvd或可以被用来存储信息且可以在计算环境1400内被访问的任何其他介质。存储装置1440存储可以被用来实施本文所描述的技术的用于软件1480的指令、插件数据和消息。

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

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

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

计算机可读介质是可以在计算环境1400内被访问的任何可用介质。通过示例而非限制,在计算环境1400的情况下,计算机可读介质包括存储器1420和/或存储装置1440。如应当容易理解的,术语计算机可读存储介质包括用于数据存储的介质(诸如存储器1420和存储装置1440),而不包括诸如经调制的数据信号的传输介质。

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

根据上述实施例,本文讨论了所公开主题内容的其他实施例。

在一个实施例中,处理器包括解码逻辑和发布逻辑。解码逻辑被配置为解码指令块的存储掩码。指令块包括加载指令和存储指令,并且每个加载指令和存储指令包括指定指令块内指令的相对程序次序的标识符。存储掩码标识指令块的程序次序内的存储指令的位置。作为一个示例,存储掩码可以被包含在指令块的指令头部中,并且解码逻辑可以包括被配置为解码指令头部的头部解码逻辑。发布逻辑被配置为脱离程序次序地发布指令块的至少一个指令,并且仅在已经发布加载指令之前的所有存储指令之后,使用经解码的存储掩码发布加载指令。

发布逻辑还可以被配置为相对于指令块的其他存储指令以程序次序发布每个存储指令。发布逻辑还可以被配置为:以由加载指令和存储指令的标识符指定的顺序的程序次序来发布指令块的所有加载指令和存储指令。发布逻辑还可以被配置为接收指示将不执行加载指令或存储指令的无效请求,并且可以基于接收无效请求来调整发布指令块的指令的次序。发布逻辑还可以被配置为接收指示将不执行多个加载指令或存储指令的批量无效请求,并且可以基于接收批量无效请求来调整发布指令块的指令的次序。

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

在一个实施例中,一种方法可以被用于执行计算机可执行指令。该方法包括解码指令块的指令以确定该指令是加载指令还是存储指令,并且确定指定指令块内的加载指令或存储指令的相对程序次序的加载-存储标识符。作为一个示例,相应的加载-存储标识符可以对应于指令块的不多于一个指令。作为另一示例,相应的加载-存储标识符可以对应于指令块的多个指令(例如,断言的指令)。方法包括调度指令块的指令,该指令不是以与指令块的程序次序不同的数据流次序来执行的加载指令或存储指令。方法包括以基于指令的经解码的加载-存储标识符的次序来调度指令块的每个加载指令和存储指令。方法包括以经调度的次序来执行指令块的指令。

执行指令块的加载指令和存储指令的次序可以遵循加载指令和存储指令的经解码的加载-存储标识符的顺序的次序。可以通过使一个或多个未被执行的断言的加载指令或存储指令无效来维持加载指令和存储指令的经解码的加载-存储标识符的顺序的次序。

方法可以进一步包括使用指令块的存储掩码来调度加载指令和存储指令,使得仅在加载指令之前的所有存储指令已经被执行之后才调度加载指令。存储掩码可以标识在指令块的程序次序内的存储指令的位置。可以从指令块的块头部解码存储掩码。方法还可以包括从用于脱离程序次序的至少一个加载指令的存储器层级读取数据。方法还可以包括以由其他存储指令的加载-存储标识符指示的相对次序将指令块的每个存储指令的数据写入到存储器层级。解码指令块的指令可以包括将指令的指令标识符映射到指令的加载-存储标识符。

一个或多个计算机可读存储介质可以存储计算机可读指令,当由计算机执行该计算机可读指令时,使计算机执行该方法。

在一个实施例中,基于块的处理器包括获取逻辑、指令解码器和调度器。获取逻辑被配置为获取包括多个指令(包括加载指令和存储指令)的指令块。指令解码器被配置为确定所获取的指令块的每个指令的类型,并且当指令的类型是加载指令或存储指令时,确定指定指令块的存储器操作的序列内的加载指令或存储指令的相对次序的加载-存储序列号。调度器被配置为发布不是加载指令或存储指令的经解码的指令以用于以数据流次序执行,并且发布经解码的加载指令和存储指令以用于以基于每个加载指令和存储指令的经解码的加载-存储序列号的次序执行。因此,加载指令和存储指令的加载-存储序列号可以被用来确定加载指令和存储指令的执行次序,而不是加载指令和存储指令在指令块内出现的次序。作为在加载指令和存储指令内编码加载-存储序列号的备选的示例,指令块的指令头部可以包括加载掩码和存储掩码,以将对应的指令标识为指令块的加载和存储。调度器可以被配置为以基于经解码的加载掩码和存储掩码的次序发布加载指令和存储指令以用于执行。作为在加载指令和存储指令内编码加载-存储序列号的另一备选示例,可以基于加载指令和存储指令在指令块内发生的次序将加载-存储序列号分配给加载指令和存储指令。

基于块的处理器还可以包括头部解码逻辑,其被配置为将所获取的指令块的指令块头部解码。指令块头部可以包括存储掩码,存储掩码标识指令块的存储器操作的序列内的存储指令的位置。经解码的存储掩码可以由调度器使用来确定何时发布经解码的加载指令和存储指令以用于执行。

在发布经解码的加载指令之前的所有经解码的存储指令以用于执行之后,可以发布每个经解码的加载指令以用于执行。可以以由加载-存储序列号指示的存储器操作的顺序的次序来发布每个经解码的加载指令和存储指令。指令块的指令可以包括用于使一个或多个未被执行的断言的加载指令或存储指令无效的无效指令,并且调度器可以被配置为基于无效指令调整发布经解码的加载指令和存储指令的次序。

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

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