用于块ISA处理器的并行指令调度器的制作方法

文档序号:16366705发布日期:2018-12-22 08:28阅读:251来源:国知局
用于块ISA处理器的并行指令调度器的制作方法

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



技术实现要素:

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

基于块的处理器架构的软处理器实现可以改进设计生产力。例如,以适合的描述语言(例如,c、systemc、systemverilog或verilog)编写的基于块的软件处理器的描述可以经历逻辑合成以生成被映射到fpga的门极网表。针对fpga生成用于对fpga编程的比特流。软件到硬件中的昂贵的初始端口代替地变成针对软处理器的简单交叉编译,并且大多数设计轮是快速重新编译。应用瓶颈然后可以被卸载到被暴露为新指令、功能单元、自主加速器、存储器或互连件的定制硬件。

所公开的技术的某些示例允许在不降低复杂性和开销的情况下配置高指令级并行(ilp)、乱序(ooo)超标量的软处理器。在一些示例中,为了面积和能量高效的高ilp执行而提供显式数据图形执行(edge)指令集架构。edge架构及其编译器共同解决了大部分的寄存器重命名、cam和复杂性,从而实现用于比按序标量risc仅仅多几百个的fpga查找表(“lut”)的乱序处理器。

该所公开的技术介绍了edgeisa,并且探索了与按序risc相比edge微架构如何。公开了用于构建fpga中的小型快速数据流指令调度器的方法和装置。

附图说明

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

图2图示了如可以在所公开的技术的某些示例中使用的用于实现基于块的处理器的示例微架构。

图3是概述如可以在所公开的技术的一些示例中使用的示例fpga微架构的块图。

图4图示了如可以在所公开的技术的某些示例中使用的可重新配置逻辑块中的示例可重新配置逻辑。

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

图6图示了如可以在所公开的技术的某些示例中使用的示例源代码部分和对应的指令块。

图7图示了根据所公开的技术的可以用于基于块的处理器的某些示例的指令格式的示例。

图8是图示了如可以在所公开的技术的某些示例中使用的、基于块的处理器中的处理器核的执行状态的进展的示例的流程图。

图9是图示了如可以在所公开的技术的某些示例中使用的、并行指令调度器的示例实现的块图。

图10是如可以在所公开的技术的某些示例中使用的、并行指令调度器的fpga实现的平面布置图。

图11是图示了如可以在所公开的技术的某些示例中使用的、包括基于块的处理器和存储器的示例配置的块图。

图12是图示了如可以在所公开的技术的某些示例中使用的、使用并行指令调度器发出指令的示例方法的流程图。

图13是概述如可以在所公开的技术的某些示例中执行的、利用并行指令调度器发出并且执行指令的示例方法的流程图。

图14是概述如可以在所公开的技术的某些示例中执行的、产生用于利用并行指令调度器实现的基于块的处理器的配置比特流的示例方法的流程图。

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

具体实施方式

i.总体考虑

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

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

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

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

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

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

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

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

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

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

所公开的技术可以通过应用包括高指令集并行性(ilp)、乱序(out-of-order,ooo)、超标量执行的技术来实现性能增强,同时避免处理器硬件和相关联的软件二者中的大量的复杂性和开销。在所公开的技术的一些示例中,基于块的处理器使用针对区域和能量高效的高ilp执行所设计的edgeisa。在一些示例中,edge架构和相关联的编译器的使用解决了大部分的寄存器重命名、cam和复杂性。

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

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

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

iii.示例基于块的处理器

图1是如可以被实现在所公开的技术的一些示例中的基于块的处理器100的块图10。处理器100被配置为根据指令集架构(isa)来执行原子指令块,isa描述了处理器操作的若干方面,包括寄存器模型、由基于块的指令执行的若干定义操作、存储器模型、中断、以及其他架构特征。基于块的处理器包括多个一个或多个处理器核110,其包括处理器核111。基于块的处理器可以被实现为定制或专用集成电路(例如,包括片上系统(soc)集成电路)、被实现为现场可编程门阵列(fpga)或其他可重新配置逻辑、或者被实现为由物理通用处理器托管的虚拟机。

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

在图1的示例中,处理器的存储器接口140包括被用于连接到存储器145(例如,被定位在除了处理器100之外的另一集成电路上的存储器(例如,存储器可以是静态ram(sram)或动态ram(dram)、或者嵌入在与处理器相同的集成电路上的存储器(例如,嵌入式sram或dram(edram))))的接口逻辑。存储器接口140和/或主存储器可以包括高速缓存(例如,n路或关联高速缓存)以改进存储器存取性能。在一些示例中,高速缓存使用静态ram(sram)被实现,并且主存储器145使用动态ram(dram)被实现。在一些示例中,存储器接口140被包括在与处理器100的其他部件相同的集成电路上。在一些示例中,存储器接口140包括允许在不使用(一个或多个)寄存器文件和/或处理器100的情况下传送存储器中的数据块的直接存储器访问(dma)控制器。在一些示例中,存储器接口140管理虚拟存储器的分配,从而扩展可用的主存储器145。在一些示例中,用于旁路高速缓存结构、或者用于当执行存储器同步操作(例如,处理争用问题或者在多个不同线程、进程或处理器之间共享的存储器)时确保高速缓存相干性的支持,由存储器接口140和/或相应的高速缓存结构提供。

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

基于块的处理器100还可以包括控制单元160。控制单元160监督处理器100的操作。能够由控制单元160执行的操作可以包括对核的分配和去分配以用于执行指令处理;对在核、寄存器文件、存储器接口140和/或i/o接口150中的任何项之间的输入数据和输出数据的控制;对执行流的修改;以及验证控制流中的分支指令、指令头和其他改变的(一个或多个)目标位置。控制单元160可以根据表示针对指令块的退出点和控制流概率的控制流和元数据信息来产生并且控制处理器。

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

控制单元160包括用于控制处理器核110的指令流水线的多个调度器165-168。在其他示例中,调度器可以被布置为使得它们关于每个单独处理器核被包含。如在此所使用的,调度器块分配涉及引导指令块的操作,包括发起指令块映射、取指、译码、执行、提交、中止、空闲以及刷新指令块。另外,指令调度涉及调度指令块内的指令的发出和执行。例如,基于指示针对存储器存取指令的相对顺序的指令依赖性和数据,控制单元160可以确定指令块中的哪个(哪些)指令准备好发出,并且启动对指令的发出和执行。处理器核110在指令块映射期间被指派到指令块。所叙述的指令操作的阶段出于说明性目的,并且在所公开的技术的一些示例中,某些操作可以被组合、被省略、被分开为多个操作、或者被添加附加操作。调度器165-168中的每个调度器调度指令的流,包括:对用于执行指令处理的核的分配和解除分配;对在核、寄存器文件、存储器接口140和/或i/o接口150中的任何项之间的输入数据和输出数据的控制。

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

iv.示例基于块的处理器微架构

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

如图2所示,处理器核包括耦合到指令译码器220的指令高速缓存210。指令高速缓存210被配置为从存储器接收基于块的处理器指令。在一些fpga实现中,指令高速缓存可以由双读端口、双写端口、18或36kb(千比特)、32位宽块ram来实现。在一些示例中,物理块ram被配置为用作两个或更多个更小块的ram。

处理器核还包括指令窗口230,其包括指令调度器235、译码的指令存储236和多个操作数缓冲器239。在fpga实现中,这些指令窗口部件230中的每个可以被实现,包括使用lutram(例如,具有被配置为查找表的sram)或bram(块ram)。指令调度器235可以将针对指令的指令标识符(指令id或iid)作为控制信号发送到译码的指令存储236和操作数缓冲器239。如下面进一步讨论的,指令块中的每个指令具有唯一地识别指令块内的指令的相关联的指令标识符。在一些示例中,用于发送执行指令的结果的指令目标被编码在指令中。以这种方式,代替监视寄存器依赖性,指令之间的依赖性可以使用指令标识符来跟踪。在一些示例中,处理器核可以包括两个或更多个指令窗口。在一些示例中,处理器核可以包括具有多个块上下文的一个指令窗口。

如下面将进一步讨论的,微架构200包括存储针对基于块的处理器架构中定义的寄存器的数据的寄存器文件290,并且可以具有一个或多个读端口和一个或多个写端口。因为指令块在事务基础上执行,所以由指令块的实例做出的对寄存器值的改变对相同实例不可见;寄存器写将在完成了对指令块的执行后被提交。

译码的指令存储236存储用于控制处理器流水线中的硬件部件的操作的译码的信号。例如,32位指令可以被译码成128位的译码的指令数据。译码的指令数据由译码器220在指令被取指之后被生成。操作数缓冲器239存储操作数(例如,从寄存器文件接收到的寄存器值,从存储器接收到的数据,编码于指令内的立即操作数,由早前发出的指令计算的操作数,或者其他操作数的值)直到它们相应的译码的指令准备好执行。用于流水线的执行阶段的指令操作数和断言相应地从操作数缓冲器239、而不是(至少直接地)从寄存器文件290读取。指令窗口230可以包括用于指向指令的断言的缓冲器,包括用于组合通过多个指令发送到指令的断言的线或逻辑(wired-orlogic)。

在一些示例中,除了寄存器读操作的所有指令操作数从操作数缓冲器239而不是从寄存器文件被读取。在一些示例中,这些值被维持直到指令发出并且操作数被传递到执行流水线。在一些fpga示例中,译码的指令存储236和操作数缓冲器239利用多个lutram被实现。

指令调度器235维持每个译码的指令的依赖性(例如,指令的断言和数据操作数)的就绪状态的记录。当全部指令的依赖性(如果有的话)都被满足时,指令唤醒并且准备好发出。在一些示例中,最低编号的就绪指令id在每个流水线时钟周期被选择并且其译码的指令数据和输入操作数被读取。在图示的示例中,除了数据复用和功能单元控制信号,译码的指令数据可以编码至多两个就绪事件。指令调度器235接受这些事件和/或从其他源(被选择用于输入到分别具有多路复用器237和238的输入t0和t1上的调度器)接收事件,并且更新窗口中的其他指令的就绪状态。因此,数据流执行继续,以指令块的就绪零输入指令开始,接着是这些指令瞄准的指令,等等。一些指令准备好在它们不具有依赖性时立即发出(例如,移动立即指令)。取决于isa、控制结构、以及其他因素,在一些示例中,译码的指令存储236大约为100位宽并且包括关于指令依赖性的信息,包括指示哪个(哪些)目标指令的活动就绪状态由于发出指令而将被设置的数据。

如本文中所使用的,就绪状态是指针对给定指令指示其操作数(如果有的话)是否就绪以及其操作数(如果有的话)中的哪些就绪、以及指令本身现在是否准备好发出的处理器状态。在一些示例中,就绪状态包括译码的就绪状态和活动就绪状态。译码的就绪状态数据通过译码(一个或多个)指令来初始化。活动就绪状态表示在指令块的当前实例的执行期间、到目前为止已经评估的指令的输入操作数的集合。相应指令的活动就绪状态通过执行瞄准例如相应指令的左操作数、右操作数和/或断言操作数的(一个或多个)指令来设置。

指令窗口230和指令调度器235的属性(诸如面积、时钟周期和功能)可以对edge核的实现的性能和edge多处理器的吞吐量具有重大影响。在一些示例中,微架构的前端(if、dc)部分可以与微架构的后端部分(is、ex、ls)解耦运行。在一些fpga实现中,指令窗口230被配置为每个时钟将两个指令取指和译码到指令窗口中。

指令调度器235具有各种各样的功能和要求。其可以是高度并发的。在每个时钟周期,指令译码器220将针对一个或多个指令的译码的就绪状态和译码的指令数据写入到指令窗口230中。在每个时钟周期,指令调度器235选择接下来的(一个或多个)指令来发出,并且作为响应,后端发送就绪事件,例如,瞄准特定指令的输入槽(例如,断言槽、右操作数(op0)或左操作数(op1))的目标就绪事件、或者瞄准在广播id上等待的所有指令的广播就绪事件。这些事件使得每指令的活动就绪状态被设置为,其与译码的就绪状态一起可以用于信号通知对应指令准备好发出。指令调度器235有时接受针对尚未被译码的目标指令的事件,并且调度器还可以抑制发出的就绪指令的重新发出。

指令窗口230中的控制电路(例如,使用译码的指令存储236生成的信号)用于生成控制信号,以调节核操作(包括例如对数据路径和多路复用器选择信号的控制)并且调度核内的指令的流。这可以包括生成并且使用存储器存取指令编码,对用于执行指令处理的核的分配和解除分配,在核110、寄存器文件、存储器接口140和/或i/o接口150中的任何一项之间的输入数据和输出数据的控制。

在一些示例中,指令调度器235被实现为耦合到其他指令窗口逻辑的有限状态机。在一些示例中,指令调度器被映射到fpga中的ram的一个或多个库,并且可以利用块ram、lutram或其他可重新配置ram来实现。如相关领域的普通技术人员将显而易见的,以集成电路、可编程逻辑或其他适合的逻辑实现的其他电路结构可以用于实现针对指令调度器235的硬件。在所公开的技术的一些示例中,前端流水线阶段if和dc可以与后端流水线阶段(is、ex、ls)解耦运行。

在图2的示例中,操作数缓冲器239经由一个或多个开关(例如,多路复用器241和242)将数据操作数(为了方便,其可以被指定为左操作数(lop)和右操作数(rop))发送到执行状态流水线寄存器245的集合。这些操作数还可以分别被称为op1和op0。第一路由器240用于将数据从操作数缓冲器239发送到功能单元250中的一个或多个,功能单元250可以包括但不限于整数alu(算术逻辑单元)(例如,整数alu255)、浮点单元(例如,浮点alu256)、移位/旋转逻辑(例如,桶式移位器257)、或者其他适合的执行单元,其可以包括图形功能、物理功能以及其他数学运算。在一些示例中,可编程执行单元258可以被重新配置为实现多个不同的任意功能(例如,先验或在运行时)。

来自功能单元250的数据可以随后通过第二路由器(未示出)被路由到加载/存储流水线寄存器260的集合、加载/存储队列270(例如,用于执行存储器加载和存储器存储操作),或者被反馈回到执行流水线寄存器、由此旁路操作数缓冲器239。加载/存储队列270被耦合到对用于存储器操作的数据进行高速缓存的数据高速缓存275。数据高速缓存275和加载/存储流水线寄存器260的输出可以被发送到第三路由器280,其转而根据正在流水线阶段中执行的指令而将数据发送到寄存器文件290、操作数缓冲器239和/或执行流水线寄存器245。

当指令块的执行完成时,指令块被指定为“已提交”,并且来自控制输出的信号可以转而由基于块的处理器100内的其他核和/或由控制单元160使用,以启动对其他指令块的调度、取指和执行。

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

对相关领域的普通技术人员将显而易见的是,可以通过设计和分配处理器核110的指令窗口和控制单元内的资源,而在处理器性能上做出权衡。面积、时钟周期、功能和限制基本上确定单独的核110的实现的性能和基于块的处理器100的吞吐量。

对受执行的指令影响的处理器(诸如寄存器文件290和存储器)的可见架构状态的更新可以被本地缓冲在核内,直到指令被提交。控制电路可以确定何时指令准备好被提交,对提交逻辑排序,并且发出提交信号。例如,针对指令块的提交阶段可以在所有寄存器写入被缓冲、所有对存储器的写入(包括无条件和有条件的存储)被缓冲以及分支目标被计算时开始。指令块可以在对可见架构状态的更新完成时被提交。例如,指令块可以在寄存器写被写入作为寄存器文件、存储被发送到加载/存储单元或存储器控制器以及提交信号被生成时而被提交。控制电路还至少部分地控制功能单元到指令窗口的分配。

因为指令块作为原子事务单元被提交(或中止),所以应当指出的是,某些操作的结果对指令块内的指令不可用。这与提供在单独的、逐个指令的基础上可见的结果的risc和cisc架构形成对比。因此,公开了用于在基于块的处理器环境中支持存储器同步和其他存储器操作的附加技术。

在一些示例中,基于块的执行可以是非断言的、或者被断言为真或假。断言的指令直到其被另一指令的断言结果瞄准、并且该结果与断言条件匹配时才变成就绪。如果指令的断言不匹配,则指令决不发出。

在一些示例中,在分支到新指令块后,(存储于指令调度器235中的)所有指令窗口就绪状态被闪速清除(块重置)。然而,当块分支回到其本身(块刷新)时,仅仅活动就绪状态被清除;译码的就绪状态被保留,以使得不必重新取指和译码块的指令。因此,代替执行块重置,刷新可以用于节省循环中的时间和能量。

由于一些软件关键路径包括相关指令的单个链(例如,指令a瞄准指令b,指令b转而瞄准指令c),所以通常期望的是,数据流调度器不添加用于连续的背靠背指令唤醒的流水线气泡(bubble)。在这样的情况下,is-阶段的就绪-发出-目标-就绪流水线的再次发生应当在一个周期中完成,假设这不会严重影响时钟频率。

诸如add的指令具有一个周期的延时。在ex阶段结果转发的情况下,调度器可以在is阶段中、甚至在指令完成之前唤醒它们目标的指令。其他指令结果可以等待alu比较、采用多个周期、或者具有未知的延时。这些指令等待直到稍后唤醒它们的目标。

最终,调度器设计可以在一定范围的edgeisa上可扩展。在一些示例中,每个流水线周期可以接受从一个至四个的译码的指令和从两个至四个的目标就绪事件,并且在每个周期发出一个至两个指令。

多种不同的技术可以用于实现指令调度器235。例如,调度器235可以被实现为并行调度器,其中指令的就绪状态被显式地表示在fpgad型触发器(ff)中,并且其中每一个指令的就绪状态在每个周期都被重新评估。在其他示例中,指令调度器235可以被实现为将就绪状态保持在lutram中的更紧凑的增量调度器,并且指令调度器235在每个周期更新大约两个至四个目标指令的就绪状态。

寄存器文件290可以包括用于将数据存储在寄存器文件中的两个或更多个写端口,以及具有用于从寄存器文件内的单独的寄存器读取数据的多个读端口。在一些示例中,单个指令窗口(例如,指令窗口230)可以一次访问寄存器文件的仅一个端口,而在其他示例中,指令窗口230可以访问一个读端口和一个写端口、或者可以同时访问两个或更多个读端口和/或写端口。在一些示例中,微架构被配置为使得并非寄存器290的所有读端口都可以使用旁路机构。对于图2中所示的示例微架构200,寄存器文件可以将旁路路径上的寄存器数据发送到针对操作数op0、而不是操作数op1的多路复用器242中的一个。因此,对于一个周期内的多次寄存器读取,仅仅一个操作数可以使用旁路,而另一寄存器读取结果被发送到操作数缓冲器239,其将额外时钟周期插入指令流水线中。

在一些示例中,寄存器文件290可以包括64个寄存器,寄存器中的每个寄存器保持32位的数据的字。(为便于解释,除非另外指定,否则本申请将把32位的数据称为字。根据所公开的技术的适合的处理器可以利用8位、16位、64位、128位或其他数量的位的字进行操作)在一些示例中,寄存器文件290内的寄存器中的一些寄存器可以被分配至特殊目的。例如,寄存器中的一些寄存器可以被专用作系统寄存器,其示例包括以下的寄存器:存储恒定值(例如,所有零字)、(一个或多个)程序计数器(pc)(其指示正被执行的程序线程的当前地址)、物理核数目、逻辑核数目、核分配拓扑、核控制标志、执行标志、处理器拓扑或者其他适合的专用目的。在一些示例中,寄存器文件290被实现为触发器阵列,而在其他示例中,寄存器文件可以使用锁存器、sram或者其他形式的存储器存储装置而被实现。针对给定处理器的isa规格指定寄存器文件290内的寄存器如何被定义并且被使用。

v.示例现场可编码门阵列架构

图3是描绘被配置为实现所公开的技术的某些示例的示例现场可编程门阵列(fpga)架构的块图300。例如,以上关于图1讨论的基于块的处理器100(包括使用图2中描绘的微架构200的那些示例)可以被映射到图3的fpga架构。

fpga包括以阵列布置的可重新配置逻辑块的阵列。例如,fpga包括:第一行逻辑块,其包括逻辑块310、311和319;以及第二行逻辑块,其包括逻辑块320、321和329。逻辑块中的每个包括可以被重新配置为实现任意逻辑功能的逻辑,以及还可以包括诸如锁存器、触发器和存储器的顺序逻辑元件的逻辑。逻辑块使用包括多个互连开关(其也可以是可编程的)的路由结构而被彼此互连。例如,存在被定位在第一行可重新配置逻辑块与第二行可重新配置逻辑块之间的第一行开关块330、331、332等等。开关可以被配置以便改变在可重新配置逻辑块之间运送信号的有线连接。例如,指令调度器、功能单元、流水线缓冲器以及操作数缓冲器可以使用图3的开关块而被映射到逻辑块。

fpga还包括多个更复杂的部件。例如,逻辑块包括多个块ram,例如块ram340和块ram349。块ram通常包含更大数量的存储器位,例如,通过将地址应用到存储器并且从一个或多个读端口读取来访问的几千个存储器位。在一些示例中,块ram可以包括两个或更多个写端口和两个或更多个读端口。在其他示例中,块ram可以仅仅具有单个读端口和/或单个写端口。在块ram通常通过应用地址并且读取对应数据来访问的同时,在一些示例中,块ram可以被配置有附加电路,其允许实现包括移位寄存器和先进先出(fifo)缓冲器的更复杂的功能。

图示的fpga还包括多个硬宏块,其包括硬宏块350和硬宏块359。这些宏块可以包括更复杂的功能,诸如处理器功能、数字信号处理功能、加速器或认为是期望的其他功能。fpga还由可以被耦合到逻辑块、块ram和/或硬宏块的i/o环360环绕,以便向远离fpga的部件接收和发送信号。在一些示例中,i/o信号是全轨电压信号,而其他示例使用差分信号。在一些示例中,i/o端口可以被多路复用(例如,时分多路复用)以便支持比在fpga上可用的管脚的数量更多的信号的输入和输出。

尽管fpga的许多示例通常是通过使用电可擦存储器而可重新配置任意次数的,但是在其他示例中,可以使用一次性可编程逻辑元件。例如,逻辑块和开关可以利用熔丝、反熔丝的使用而被编程,或者利用rom掩码而被编程,以不容易可逆的方式一次性编程逻辑功能。

在可重新配置情况中,fpga通常具有根据被称为比特流或配置比特流的文件来接收数据的配置端口。比特流被读取到设备中并且用于编程和配置逻辑块、开关、块ram和/或硬宏。当期望新设计时,配置可以被擦除并且新的设计被配置到设备中。在一些示例中,fpga可以被部分地重新配置以便节省编程时间。例如,逻辑块、开关或块ram的子集可以在现场被动态地重新配置而无需对整个设备重新编程。

针对被映射到可重新配置逻辑上的基于块的处理器的实现的一个挑战是确定可以使用定制或现成设备的可用块高效实现的微架构结构。然而,使用所公开的技术,可以实现更高的性能和/或更高效的结构。另外,应当容易理解,尽管fpga的一些示例是独立集成电路,但是在其他示例中,fpga可以被不同地封装,例如在多芯片模块(mcm)中、或者在与定制或基础片上系统(soc)相同的电路管芯上被封装。

图4是图示可以被配置为形成示例fpga集成电路的逻辑结构的部分的四个可重新配置逻辑块410、411、412和413的块图400。示出的可重新配置逻辑块内部的部件是相同的或均质的,但是应当容易理解,在其他示例中,多于一种类型的可重新配置逻辑块可以存在于单个fpga上。

第一可重新配置逻辑块410包括被耦合到进位逻辑430、多个多路复用器440和445以及存储元件(这里为d触发器)450的六输入查找表(lut)420。lut420可以使用小的存储器(例如,如所示的具有六个地址位和两个输出位的存储器)来实现。因此,任何六输入布尔函数可以通过使用单个lut来实现。在一些示例中,lut的输出可以被组合,或者可重新配置逻辑块可以具有能够被连接在一起以便执行更复杂的逻辑功能的多个lut。在一些示例中,除了lut,可以提供常见逻辑功能。例如,进位逻辑430可以被配置为执行针对加法器的进位传播逻辑。多路复用器用于选择来自其他部件的各种输出。例如,多路复用器440可以用于选择lut420或进位逻辑430的输出,而多路复用器445可以用于选择lut420或多路复用器440的另一输出。在一些示例中,多路复用器用于选择状态元件(例如触发器450)的顺序输出或者查找表的组合输出。对本领域的普通技术人员而言应当容易理解,不同的逻辑功能、lut大小和顺序要素可以被采用于可重新配置逻辑元件中。因此,用于将基于块的处理器映射到这样的可重新配置逻辑的技术可以取决于特定目标fpga架构而变化。可重新配置逻辑块内部的逻辑的配置可以使用fpga的配置端口来编程。在一些示例中,lut不被一次编程,而是可以被配置为用作存储在基于块的处理器中使用的特定数据的小的存储器。

在所公开的技术的一些示例中,逻辑合成工具(逻辑编译器)用于将针对块处理器的规格转换成可以被应用到fpga的配置端口,以将逻辑配置为实现基于块的处理器的配置比特流。在一些示例中,设计者可以使用rpm(关系放置宏)技术来改进面积和互连延迟,并且实现用于在模块组成和大规模复制下的轻松路由和定时关闭的可重复布局。例如,通过包括实例化模块并且将它们拼接到调度器中的结构rtl,针对指令调度器的逻辑可以被锁定到单个lut的集合,从而允许对fpga内的逻辑的紧凑聚类和放置。

vi.示例指令块流

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

指令块头520还可以包括一个或多个执行标志,其指示用于执行指令块的一种或多种操作模式。例如,操作模式可以包括核融合操作、向量模式操作、存储器依赖性预测和/或按序或确定性指令执行。另外,执行标志可以包括抑制指令块的推测执行的块同步标志。

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

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

图示的指令块头520还包括存储掩码,其指示编码于块指令中的加载存储队列标识符中的哪些被指派到存储操作。指令块头还可以包括写入掩码,其标识相关联的指令块将写入的(一个或多个)全局寄存器。在一些示例中,存储掩码由例如指令译码器(例如,译码器220)存储在存储向量寄存器中。在其他示例中,指令块头520不包括存储掩码,而是在指令块被译码时由指令译码器通过分析指令依赖性来动态地生成存储掩码。例如,译码器可以生成针对指令块的加载存储标识符以确定存储掩码并且将存储掩码数据存储在存储向量寄存器中。类似地,在其他示例中,写入掩码未被编码于指令块头中,而是被动态地生成(例如,由指令译码器通过分析指令块中的指令所涉及的寄存器)并且被存储在写入掩码寄存器中。写入掩码可以用于确定指令的执行何时已经完成并且因此启动指令块的提交。相关联的寄存器文件必须在指令块可以完成之前接收对每个条目的写入。在一些示例中,基于块的处理器架构可以不仅包括标量指令,而且还包括单指令多数据(simd)指令,其允许具有单个指令内的更大数目的数据操作数的操作。

可以用于指令521的合适的基于块的指令的示例可以包括用于执行整数和浮点运算、逻辑操作、类型转换、寄存器读和写、存储器加载和存储、分支和跳的执行的指令,以及其他适合的处理器指令。在一些示例中,指令包括用于将处理器配置为根据通过例如推测的一个或多个操作来进行操作的指令。因为指令的依赖性被编码于指令块中(例如,指令块头、瞄准指令的其他指令中、和/或指令本身中),所以指令可以在指令的依赖性被满足时发出并且不按程序顺序执行。

vii.示例块指令目标编码

图6是描绘c语言源代码的两个部分610和615及其相应的指令块620和625的示例的图600,其图示了基于块的指令可以如何显式地编码其目标。在该示例中,前两个read(读取)指令630和631分别瞄准add(加法)指令632的右(t[2r])和左(t[2l])操作数(2r指示瞄准指令号2的右操作数;2l指示指令号2的左操作数)。在所图示的isa中,读指令是从全局寄存器文件(例如,寄存器文件290)读取的唯一指令;然而,任何指令可以瞄准全局寄存器文件。当add指令632接收到这两个寄存器读取的结果时,其将变为就绪并且执行。要指出,本公开内容有时将右操作数称为op0并且将左操作数称为op1。

当tlei(测试小于等于立即(test-less-than-equal-immediate))指令633从add接收其单个输入操作数时,其将变为准备好发出并且执行。测试然后产生在信道一(b[1p])上广播到在用于断言的广播信道上监听的所有指令的断言操作数,其在该示例中是两个断言的分支指令(bro_t634和bro_f635)。接收匹配断言的分支指令将发出,但是利用互补断言编码的其他指令将不发出。

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

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

图7是图示用于指令头710、通用指令720、分支指令730和存储器访问指令740(例如,存储器加载或存储指令)的指令格式的一般化示例的图。指令格式可以用于根据在指定操作模式的指令头中指定的多个执行标志而执行的指令块。指令头或者指令中的每一个根据位数而被标记。例如,指令头710包括四个32位的字并且从其最低有效位(lsb)(位0)被标记直到其最高有效位(msb)(位127)。如所示出的,指令头包括写入掩码字段、多个执行标志字段、指令块大小字段和指令头id位(指令头的最低有效位)。在一些示例中,指令头710包括附加元数据715和/或716,其可以用于控制指令块执行和性能的附加方面。

图7中描绘的执行标志字段占据指令块头710的第6至第13位并且指示用于执行指令块的一种或多种操作模式。例如,操作模式可以包括核融合操作、向量模式操作、分支预测器抑制、存储器依赖性预测器抑制、块同步、块之后的中断、块之前的中断、块下降、和/或按序或确定性的指令执行。块同步标志占据指令块的第9位并且当被设置为1时抑制指令块的推测执行。抑制推测执行例如当诸如存储条件指令的共享存储器操作或其他共享存储器操作由指令块执行、以防止违反isa规格的存储器危害时是高度期望的。

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

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

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

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

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

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

存储器访问指令740格式包括操作码字段、断言字段、广播id字段(bid)、立即字段(imm)和目标字段(t1)。操作码字段、广播字段、断言字段在格式上类似并且如关于通用指令所描述的起作用。例如,对特定指令的执行可以在先前指令的结果(例如,两个操作数的比较)上断言。如果断言为假,则指令将不提交由该特定指令计算的值。如果断言值与所要求的断言不匹配,则指令不发出。立即字段可以被用作针对被发送到加载或存储指令的操作数的偏移。操作数加上(移位的)立即偏移被用作针对加载/存储指令的存储器地址(例如,用于从存储器中读取数据或者将数据存储到存储器中的地址)。对于一些指令,诸如存储条件指令,目标字段t1745用于指定通过执行生成的状态指示符将被存储在哪里。例如,目标字段t1745可以指定寄存器来(例如,基于加载链接地址和链接值)存储指示存储条件指令是否成功执行的状态指示符。后续指令块可以检查状态指示符值并且采取合适的动作(例如,通过冲洗指令块,使指令块重新执行,引发异常,等等)。

ix.示例处理器状态图

图8是图示在指令块被映射、执行和引退时被分配给指令块的多个状态的状态图800。例如,状态中的一个或多个可以在执行指令期间根据一个或多个执行标志来分配。应当容易理解,图8中示出的状态是所公开的技术的一个示例,但是在其他示例中,指令块可以具有附加的或更少的状态、以及具有与状态图8中描绘的状态不同的状态。在状态805处,指令块未被映射。指令块可以驻留在耦合到基于块的处理器的存储器中、被存储在诸如硬盘驱动器或闪存驱动器的计算机可读存储设备上,并且可以在处理器本地或者被定位在远程服务器处并且可使用计算机网络访问。未映射的指令还可以至少部分地驻留在耦合到基于块的处理器的高速缓存存储器中。

在指令块映射状态810处,针对基于块的处理器(例如指令调度器)的控制逻辑可以用于监视基于块的处理器的处理核资源,并且将指令块映射到处理核中的一个或多个。

控制单元可以将指令块中的一个或多个映射到处理器核和/或特定处理器核的指令窗口。在一些示例中,控制单元监视先前已经执行了特定指令块的处理器核并且可以重新使用针对仍然驻留在“预热”的处理器核上的指令块的译码的指令。一旦一个或多个指令块已经被映射到处理器核,指令块就可以前进到取指状态820。

当指令块处于取指状态820(例如,指令取指)时,映射的处理器核从基于块的处理器的存储器系统中取指计算机可读块指令,并且将它们加载到与特定处理器核相关联的存储器中。例如,针对指令块的取指的指令可以被取指并且被存储在处理器核内的指令高速缓存中。指令可以使用核互连而被传送到处理器核。一旦已经取指了指令块的至少一个指令,该指令块就可以进入指令译码状态830。

在指令译码状态830期间,取指的指令的各个位被译码成能够由处理器核用于控制特定指令的执行的信号,包括对指示存储器访问指令的相对顺序的标识符的生成。例如,译码的指令可以被存储在以上在图2中示出的存储器存储中的一个中。译码包括生成针对译码的指令的依赖性、针对译码的指令的操作数信息和针对译码的指令的目标。一旦指令块的至少一个指令已经被译码,指令块就可以前进到发出状态840。

在发出状态840期间,指令依赖性被评估以确定指令是否准备好执行。例如,指令调度器可以监视指令的源操作数并且(针对断言的指令)断言操作数必须在指令准备好发出之前可用。对于一些编码,某些指令还必须根据指定顺序发出。例如,存储器加载存储操作根据编码于每个指令中的lsid值来排序。在一些示例中,多于一个指令准备好同时发出,并且指令调度器选择准备好发出的指令之一来发出。指令可以使用它们的iid来识别以方便评估指令依赖性。一旦已经发出了指令块的至少一个指令,针对(一个或多个)发出的指令的源操作数可以被取指(或者在旁路路径上维持),并且指令块可以前进到执行状态850。

在执行状态850期间,与指令相关联的操作使用例如如以上关于图2所讨论的功能单元260来执行。如以上所讨论的,执行的功能可以包括算术功能、逻辑功能、分支指令、存储器操作和寄存器操作。与处理器核相关联的控制逻辑监视指令块的执行,并且一旦确定了指令块可以被提交或者指令块要被中止,指令块状态就被设置为提交/中止状态860。在一些示例中,控制逻辑使用针对指令块的写掩码和/或存储掩码来确定执行是否已经足够地前进到提交指令块。

在提交/中止状态860处,处理器核控制单元确定由指令块执行的操作可以被完成。例如存储器加载存储操作、寄存器读/写、分支指令和其他指令将必定根据指令块的控制流来执行。对于条件存储器指令,数据将被写入到存储器,以及在提交/中止状态860期间生成的指示成功的状态指示符值。备选地,如果指令块要被中止,例如,因为指令的依赖性中的一个或多个未被满足、或者指令在未被满足的针对指令块的断言上被推测地执行,则指令块被中止使得其将不会影响存储器或寄存器文件中的指令的顺序的状态。不管指令块是已经提交了还是中止了,指令块都进行到状态870以确定指令块是否应当被刷新。如果指令块被刷新,则处理器核通常使用新数据值(特别是通过刚刚提交的块的执行而更新的寄存器和存储器)重新执行指令块,并且直接前进到执行状态850。因此,可以避免在映射、取指和译码指令块中花费的时间和能量。备选地,如果指令块未被刷新,则指令块进入空闲状态880。

在空闲状态880中,执行指令块的处理器核可以通过例如对处理器核内的硬件掉电、同时维持针对指令块的译码的指令的至少一部分而被空闲。在某个时刻,控制单元确定890处理器核上的空闲指令块是否要被刷新。如果空闲指令块要被刷新,则指令块可以在执行状态850处重新开始执行。备选地,如果空闲指令块不要被刷新,则指令块不被映射并且处理器核可以被冲洗并且随后指令块可以被映射到冲洗的处理器核。

尽管为便于解释,状态图800将指令块的状态图示为在单个处理器核上执行,但是对相关领域的普通技术人员而言应当容易理解,在某些示例中,多个处理器核可以用于并发执行给定指令块的多个实例。

x.示例并行调度器

图9是描绘了如可以在所公开的技术的某些示例中实现的示例并行指令调度器900的块图。例如,针对图2的指令窗口230的指令调度器235可以使用所描绘的并行指令调度器900来实现。在一些示例中,并行指令调度器900使用fpga中的可配置逻辑来实现。在其他示例中,并行指令调度器900使用集成电路中的基于单元的或定制的逻辑电路来实现。

图示的并行指令调度器900包括调度器逻辑的32个切片,每个切片用于调度在32指令的指令块中的每个指令。为简单起见,仅仅图示了指令切片2(910)的内部部件,而其他指令切片的内部部件基本上是相同的。指令切片2对应于在当前执行的指令块中具有iid2的指令。指令切片中的每个切片被配置为接收相似的信号,但是该信号被配置为根据它们对应的指令来做出响应。

指令切片中的每个指令切片接收在指令块的执行期间生成的多个事件信号920。事件信号920通常随着每个时钟周期而被更新。事件信号920包括目标就绪事件信号t0和t1,其指示指令已经由执行指令瞄准。在一些示例中,目标就绪事件信号包括被瞄准的iid和输入槽(例如,op0、op1或断言槽)的指示。在处理器isa支持的广播中,事件信号920包括指示执行指令已经瞄准了广播信道并且识别了瞄准的信道(例如,3个广播信道之一)的广播idbid事件信号。事件信号920还可以由各种输入类型使能en来限定。

对于每个调度器切片,存在当指令被译码时由指令调度器初始化的译码的就绪状态的多个位。译码的就绪状态经由标记为dec.rdys的总线而从译码器接收。在图9的并行指令调度器900的示例切片910中,存在由指令译码器初始化的译码的就绪状态930的六个位:

·dbid:其指示指令在其上接收到广播数据的2位二进制广播id信道,或者其可以在指令没有接收到广播操作数时被编码为00;

·drt,drf:其指示指令是否依赖于接收到断言真(或断言假)值。在图示的配置中,值drt=1/drf=1指示指令不等待断言,drt=0/drf=1指示指令被断言为真(等待被真断言瞄准),drt=1/drf=0指示指令被断言为假(等待被假断言瞄准),并且drt=0/drf=0指示对应的指令尚未被译码(条目为空)。相同的编码可以用于活动就绪状态rt/rf;以及

·dr0,dr1:其分别指示指令的右操作数(op0)或左操作数(op1)就绪。

译码的就绪状态930可以被存储在任何适合的存储部件中,其可以包括触发器、锁存器和存储器单元。在本文中描述的示例编码中,就绪状态事件(下面讨论的译码的就绪状态事件和活动就绪状态事件)在指令依赖于接收到信号的情况下被编码为零位,或者在对应的就绪状态不是指令的依赖性或者已经被接收到的情况下被编码为一位。这些位一起编码:指令是否已经被译码、是否等待一个或多个操作数(包括数据或断言操作数,并且可能经由广播信道)、或者是否立即准备好发出。这些译码的就绪状态930位在块重置后被清除。

对于每个调度器切片,还存在活动就绪状态940的多个位。在示出的示例中,存在活动就绪状态940的六个位:

·rt,rf:其指示对应的指令断言真(或断言假)值就绪;

·r0,r1:其分别指示对应的右操作数(op0)或左操作数(op1)就绪;

·inh:其指示指令因为指令已经被发出到指令流水线而被抑制;以及

·rdy:其指示对应的指令准备好发出。

当rdy状态指示指令准备好发出时,就绪信号可以被生成并且发送到例如优先级编码器,以选择接下来要发出的一个或多个指令。活动就绪状态940可以被存储在任何适合的存储部件(其可以包括触发器、锁存器和存储器单元)中。

指令调度器切片(例如,切片910)中的每个切片包括nextrdys逻辑的集合,其比较可以包括以下项的数据:传入事件信号920、译码的活动就绪状态930、活动就绪状态940的先前值、以及下一发出的指令的iid,以便更新活动就绪状态值,如下面进一步详述的。

在任何时钟周期中,32个rdy信号中的任何一个或多个rdy信号(或没有rdy信号)可以被认定,这取决于处理器的执行状态。当rdy信号中的多于一个可以在给定时钟周期中被认定时,仲裁电路被采用以选择在接下来发出的一个指令。在图示的示例中,32位优先级编码器960将认定的rdy信号减少到针对接下来要发出的指令的选择的一个5位iid以及有效位v。对于支持多个发出(一次发出多于一个指令)的微架构,多个两个或更多指令iid可以在给定时钟周期中发出,这取决于处理器流水线的容量和配置。

如下面进一步详述的,处理器控制单元在接收到reset信号时重新初始化译码的就绪状态930,并且在接收到reset信号时或在接收到refresh信号时重新初始化活动就绪状态940。reset信号指示新指令块已经被调度在流水线硬件上,并且因此译码的就绪状态和活动就绪状态两者都要被初始化。refresh信号指示相同指令块的新实例已经被调用,并且因此活动就绪状态要被刷新。然而,在刷新操作中,译码的就绪状态930可以保持,因为其跨相同指令块的实例是不变的。

在示例指令调度器900中,如果(rt&rf&r0&r1&~inh),则指令准备好。在以下情况时rt、rf、r0、r1中的任何项可以被设置:

·其对应的drx由译码器设置,或者

·执行指令显式地或者经由广播事件(广播id,输入)瞄准该输入。

活动就绪状态位在时钟重置或刷新后被清除。表1描绘了在译码六个指令并且发出第一指令(第一行中的read指令)之后,块的指令调度器就绪状态的示例。这些指令对应于以上关于图6讨论的指令块620。

表1

如表1中所示,头四个非断言的指令具有drt和drf集合,其指示对应的指令不等待任何具体断言结果(换言之,头四个指令未被断言)。因此,未断言的并且具有零输入操作数(要从指令块中的另一指令接收的操作数)的两个read指令立即准备好发出。第一个read指令已经发出——并且因此第一个read指令现在被抑制重新发出(并且因此,其inh活动就绪状态位被设置为1)——瞄准add指令的操作数0(op0),该add指令的r0活动状态位现在被设置为1。第二个read将在下一is流水线周期中发出。tlei(测试小于或等于立即,test-less-than-or-equal-immediate)指令在广播信道1上广播其断言结果;分别被断言为真/假的两个分支指令bro.t和bro.f等待该断言结果。第七个条目尚未被译码,并且因此译码的就绪状态中的drt和drf的值被设置为零(0)。

为了减少数据流调度的关键路径,前端可以将预先译码的edge指令写入到译码的指令缓冲器中。当指令iid发出时,其译码的指令由后端读取。尤其地,其包含两个目标操作数就绪事件字段_t0和_t1,其指定指令的0–2(iid,输入)显式目标、以及4位向量的输入使能:ens={rt_en,rf_en,r0_en,r1_en}。参考回到图2,这些信号由调度器使用多路复用器237和238而与来自其他流水线阶段的就绪事件一起被多路复用到t0和t1输入中。在一些示例中,这些就绪事件信号包括从ex流水线寄存器245和函数单元250中的一个或多个获取输入,以生成由指令执行(如与指令发出相反)而得到的目标就绪事件。可以生成这样的目标就绪事件的逻辑单元的示例被称为exts控制单元(图2中未示出)。

例如,当is阶段以两个周期的固定延时(诸如相乘)发出指令时,唤醒该指令的目标过早,因为结果将在下一周期中不可用(例如,经由结果转发),而是将在此之后的周期可用。因此,发出的译码的指令首先移动到ex流水线阶段(一个周期)中,并且在该周期中exts控制单元发出零个、一个或两个目标就绪事件到调度器。

作为另一示例,当is阶段发出瞄准其他指令(例如,测试指令,诸如tlei)的断言操作数的指令时,唤醒该测试的(一个或多个)目标过早,因为测试的真/假结果尚不知道。因此,发出的测试指令首先移动到ex流水线阶段中,测试结果利用函数单元250中的一个函数单元来确定,并且测试结果由exts单元发送以将(断言真或断言假的)目标就绪事件发送到调度器。

在一些其他执行情形中,exts单元不用于生成就绪事件信号。例如,当is阶段发出具有一个周期的固定延时的指令(例如,add指令)时,译码的指令包括目标就绪事件字段以在指令发出时唤醒指令的目标,因此这些目标可以转而在下一周期中发出(在图2的示例中,这些目标就绪事件字段是到t0、t1多路复用器237和238的输入)。这可以用于实现背靠背唤醒/发出。

在仔细关注fpga电路设计的情况下,调度器的面积和时钟周期可以被减少。示出的32指令窗口将使用32*(6+6)=384个ff以用于就绪状态,并且使用32*12个lut来译码就绪事件并且更新每个条目的就绪状态。

现代fpga(诸如以上在图3中描述的那个)将lut(查找表)和d触发器(ff)的集合一起打包到逻辑集群中。例如,xilinxvirtex-7系列设备将四个6-lut和八个ff分组到每个“切片”集群中。每个lut具有两个输出并且可以被用作一个6-lut或者具有五个共同输入的两个5-lut。每个输出可以被寄存(存储)在ff中。触发器具有可选的ce(时钟使能)和sr(设置/重置)输入,但是这些信号对于集群中的全部八个ff是共同的。该基本集群架构在许多方面与alterafpga相似。

由此得出两个设计考虑。首先是对可断裂6-lut译码器的使用。对于目标指令索引译码,只要输入索引≤5位,那么两个译码器就可以适合放入单个6-lut中。其次,是切片ff打包和集群控制集合限制。为了减少面积和线缆延迟,设计密集地打包就绪状态ff,其中每集群大约4-8个ff。每一个6位译码的就绪状态条目被一起写入(共同rst和ce)并且可以被打包到一个或两个切片中。

对于活动就绪状态ff,这些32*6=192个ff中的每个ff可以被单独地设置,但是通过每个切片打包四个ff,则当一个ff被时钟使能时使得全部ff被时钟使能。每当ff由就绪事件设置时,该ff的切片中的其他ff不应当改变。这可以使用每个ff的输入lut中的ce功能来实现,从而将其输出反馈回到其输入:ff_nxt=ff|(en&输入)。下面的表2是生成针对n条目并行调度器的nextrdys信号的verilog硬件描述语言代码清单。在其他示例中,生成nextrdys信号的逻辑可以以其他形式表达,包括使用示意性捕获、网表或用于表达逻辑的其他适合的格式。

表2

尽管存在四种就绪事件输入类型(断言真(rt/drt),假(rf/drf),右操作数/op0(r0/dr0),左操作数/op1(r1/dr1)),但是通过确保断言目标事件决不会与操作数目标事件在相同的周期中发生,单个目标索引位足以将假/op0目标与真/op1目标区分开。因此,处理器控制器逻辑和/或编译器可以确保给定指令仅仅瞄准其他指令的断言或仅仅瞄准值/操作数。通过使用特定{rt/rf/r0/r1}_ens使能来提供进一步译码。因此,对于具有n=32个条目的指令窗口,t0和t1是六位,包括输入标识符(一位)和指令iid(5位)。因此,目标译码器t00、t01、t10、t11(目标-0-输入-0,等等)各自被映射到一个6输入lut,如广播选择译码器b一样。下一活动就绪状态逻辑将目标译码器输出与当前活动就绪状态和译码的就绪状态折叠在一起。这使用另外七个lut(针对inh_nxt两个),对于该示例逻辑和目标fpga技术总共有32*12=384个lut。

该映射可以通过(例如,基于指令的iid的最低有效位)将32条目调度器拆分成偶数指令和奇数指令的两个16条目组来改进。在图示的示例中,在组内,4位的组iid足够。之后,t0、t1变窄到五个位,因此,t00、t01、t10、t11适合放入5个5输入lut中,并且inh_nxt在一个6输入lut或者针对该示例逻辑和目标fpga技术的全部2*16*(3+6)=288个lut中。

除了减少lut的数量,两个组指令调度器提供两个t0、t1端口的集合并且可以在每个周期沉没两个事件的两个集合。这可以用于维持每周期两个指令的更宽发出速率(其可以每周期瞄准四个操作数)。甚至更宽的发出和甚至更大的指令窗口甚至可能值得四组设计。

就绪-发出-瞄准-就绪的调度复发可以为is阶段的关键路径。32→5优先级编码器将rdy向量减少到选择译码的指令的iid。译码的指令的字段{_t0,_t1,_bid,_ens}被多路复用成{t0,t1,bid,ens},其更新目标指令的就绪状态,包括rdy。

许多32位优先级编码器设计可以被使用,包括具有lut或进位逻辑or树的单热转换、进位逻辑零扫描以及f7map/f8map多路复用器。图示的设计可以使用两个16→4编码器来实现,每个组一个,该设计在两个lut延迟中完成。在一次发出的处理器中,后续2:1多路复用器选择这些编码器输出之一。可以使用不同的优先级方案。例如,优先级编码器可以被配置为选择断言具有最低iid的其rdy信号的指令。应当容易理解,其他优先级选择方案可以被使用,例如通过优选高延时或低延时指令、断言的对比非断言的、或者其他适合的选择方案。优先级选择方案的附加示例可以被采用,包括但不限于,随机选择就绪指令、选择具有最高(或最低)iid的就绪指令、或者选择第一个具有在最后发出的iid之后的iid的就绪指令。应当指出,核如何选择要发出的就绪指令的知识可以由编译器利用、例如通过鉴于优先级选择方案来对指令进行排序,编译器可以确定多个就绪指令中的哪个将首先发出。在一些示例中,用于给定指令块的优先级选择方案可以在指令块头中被信号通知。

在图示的示例中,每个16位译码器输入i[15:0]被分块成如下束:i[15]、i[14:10]、i[9:5]和i[4:0]。每个5位组利用针对该组的预先计算的编码器输出来索引32×4个lutrom。连同三个5位零比较器输出,这些馈送4位3:1选择器,其在全部三个组为零时输出0’b1111。

所公开的并行指令调度器可以适于取决于fpga目标而改进的技术映射和平面布置图。图9中图示的示例设计使用rpm(有关系地放置的宏)方法来改进面积和互连延迟,并且在模块组成和大规模复制下实现用于更容易的路由和时序闭合的可重复布局。结构rtl可以被用于实例化模块并且将它们拼接到调度器中。例如,当映射到xilinxfpga时,≤6输入模块上的xst标注(*lut_map=“是”*)将使xilinxxst编译器把逻辑锁定到一个lut;xst标注(*rloc=“xxyy”*)将fpga基元打包到逻辑集群中并且将逻辑集群相对于彼此放置。

图10是示例并行指令调度器900的xilinxkinext-7系列实现的平面布置图1000,该示例并行指令调度器900包括调度器切片910、优先级编码器960、以及译码的指令缓冲器236,其中指示出了时序关键路径1010。

fpga切片的每两个水平行对应于指令窗口中的四个条目。从左到右为:

·淡黄色:四个6位译码的就绪状态触发器;

·黄色/绿色:b、t00、t01、t10、t11目标译码器;

·橙色:活动就绪状态lut/fprt_nxt/rt等等;

·紫色:inh_nxt和inh;

·红色:rdy_nxt和rdy。

往右边是实现在若干32x6位真双端口lutram中的合成的优先级编码器和多路复用器(蓝色)以及译码的指令缓冲器(白色)。

性能:在kintex-7-1-速度评级中,关键路径花费5.0ns,包括到输出、优先级编码器、多路复用器、译码的指令lutram、下一就绪逻辑和rdy设置的rdy时钟。互连延迟为关键路径的85%,因为从任何rdy到另一任何rdy的所有路径必须遍历相对大的直径网表。

周期时间可以通过在调度器关键路径(指令缓冲器lutram的输出端口)的半路添加流水线寄存器而被减少到2.9ns,然而这将不能实现对指令的单个依赖链的(在连续周期中的)背靠背发出。

在使用拆分组并行调度器的一些示例中,edge编译器不保证指令的两个目标都在不相交的调度器组中,因此可能存在调度器库冲突。例如,add指令可以瞄准指令10的操作数和指令12的操作数。由于并行调度器不可以在相同周期中更新两个偶数库目标的活动就绪状态,所以处理一个事件并且另一事件被排队以用于稍后的周期。

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

图11是图示包括基于块的处理器1110的装置的图1100,基于块的处理器1110包括被配置为执行包括用于包括存储器同步和存储器锁定的存储器操作的指令的指令块的控制单元1120。控制单元包括核调度器1125,其控制:对用于执行指令处理的核的分配和解除分配、对在核、寄存器文件、存储器接口和/或i/o接口中的任何项之间的输入数据和输出数据的控制。控制单元1120还可以包括用于执行某些存储器操作的专用寄存器。

基于块的处理器1110还包括被配置为取指并且执行指令块的一个或多个处理器核1130–1137。核中的每个核包括控制指令块中的指令被取指、译码、发出和执行的顺序的指令调度器(例如,并行指令调度器1141)。图示的基于块的处理器1110具有至多八个核,但是在其他示例中可以存在1个、2个、4个、64个、512个、1024个或其他数量的基于块的处理器的核。基于块的处理器1110被耦合到存储器1150并且被耦合到计算机可读存储介质盘1160,存储器1150包括指令块a和b,其包括实现所公开的存储器操作的指令(分别为1155和1156),计算机可读存储介质盘1160存储用于执行所公开的存储器操作的指令1165。

xii.操作基于块的处理器的示例方法

图12是概述如可以在所公开的技术的某些示例中执行的、选择一个或多个基于块的处理器指令以利用并行指令调度器发出的示例方法的流程图1000。例如,包括使用上面关于图2讨论的微架构200实现的示例的上面关于图1讨论的基于块的处理器100可以用于执行图示的方法。

在处理块1210处,从指令译码器接收译码的就绪状态数据。在一些示例中,指令译码器接收已经被高速缓存在指令高速缓存中的指令。指令译码器可以生成被发送到并行指令调度器的信号和译码的指令存储的信号。译码器将译码的就绪状态数据发送到并行指令调度器。例如,这可以包括:指示引用的指令是否依赖于接收到广播操作数、以及广播操作数将在哪个信道上被接收的数据,断言操作数,以及断言操作数要评估以便执行指令的值,以及左操作数和/或右操作数。译码器还将译码的指令数据发送到译码的指令存储。信号可以被生成以用于根据译码的指令存储中的译码的信号来发出并且执行相应指令。

并行指令调度器还维持活动就绪状态数据的存储。在一些示例中,活动就绪状态数据通过将译码的就绪状态数据复制为初始活动就绪状态而被初始化。活动就绪状态数据中的其他信号,诸如就绪信号和抑制信号,也被初始化。一旦译码的就绪状态数据和活动就绪状态数据已经被初始化,方法就可以前进到处理块1220。

在处理块1220处,并行指令调度器从处理器执行单元接收事件信号。例如,指示特定信道上的广播操作数是否已经被生成的信号、瞄准的指令标识符(t1和t0)以及使能信号可以随着执行前进而由并行指令调度器生成并且接收。并行指令调度器还在指令根据由并行指令调度器生成的就绪信号发出指令时,接收指令标识符。

在处理块1230处,基于译码的就绪状态数据和在处理块1220处接收的事件信号,更新活动就绪状态信号和就绪信号。例如,图9中图示的并行指令调度器可以使用nextrdys逻辑块中的逻辑来评估传入信号和现有调度器状态,以便更新活动就绪状态数据,并且生成针对其依存性已经被满足并且因此准备好发出的任何指令的就绪信号。

在处理块1240处,基于在处理块1230处生成的就绪信号来选择一个或多个指令以发出。有时将存在具有就绪信号的多于一个指令。在这样的示例中,诸如使用优先级编码器的选择技术可以被用于选择要发出的下一指令。在一些示例中,优先级编码器基于对针对指令的指令标识符的比较来选择要发出的下一指令。在其他示例中,不同的标准可以被使用,诸如指令的类型。例如,取决于配置的方案,选择方案可以选择具有更高优先级的断言的或非断言的指令、或者选择存储器加载/存储或其他类型的指令来发出,。一旦已经选择了用于发出的指令,其抑制的位被设置为处于活动就绪状态。这防止指令第二次被选择用于发出。

xiii.操作具有可选旁路的基于块的处理器的示例方法

图13是概述了根据所公开的技术的某些示例的、使用并行指令调度器来选择、发出并且执行指令的示例方法的流程图1300。例如,包括使用与图2中示出的类似的微架构200的那些实现的上面关于图1讨论的基于块的处理器100可以用于执行图示的方法。在一些示例中,方法使用定制或asic处理器来执行,而在其他示例中,方法使用利用诸如fpga中的可重新配置逻辑而形成的软处理器来执行。

在处理块1310处,并行指令调度器(诸如上面关于图9描述的那个)被初始化。针对每个指令的就绪状态数据在指令调度器中被初始化。指令调度器包括就绪状态数据的一个切片和每个指令的就绪状态更新逻辑。每个切片可以根据其对应的指令标识符(其被编码在指令块中)来寻址。因此,依赖性使用编码在指令块中的指令标识符而不是基于寄存器或虚拟寄存器的变化的识别而被识别。在一些示例中,调度器使用针对特定指令块的先前编码的数据来初始化。一些示例,执行指令块的第一次或某些后续实例,并且指令译码器通过从存储在主存储器中和/或临时存储在指令高速缓存的指令译码指令头和指令信息,来生成就绪状态数据并且还生成译码的指令控制信号。

在处理块1320处,就绪状态数据和事件信号被评估以生成针对已经满足了依赖性的那些指令的就绪信号。例如,对于以上关于图9描述的并行指令调度器,当活动就绪状态940的所有位都已经被设置为1时,针对指令的相关联的切片的对应的就绪信号被设置为1。处理器中的控制逻辑可以从断言就绪信号并且发出指令的指令中的一个或多个中选择。控制逻辑之后认定抑制的活动就绪状态数据以防止指令重新执行。

在处理块1330处,根据在处理块1320处生成的就绪信号来选择、发出并且执行一个或多个指令。在单个发出微架构中,一次仅仅发出一个指令。在多个发出微架构中,可以并发发出并且执行多于一个指令。在一些示例中,优先级编码器用于选择具有最低指令id的就绪指令以在接下来发出。在其他示例中,其他方案可以用于识别要发出的下一指令。

在处理块1340处,旁路针对执行指令的至少一个源操作数的操作数缓冲器。例如,因为并行调度器可以指示多于一个指令准备好发出,所以并行指令调度器可以在处理器流水线的第一时钟周期中发出第一指令并且生成指示第二指令准备好发出的就绪信号。第二指令依赖于由第一指令生成的至少一个操作数。指令调度器包含可以用于识别该依赖性并且在处理器流水线的下一时钟周期中发出第二指令的逻辑。在一些情况下,这可以消除流水线暂停的一个或多个周期,由此改进处理器流水线的吞吐量。在一些示例中,数据路径中的旁路逻辑允许数据操作数在没有首先被存储在数据操作数缓冲器中的情况下从第一执行指令被转发到处理器的执行单元。这允许消除流水线时钟周期存储和检索数据操作数缓冲器中的相关联的数据操作数。因此,并行指令调度器允许旁路针对执行指令的至少一个源操作数的操作数缓冲器。

在处理块1350处,生成用于执行并且引退指令的事件信号。例如,事件信号可以指示目标操作数可用于执行的指令的目标操作数。其他事件信号可以指示广播信道操作数可用。在一些示例中,诸如从寄存的文件和/或存储器取指的数据的可用性的其他信号也可以被生成为事件信号。事件信号可以被发送到并行指令调度器以用于更新就绪状态数据并且发出附加的指令。在指令块被提交并且引退之后,另一指令块被执行。如果相同的指令块被重新执行为新实例,则方法前进到处理块1310并且并行指令调度器被刷新。换言之,并行指令调度器的每个切片中的活动就绪状态数据根据先前针对指令块生成的译码的就绪状态来重置。另一方面,如果新指令块被取指并且执行,则方法前进到处理块1360。

在处理块1360处,针对指令块的指令窗口就绪状态被完全重置。或者从指令译码器生成新的译码的就绪状态数据。处理器的指令窗口之后通过返回到处理块1310而被重置以执行指令块。.

xiv.配置可重新配置逻辑器件的示例方法

图14是概述如可以在所公开的技术的某些示例中执行的配置可重新配置逻辑器件的示例方法的流程图1400。例如,以上关于图3所讨论的fpga可以被配置为使用以上关于图2讨论的示例微架构来实现图1的基于块的处理器,其包括并行指令调度器,其包括以上关于图9讨论的指令并行调度器。

在处理块1410处,将基于块的处理器部件的描述映射到fpga的可重新配置逻辑器件部件。例如,处理器设计者可以指定以硬件描述语言的对基于块的处理器的描述,硬件描述语言诸如为systemverilog、systemc、verilog或硬件描述语言的任何其他适合的组合。在一些示例中,以诸如c或c++的传统编程语言编写的描述用于描述基于块的处理器的至少一部分。例如,上面的表2是可以用于在并行指令调度器的某些示例中实现nextrdys逻辑的verilog代码列表。基于块的处理器的描述可以包括以上讨论的新颖部件中的任何部件。在一些示例中,设计者可以指定要由处理器微架构的元件瞄准的特定fpga单元。例如,设计者可以指定指令高速缓存和/或数据高速缓存使用fpga的块ram资源来实现。在一些示例中,程序员可以使用由fpga供应商提供的可用宏来实现fifo缓冲器、移位寄存器和使用针对该fpga的经济映射的其他部件。

在处理块1420处,产生配置比特流以用于实现针对基于块的处理器的电路,其包括使用由指令标识符索引的就绪状态数据的并行指令调度器。例如,以硬件描述语言表示的基于块的处理器的描述可以被编译以生成网表,并且该网表转而用于生成比特流文件。在比特流文件中指示的信号可以被施加到fpga的配置接口以便根据将fpga配置为执行用于实现根据所公开的技术的基于块的处理器的功能。

在处理块1430处,可重新配置逻辑器件使用在处理块1420处生成的比特流来配置。例如,一些fpga具有用于将数据连续地流传输到fpga的配置存储器中的配置端口,由此配置fpga。在一些示例中,fpga的配置存储器通过并行或其他可寻址端口而被寻址。在一些示例中,具有与fpga类似的结构的可重新配置逻辑器件可以被配置一次,而不可被重新配置。在其他示例中,fpga可以被电擦除并且被重新写入以便提供新配置。在一些示例中,fpga在无论何时集成电路被重新上电时都被重新配置,而在其他示例中,fgpa配置跨重复的电力周期维持状态。

xv.实验结果

下面讨论实验结果,包括示例性xilinx7系列fpga中的资源使用。实验结果基于包括并行指令调度器的基于块的处理器设计与使用不同的增量指令调度器的处理器设计的比较。结果出于说明性目的而提供,而不应当被当作限制权利要求的范围或以其他方式对本公开内容导入限制。

表3

表3概括了以上讨论的并行数据流调度器设计与示例增量数据流调度器设计之间的差异。并行调度器比备选的增量实现更大、但是呈现出许多性能优点。具有并行指令调度器的处理器可以在单个周期中处理广播事件。并行指令调度器还不会遭受偶/奇目标组冲突,该冲突可能使指令唤醒延迟。

另外,为了更宽的发出和更大的指令窗口,并行调度器不在被细分成多个组以在每个周期处理两倍之多的事件时增加,然而备选的增量调度器的核面积加倍。为了使指令窗口增加到64个条目,并行调度器要求两倍之多的面积。

xvi.示例计算环境

图15图示了在其中可以实现所描述的实施例、技术和工艺(包括配置基于块的处理器)的适合的计算环境1500的一般示例。例如,计算环境1500可以实现所公开的技术,以用于配置处理器以实现所公开的基于块的处理器架构和微架构、和/或将代码编译成计算机可执行指令和/或用于执行这样的操作的配置比特流,其包括并行指令调度器,如在此所描述的。

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

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

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

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

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

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

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

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

在这里根据以上讨论的示例来讨论所公开的主题的附加示例。例如,以上关于图1、图2和图9讨论的基于块的处理器的方面可以用于实现这些附加示例,包括fpga、诸如以上关于图3和图4讨论的那些fpga。

在所公开的技术的某些示例中,基于块的处理器中的全部或一部分通过将fpga配置为包括用于执行在基于块的处理器isa中表达的程序的结构来实现。在一些示例中,处理器被实现在嵌入式设备中,诸如用于部署在物联网(iot)网络中。在一些示例中,诸如高速缓存的结构,以及在指令调度器、加载存储队列和/或寄存器文件中使用的存储被实现在具有单个写端口或单个读端口的存储器中。在其他示例中,这些结构中的一个或多个被实现在具有多个读端口和/或写端口的存储器中。在一些示例中,指令块的指令块头以及一个或多个指令可以从存储器和/或指令高速缓存并发地取指。在一些示例中,旁路机构允许从微架构流水线的执行部分生成的操作来旁路操作数,由此允许具有共享的或链式的依赖性的指令的背靠背发出。在一些示例中,旁路机构允许当在执行时钟周期期间与指令窗口操作数缓冲器上的写入端口相比存在更多生成的操作数时,避免流水线暂停。

在一些示例中,调度器可以使用译码的或先前译码的指令依赖性,来在它们已经被取指之前唤醒并且发出指令。在一些示例中,针对指令调度器的存储可以被分成两个或更多个部分,以便将存储映射到fpga的两个或更多个物理存储单元。在一些示例中,指令调度器包括并行调度器。在一些示例中,调度器被配置为在重新执行指令块后刷新指令中的一些但不是全部。

在所公开的技术的一些示例中,一种装置包括基于块的处理器,该基于块的处理器具有:指令译码器,其被配置为针对指令块中的指令集生成就绪状态数据,该指令集中的每个指令与编码在该指令块中的不同指令标识符相关联;以及并行指令调度器,其被配置为基于译码的就绪状态数据而从该指令集发出指令。在一些示例中,并行指令调度器包括针对该指令集中的每个相应指令的调度器切片。在一些示例中,该调度器切片包括被配置为存储针对其相应指令的就绪状态数据的存储装置,并且其中该调度器切片还被配置为生成指示其相应指令准备好发出的就绪信号。在一些示例中,该调度器切片被配置为部分地基于在该指令块的执行期间生成的事件信号,来更新活动就绪状态数据。在一些示例中,该调度器切片被配置为部分地基于接收到指示该调度器切片的相应指令已经发出的指令标识符,来更新活动就绪状态数据。在一些示例中,该就绪状态数据包括译码的就绪状态数据和活动就绪状态数据,该译码的就绪状态数据对于指令块中的指令是不变的,该活动就绪状态数据是使用该译码的就绪状态数据作为掩码而被播种的。在一些示例中,该基于块的处理器是利用可配置逻辑器件(例如可重新配置逻辑器件,诸如fpga)实现的软核处理器。

在一些示例中,一种并行指令调度器被配置为:在该处理器的第一时钟周期中,发出第一指令并且生成第二指令准备好发出的就绪信号,该第二指令依赖于该第一指令;并且在该处理器的下一时钟周期中,发出该第二指令。在一些示例中,该处理器还包括:数据操作数缓冲器,其被配置为在每个时钟周期为不超过一个的指令存储操作数数据;以及旁路逻辑,其允许在不同数据操作数被存储在该数据操作数缓冲器中时、针对不同指令的数据操作数在相同时钟周期中被转发到该处理器的执行单元。

在所公开的技术的一些示例中,一种可(重新)配置逻辑器件被配置为执行基于块的处理器指令集,该器件包括:多个查找表(lut);指令译码器,其被配置为针对编码在指令块中的指令生成依赖性的表示;并行指令调度器,其被配置为生成指示针对相应指令的依赖性被满足的就绪信号;以及一个或多个执行单元,其被配置为在接收到其就绪信号之后执行由该相应指令指定的操作。在一些示例中,该指令调度器被分成两个或更多个组,该组中的每个组被分配给该多个多输入lut的不同部分。在一些示例中,该指令调度器利用使用该多个lut的一部分而形成的随机存取存储器(ram)来实现。在一些示例中,该指令调度器被耦合到:译码的指令字存储器,其被配置为针对所接收的指令的至少一部分存储译码的指令控制数据;以及多个操作数缓冲器,其被配置为存储用于执行所接收的指令的操作数数据。在一些示例中,该器件还被配置为通过刷新并且重新执行该指令块来执行指令块的后续实例,并且该就绪状态数据包括在该刷新后不被清除的译码的就绪状态信息、和在该刷新后被清除的活动就绪状态数据。在一些示例中,该调度器将针对每个指令的该就绪状态数据存储在该可配置逻辑器件的能够被清除和/或利用单个信号来设置的触发器的集合中。

在所公开的技术的一些示例中,一种形成具有可配置逻辑器件的基于块的处理器的方法包括:产生配置比特流,该配置比特流包括配置信息,该配置信息用于实现针对具有可配置逻辑器件的该基于块的处理器的电路,并且针对该基于块的处理器的该电路包括并行指令调度器,该并行指令调度器被配置为基于存储在存储器中的、通过唯一地识别事务指令块的每个相应指令的指令标识符索引的就绪状态数据来发出指令。

在一些示例中,生成配置比特流的方法包括使用逻辑编译器来将具有n个或更少输入的调度器的部分映射到具有n个或更少输入的可配置逻辑器件的查找表存储器。在一些示例中,方法还包括使用逻辑编译器来将该调度器的部分映射到该可配置逻辑器件的第一组逻辑资源,并且将该调度器的其他部分映射到该可配置逻辑器件的第二组逻辑资源。在一些示例中,方法还包括将配置比特流施加到包括可配置逻辑器件的集成电路的配置端口,并且利用基于块的处理器来执行一个或多个指令。在一些示例中,方法包括将配置比特流存储在计算机可读存储设备或存储器中。

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

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