一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

将原子性与操作大小解耦的制作方法

2023-02-06 12:48:19 来源:中国专利 TAG:


1.本文所述的实施方案涉及处理器,并且更具体地涉及处理处理器中的排序以满足存储器一致性模型要求。


背景技术:

2.处理器通过在可能时不按程序顺序执行指令等方式来实现高性能。对于大多数算术/逻辑(alu)类型指令、分支指令和其他非存储器指令,执行可以按产生如同指令按程序顺序执行时相同的结果的任何顺序进行。指令集架构(isa)还包括存储器指令/操作,诸如在大多数isa中分别用于读取和写入存储器的加载和存储指令,或在其他isa中具有存储器操作数的指令。对于存储器指令/操作,排序模型(或存储器一致性模型)在某种程度上更复杂,这是因为写入存储器的结果在某个时刻对其他线程(例如,在多处理器环境中,在其他处理器上执行的线程)可见。存储器一致性模型指定线程内和线程间的存储可见性的一组可接受结果。本文中的存储器一致性模型在本文中也被更简要地称为存储器模型、存储器排序模型或排序模型。
3.在最严格的排序模型(顺序一致性)中,所有存储器指令必须表现为已经按程序顺序被执行。其他排序模型则更宽松。例如,在全存储排序(tso)中,处理器可以将其自己的读取移动到其自己的写入之前,但是给定写入必须在同一逻辑时刻对所有处理器可见(例如成为读取的结果)。确保tso或其他更严格的存储器模型的一个要求是给定读取从相同的源(例如,存储队列中的存储、或高速缓存或主存储器)接收其字节。当对于给定读取满足相同的源要求时,给定读取在执行给定写入之前或在执行给定写入之后逻辑地接收其所有字节。如果允许混合来自多于一个源的字节,则给定读取可能在多个写入期间观察到不正确的顺序。
4.另一性能增强技术是指令融合。例如,一些isa支持写入多个寄存器的加载指令(例如,arm isa中的加载对指令、power isa中的加载多个或加载串指令等)。因为此类加载指令具有较大操作大小,所以此类指令不太可能从实施存储队列的处理器中的单个源获得其所有字节。类似地,向量指令通常具有大操作大小以支持向量寄存器中的大量向量元素(例如,128个位、256个位、512个位等)。由于为了维持更严格的排序模型(诸如tso)的原子性需要较慢的执行,多个寄存器加载或向量加载的性能因此而受到损害。


技术实现要素:

5.在一个实施方案中,处理器实施与操作大小不同的原子性大小(用于存储器一致性顺序)。更具体地,该处理器可实施比该操作大小更小的原子性大小。例如,对于多个寄存器加载,该原子性大小可以是寄存器大小。又如,向量元素大小可以是针对向量加载指令的该原子性大小。还又如,多个连续的向量元素(但少于向量寄存器中的所有向量元素)可以是针对向量加载指令的该原子性大小。对于操作的每个原子元素的数据源自一个源(例如,存储队列或高速缓存/存储器)的情况,可满足加载的原子性,因此可在不重试或刷新的情
况下完成加载。在一个实施方案中,可改进处理器在执行此类加载时的性能。
附图说明
6.下面的详细描述参照附图,现在对这些附图进行简要说明。
7.图1是处理器的框图。
8.图2是示出针对一个实施方案的解耦的原子性和操作大小的框图。
9.图3是示出处理器的一个实施方案在加载操作的执行期间的操作的流程图。
10.图4是示出访问高速缓存行内和跨高速缓存行的数据的示例性加载的框图。
11.图5是示出处理器的一个实施方案用于确保针对跨高速缓存行访问的加载顺序的操作的流程图。
12.图6是加载/存储单元和包括重排序缓冲器(rob)的解码/映射单元的一个实施方案的框图。
13.图7是示出处理器的一个实施方案用于实施针对微编码加载的依序加载处理的操作的流程图。
14.图8是包括图1所示的处理器的系统的一个实施方案的框图。
15.图9是计算机可访问存储介质的一个实施方案的框图。
16.尽管本公开中所述的实施方案可受各种修改形式和另选形式的影响,但其具体实施方案在附图中以举例的方式示出并将在本文中详细描述。然而,应当理解,附图和对其的具体实施方式不旨在将实施方案限制为所公开的特定形式,而相反,本发明旨在涵盖落入所附权利要求书的实质和范围内的所有修改、等同物和另选方案。本文所使用的标题仅用于组织目的,并不旨在用于限制说明书的范围。如在整个本专利申请中所使用的那样,以允许的意义(即,意味着具有可能性)而非强制的意义(即,意味着必须)使用字词“可”。类似地,字词“包括”(“include”,“including”,和“includes”)意味着包括但不限于。如本文所用,术语“第一”、“第二”等充当其之后的名词的标签,并且不暗指任何类型的排序(例如,空间的、时间的、逻辑的等),除非有明确指出。
17.在本公开内,不同实体(其可被不同地称为“单元”、“电路”、其他部件等)可被描述或声称成“被配置为”执行一个或多个任务或操作。此表达方式—被配置为[执行一个或多个任务]的[实体]—在本文中用于指代结构(即,物理的事物,诸如电子电路)。更具体地,此表达方式用于指示此结构被布置成在操作期间执行一个或多个任务。结构可被说成“被配置为”执行某个任务,即使该结构当前并非正被操作。“被配置为生成输出时钟信号的时钟电路”旨在覆盖例如在操作期间执行此功能的电路,即使论述中的电路当前并未被使用(例如,该电路并未连接到功率)。因此,被描述或表述成“被配置为”执行某个任务的实体是指用于实施该任务的物理的事物,诸如设备、电路、存储有可执行程序指令的存储器等等。该短语在本文中不被用于指代无形的事物。通常,形成与“被配置为”对应的结构的电路可包括硬件电路。硬件电路可包括以下项的任意组合:组合式逻辑电路、时钟存储设备(诸如触发器、寄存器、锁存器等)、有限状态机、存储器(诸如静态随机存取存储器或嵌入式动态随机存取存储器)、定制设计电路、模拟电路、可编程逻辑阵列等。类似地,为了描述方便,可将各种单元/电路/部件描述为执行一个或多个任务。此类描述应当被解释为包括短语“被配置为”。
[0018]
术语“被配置为”并不旨在意指“可配置为”。例如,未经编程的fpga不会被认为是“被配置为”执行某个特定功能,虽然其可能“可配置为”执行该功能。在适当编程之后,fpga然后可认为“被配置为”执行该功能。
[0019]
在一个实施方案中,可通过以硬件描述语言(hdl)诸如verilog或vhdl对电路的描述进行编码来实现根据本公开的硬件电路。可针对为给定集成电路制造技术设计的单元库来合成hdl描述,并可出于定时、功率和其他原因而被修改,以获得可被传输到工厂以生成掩模并最终产生集成电路的最终的设计数据库。一些硬件电路或其部分也可在示意图编辑器中被定制设计并与合成电路一起被捕获到集成电路设计中。该集成电路可包括晶体管并还可包括其他电路元件(例如,无源元件,诸如电容器、电阻器、电感器等),以及晶体管和电路元件之间的互连件。一些实施方案可实现耦接在一起的多个集成电路,以实现硬件电路,和/或可在一些实施方案中使用离散元件。另选地,hdl设计可被合成为可编程逻辑阵列诸如现场可编程门阵列(fpga)并且可在fpga中实现。
[0020]
如本文所用,术语“基于”或“取决于”用于描述影响确定的一个或多个因素。此术语不排除可能有附加因素可影响确定。也就是说,确定可仅基于指定的因素或基于所指定的因素及其他未指定的因素。考虑短语“基于b确定a”。此短语指定b是用于确定a的因素或者b影响a的确定。此短语并不排除a的确定也可基于某个其他因素诸如c。此短语也旨在覆盖a仅基于b来确定的实施方案。如本文所用,短语“基于”与短语“至少部分地基于”是同义的。
[0021]
本说明书包括对各种实施方案的参考,以指示本公开并非旨在提及一个特定具体实施,而是提及落入包括所附权利要求书的本公开的实质内的一系列实施方案。特定特征、结构或特性可以与本公开一致的任何合适的方式被组合。
[0022]
本说明书可使用字词“一个”或“一种”来指代元件,或使用词语“该”来指代元件。这些字词并非旨在意味着仅存在元件的一个实例。在各种实施方案中可存在多于一个。因此,除非明确地描述为仅一个,否则“一个”、“一种”和“所述”应解释为意味着“一个或多个”。
[0023]
本说明书可将各种部件、单元、电路等描述为耦接的。在一些实施方案中,如果部件、单元、电路等电耦接(例如,直接连接或通过一个或多个其他电路间接连接)和/或通信耦接,则这些部件、单元、电路等可耦接。
具体实施方式
[0024]
现在转向图1,其示出了处理器12的一个实施方案的框图。在例示的实施方案中,处理器12包括获取地址生成电路14、指令高速缓存(“icache”)18、解码/映射单元22(包括重排序缓冲器(rob)20)、分支预测单元26、一个或多个保留站24a-24n、一个或多个执行单元28a-28b、寄存器文件30、数据高速缓存(“dcache”)16和加载/存储单元(lsu)42。lsu 42包括加载队列(lq)30、存储队列(sq)32以及耦接到lq 30和sq 32的执行电路34。
[0025]
获取地址生成电路14耦接到icache 18,该icache耦接到解码/映射单元22,该解码/映射单元耦接到保留站24a-24n。如图1所示,保留站24a-24b耦接到执行单元28a-28b,并且保留站24n耦接到lsu 42。保留站24a-24n还耦接到寄存器文件30,该寄存器文件耦接到执行单元28a-28b和lsu 42。lsu 42还耦接到dcache 16,该dcache耦接到寄存器文件30。
分支预测单元26耦接到获取地址生成电路14。执行单元28a-28b中的一者或多者可耦接以提供到获取地址生成电路14和解码/映射单元22的重新导向(例如,在一个实施方案中,在分支误预测或其他微架构异常的情况下)。在例示的实施方案中,lsu 42可以向获取地址生成电路14和解码/映射单元22提供刷新指示。另选地,可以向解码/映射单元22提供刷新指示,其可以在刷新点之后刷新op,并且向获取地址生成电路14提供重获取地址。
[0026]
如下文更详细论述的,lsu 42可被配置为执行加载/存储op,包括强制实施由处理器12实施的存储器排序模型。在一个实施方案中,处理器12可实施tso模型,或者可具有在其中实施tso的一个或多个模式以及在其中实施其他存储器排序模型的一个或多个其他模式(例如,由处理器12实施的isa的本地排序模型)。然而,处理器12可采用小于针对一些存储器操作的操作大小的原子性大小。例如,针对多个寄存器加载op,原子性大小可实施为寄存器大小。即,作为加载的目标的每个寄存器可以从单个源(例如,存储队列32中的存储,或dcache 16中的高速缓存行)获得由加载访问并写入该寄存器的每个字节。如果寄存器具有多于一个源,则可重试加载并且加载可等待直到先前存储已经从存储队列32中耗尽为止。在一个实施方案中,加载队列30可包括以下功能:在重试加载之前保持加载,直到存储队列32已经耗尽为止,或者直到被加载命中的存储已经耗尽为止。在其他实施方案中,可周期性地重试加载,直到成功地使寄存器源自单个源。因此,lsu 42可允许从存储队列转发针对操作大小的部分数据,只要每个寄存器从单个源(例如,存储队列32中的存储,或dcache 16中的高速缓存行)获得写入该寄存器的所有字节。
[0027]
在一些情况下,编译器已经使用多个寄存器加载来将逻辑上不同的加载融合到一个指令中。因此,每个加载依赖于不同的存储操作(并且通常,存储保持不同的指令,而不是被融合为多个寄存器存储指令)。在一个实施方案中,通过将原子性大小定义为寄存器大小,因此原子元素是作为多个寄存器加载的目标的寄存器,可在改进多个寄存器加载的性能的同时观察到正确的编程操作。
[0028]
在一个实施方案中,向量加载操作可以用比操作大小更小的原子性大小来实施。向量加载可访问向量的多个向量元素(例如,在给定向量寄存器中可具有多个向量元素)。向量寄存器可以是宽的,例如,128字节、256字节、512字节或更大。向量中的向量元素的数量取决于向量寄存器的大小和向量元素大小,该向量元素大小可以是一个字节、两个字节、四个字节等。在一个实施方案中,原子性大小可以是一个向量元素的大小。在另一实施方案中,原子性大小可以是多个向量元素,但少于向量寄存器中的所有向量元素。例如,向量寄存器中的给定原子元素可以是多个向量元素(诸如寄存器中的相邻的向量元素)。在又一实施方案中,类似于上述其他寄存器,向量寄存器可定义原子性大小。
[0029]
在一个实施方案中,多寄存器加载和向量加载两者均可以用小于操作大小的原子性大小来实施。在其他实施方案中,仅多个寄存器加载可实施小于操作大小的原子性大小。在另外的实施方案中,仅向量加载可实施小于操作大小的原子性大小。
[0030]
在此上下文中,操作大小可以指由存储器op访问的字节的总数。相比之下,原子性大小可以是原子地访问的字节的总数。即,原子访问要么在给定存储的所有字节中反映给定存储的效果,要么不反映给定存储的效果。满足原子性属性的一个要求是从单个源访问字节,如上所述。在一个实施方案中,原子性大小可以是大于一的整数,从而指定多个字节(由于字节可根据定义被原子地访问,因为字节是存储器的最小单元)。更具体地,加载/存
储操作的原子性大小可以是介于一个字节与操作大小之间的值。原子性大小可定义最小粒度,lsu 42可使用该最小粒度来确定tso和其他严格的存储器一致性模型所要求的单个源标准。允许在较大操作大小内存在多个原子单元可允许lsu 42针对每个原子单元具有不同的单个源,而不违反tso或其他严格的存储器一致性模型。操作大小可以是大于原子性大小的另一整数(并且可以是原子性大小的整数倍,并且更具体地是原子性大小的二的n次方倍)。
[0031]
如果针对加载检测到dcache未命中,则数据源实际上可以是另一级高速缓存或主存储器本身。在数据转发到目标加载寄存器的同时,dcache16可加载有该数据。对于这种情况,可以以与dcache命中相同的方式测量原子性。即使dcache 16未更新有数据(例如,对于不可高速缓存的访问),也可以以相同方式测量原子性。
[0032]
获取地址生成电路14可被配置为生成获取地址(获取pc)以从icache 18获取指令以供处理器12执行。获取地址生成电路14可实施各种预测结构以预测获取路径。例如,下一获取预测器可用于基于先前执行的指令来预测获取地址。在此类实施方案中,分支预测单元26可用于验证下一获取预测。另选地,如果不使用下一获取预测器,则分支预测单元26可用于预测下一获取地址。
[0033]
分支预测单元26可包括一个或多个分支预测器,诸如分支方向预测器、间接分支预测器和返回地址栈预测器。各种实施方案可包括上述分支预测器的任何子集和/或其他预测器。分支方向预测器可被配置为预测条件分支的采用/不采用结果。基于采用/不采用结果,下一获取地址可以是分支目标地址或下一顺序地址。目标地址可以是由分支指令(或更简要地说,分支)指定的地址,当采用分支时获取将被导向到该地址(或对于无条件分支,该目标地址是获取将始终被导向到的位置)。下一顺序地址可以是数字顺序在分支的pc之后的地址,并且如果不采用分支则可以是下一获取地址(类似于以相继顺序获取的非分支指令)。返回地址栈可基于先前调用指令来预测针对返回指令的获取地址。调用和返回指令可例如用于调用子例程/函数和从中返回等。调用指令可将返回地址推到栈中(例如,在调用之后推到下一顺序指令),并且返回指令可使栈的顶部弹出以生成返回地址。栈可在存储器中,或可经由被调用指令写入且被返回指令读取的寄存器来模拟。间接分支预测器可预测间接分支指令的目标地址。在一个实施方案中,间接分支预测器可以是具有多个存储器的标记几何(tage)型分支预测器。基本存储器可由pc或pc的散列来编索引,并且其他存储器可由通过不同的分支历史量散列的pc来编索引。基本存储器可以不被标记,但是其他存储器可以被标记。如果在其他存储器中的一个或多个存储器中检测到标记命中,则可预测分支目标地址为来自用最大历史量编索引并且也是针对分支的标记命中的存储器的目标地址。如果未检测到标记命中,则可预测分支目标地址为来自基本存储器的目标地址。其他实施方案可实施其他类型的间接分支预测器。例如,可使用由分支pc和分支历史编索引,或者简单地由分支pc编索引的单个表。可使用单个标记表。
[0034]
解码/映射单元22可被配置为将从icache 18获取的指令解码成指令操作。在一些实施方案中,可以将给定指令解码成一个或多个指令操作,这取决于指令的复杂度。在一些实施方案中,特别复杂的指令可以是微编码的。在此类实施方案中,针对指令的微编码例程可以在指令操作中编码。在其他实施方案中,可以将由处理器12实施的指令集架构中的每个指令解码成单个指令操作,因此指令操作可实质上与指令同义(尽管其可由解码器进行
形式修改)。术语“指令操作”在本文中可更简要地称为“op”。
[0035]
解码/映射单元22可被配置为将op映射到推测资源(例如,物理寄存器)以允许乱序和/或推测执行,并且可以将op分派到保留站24a-24n。op可以从在对应指令中使用的架构寄存器映射到寄存器文件30中的物理寄存器。即,寄存器文件30可实施一组物理寄存器,其数量可大于由处理器12实施的指令集架构所指定的架构寄存器。解码/映射单元22可管理架构寄存器到物理寄存器的映射。在一个实施方案中,对于不同的操作数类型(例如,整数、向量、浮点等),可存在单独的物理寄存器。在其他实施方案中,物理寄存器可在操作数类型中共享。解码/映射单元22还可负责跟踪推测执行和退出op或刷新错误推测的op。例如,rob 20可用于跟踪op的程序顺序并管理退出/刷新。
[0036]
当针对op的源操作数就绪时,可调度op以供执行。在例示的实施方案中,分散调度用于执行单元28a-28b中的每一者和lsu 42,例如在保留站24a-24n中。如果需要,其他实施方案可实施集中式调度器。调度的op可以从寄存器文件30读取它们的源操作数并且/或者可具有从由执行单元28a-28b和/或lsu 42执行的先前op转发的操作数。具有目标寄存器的op的结果可以被写入寄存器文件30和/或被转发到相关op。
[0037]
lsu 42可被配置为执行加载/存储存储器op。一般来讲,存储器操作(存储器op)可为指定对存储器的访问的指令操作(尽管存储器访问可在高速缓存诸如数据高速缓存16中完成)。加载存储器操作可指定从存储器位置到寄存器的数据传送,而存储存储器操作可指定从寄存器到存储器位置的数据传送。加载存储器操作可被称为加载存储器op、加载op或加载;并且存储存储器操作可被称为存储存储器op、存储op或存储。在一个实施方案中,存储op可执行为存储地址op和存储数据op。存储地址op可被定义为生成存储的地址,探测高速缓存的初始命中/未命中确定,并且利用地址和高速缓存信息来更新存储队列32。因此,存储地址op可以将地址操作数作为源操作数。存储数据op可被定义为将存储数据递送到存储队列。因此,存储数据op可以不将地址操作数作为源操作数,而是可以将存储数据操作数作为源操作数。在许多情况下,存储的地址操作数可以在存储数据操作数之前可用,因此地址可以比存储数据更早地得到确定并变得可用。在一些实施方案中,例如如果在存储地址操作数中的一个或多个操作数之前提供存储数据操作数,则存储数据op有可能在对应的存储地址op之前执行。尽管在一些实施方案中存储操作可执行为存储地址op和存储数据op,但其他实施方案可能不实施存储地址/存储数据拆分。
[0038]
lsu 42中的执行电路34可执行由保留站24n发起的加载/存储op。执行电路34可访问数据高速缓存16以确定加载/存储op的命中/未命中,并且转发用于加载的数据。执行电路34可针对正在执行的加载的排序问题检查存储队列32,并且针对比存储队列32中的一个或多个存储更新并且与存储队列32中的存储的地址匹配的加载从该一个或多个存储转发数据。类似地,执行电路34可检查加载队列30以检测正在执行的存储的排序问题。当检测到排序问题时,如果正在执行的op是需要比队列30-32中的一者中的op更迟完成的op,则可使用op的内部重试对op进行正确地排序。如果队列30-32中的op需要比正在执行的op更晚完成,则经常需要刷新(例如,如果加载已经转发数据并且处于加载队列30中,并且更旧的存储执行并更新相同数据或数据的一部分,则错误数据已经被转发)。
[0039]
存储队列32可以对已经被执行(例如,探测过高速缓存)并且正在等待提交到数据高速缓存(例如,在各种实施方案中,一旦给定存储op退出,或者准备退出)的存储op进行排
队。lsu 42/执行电路34可针对更新的加载op从存储队列32转发数据。在存储具有与加载地址匹配的地址但是不具有可用数据的情况下,lsu 42/执行电路34可基于存储队列32匹配来重试加载并等待存储数据变得可用。存储队列32还可用于检测加载的排序问题。
[0040]
类似地,加载队列30可以对已经被执行的加载op进行排队。加载队列30可包括已经被重试并且将尽可能快地或者在与检测到重试的原因相关的后续事件发生之后再次执行的加载op。lsu 42还可使用加载队列30来检测存储的排序问题,使得可刷新已经完成(例如,不可逆地将数据转发到目标)并且具有排序问题的加载。使用加载队列30和存储队列32检测到的排序问题可包括存储器排序模型问题和/或与在由处理器12执行的同一线程或代码序列中由加载op读取并由存储op写入的存储器位置的一致性相关的问题。
[0041]
在各种实施方案中,执行单元28a-28b可包括任何类型的执行单元。例如,执行单元28a-28b可包括整数、浮点和/或向量执行单元。整数执行单元可被配置为执行整数op。通常,整数op是对整数操作数执行定义的操作(例如,算术、逻辑、移位/旋转等)的op。整数可以是数值,其中每个值对应于数学整数。整数执行单元可包括用于处理分支op的分支处理硬件,或者可存在单独的分支执行单元。
[0042]
浮点执行单元可被配置为执行浮点op。一般来讲,浮点op可以是已被定义为对浮点操作数进行操作的op。浮点操作数是被表示为尾数(或有效位数)乘以底数的指数次方的操作数。指数、操作数的符号和尾数/有效位数可以在操作数中显式地表示,并且底数(例如,在一个实施方案中,底数2)可以是隐式的。
[0043]
向量执行单元可被配置为执行向量op。向量处理的特征在于对大量数据执行相同的处理,其中每个数据是相对小的值(例如,8位或16位,与整数的32位至64位相比)。因此,向量op通常包括对表示多个数据项的操作数进行的单指令多数据(simd)或向量操作。
[0044]
因此,每个执行单元28a-28b可包括被配置为执行如下操作的硬件:被定义为限定特定执行单元来处理的op的操作。在每个执行单元可被配置为对为该执行单元发起而与其他执行单元无关的op进行操作的意义上,执行单元通常可彼此独立。以另一角度来看,每个执行单元可以是用于执行op的独立管道。不同的执行单元可具有不同的执行延迟(例如,不同的管道长度)。另外,在发生旁路的管线级处,不同的执行单元可具有不同的延迟,因此发生相关op的推测调度的时钟循环可基于op和将执行该op的执行单元28的类型而变化。
[0045]
应当注意,在各种实施方案(包括具有一个执行单元的实施方案和具有多个执行单元的实施方案)中可包括任何数量和类型的执行单元28a-28b。
[0046]
高速缓存行可以是高速缓存中的分配/解除分配单元。也就是说,高速缓存行内的数据可作为一个单元在高速缓存中分配/解除分配。高速缓存行的大小可变化(例如,32字节、64字节、128字节,或者更大或更小的高速缓存行)。不同的高速缓存可具有不同的高速缓存行大小。icache 18和dcache 16可各自为具有任何期望容量、高速缓存行大小和配置的高速缓存。在各种实施方案中,在dcache 16/icache 18与主存储器之间可存在更多附加级高速缓存。
[0047]
在各个点处,op被称为比其他op更新或更旧。如果第一操作按程序顺序在第二操作之后,则第一操作可比第二操作更新。类似地,如果第一操作按程序顺序先于第二操作,则第一操作可比第二操作更旧。
[0048]
现在转到图2,示出了例示针对一个实施方案的解耦的操作大小和原子性大小的
框图。在图2的顶部处,示出了加载对指令(ldp)(附图标号50)。加载对指令具有寄存器目标xa及xb,并且一个或多个源操作数指定由加载对指令读取的存储器地址(例如,该示例中的地址a)。因此,加载对指令的操作大小(图2中的opsize 52)是寄存器宽度的两倍。另一方面,对于该示例,原子性大小可以是寄存器宽度,因此在地址a处的数据中存在两个原子元素54a-54b。xa和xb不需要为寄存器文件中的相邻寄存器(例如,加载对指令可支持分别为xa和xb指定寄存器地址)。在一个实施方案中,其他多个寄存器加载指令可支持多于两个寄存器目标,因此可具有多于两个原子元素。
[0049]
图2中还示出了向量加载指令(ldvec,附图标号56)。向量加载指令具有目标向量寄存器va,并且向量寄存器的宽度是操作大小(图2中的opsize 58)。在该示例中,向量元素大小可以是原子性大小,因此每个向量元素可以是原子元素(附图标号60a-60n)。另选地,多个相邻的向量元素可以是原子元素。例如,在图2的底部处,两个相邻的向量元素是原子元素(附图标号62a-62m)。其他实施方案可以将其他数量的相邻的向量元素作为原子元素。
[0050]
图3是示出lsu 42的一个实施方案(并且在一个实施方案中,更具体地为执行电路34)用于执行加载的操作的流程图。然而,为了便于理解,框图以特定顺序示出,也可使用其他顺序。框可在lsu 42/执行电路34内的组合式逻辑电路中并行执行。框、框的组合和/或流程图作为一个整体可在多个时钟周期内为流水线式的。lsu 42/执行电路34可被配置为实施图3中所示的操作。
[0051]
如果加载具有大于原子性大小的操作大小(决策框70,“是”分支),则lsu 42可尝试加载并确定(操作内的多个原子元素中的)每个原子元素是否从单个源接收到其字节(决策框72)。不同的原子元素可以从不同的源获得其字节,只要每个原子元素具有单个源。如果每个原子元素从一个源获得其字节(决策框72,“是”分支),则lsu 42可完成加载op(框74)。完成加载操作可包括将结果转发到加载的目标寄存器并且将状态报告给rob 20以进行最终退出。如果至少一个原子元素针对其字节具有多个源(决策框72,“否”分支),则lsu 42可阻止完成(例如,重试加载)(框76)。可以在稍后时间重新尝试加载(例如,来自加载队列30的重新发起)。在一个实施方案中,lsu 42可以用其部分(但不是全部)字节所依赖的存储来标记重试的加载,以控制何时执行重新发起。在另一实施方案中,lsu 42可周期性地重新发起加载,直到其成功完成为止。另一方面,如果加载具有等于原子性大小的操作大小(决策框70,“否”分支),则lsu 42可确定操作大小的所有字节是否具有单个源(决策框78)。如果是(决策框78,“是”分支),则lsu 42可完成加载op(框72)。如果否(决策框78,“否”分支),则lsu 42可阻止完成(框76)。在一个实施方案中,tso(或更严格的排序模型)可以在处理器12的一个或多个模式中实施,并且更宽松的排序模型可以在其他模式中实施。在此类实施方案中,基于实施更严格的排序模型的模式是活动的,决策框70和72可以是有条件的。
[0052]
虽然多个寄存器加载和/或向量加载可具有比操作大小更小的原子性大小,但存储器排序模型仍可要求原子元素表现为已经被依序读取。例如,在多个寄存器加载情况下,指令中的第一列寄存器(例如,xa)需要表现为与指令中的第二列寄存器(例如,xb)同时被读取或在后者之前已经被读取。因此,如果例如从不同的高速缓存行或不同的存储读取寄存器,并且在完成多寄存器加载之前丢失了底层高速缓存行中的一个或多个行,则可能无法保证排序。
[0053]
图4示出了两个示例。在图4的顶部处,加载对指令的两个原子元素都在同一高速
缓存行(包括地址a的高速缓存行,附图标号80)中。因此,加载对指令的原子元素表现为同时完成,因此依序完成。另一方面,在附图标号82处,从含有地址a的高速缓存行读取原子元素中的一者(寄存器xa)并且从下一连续高速缓存行(标记为a 1)读取原子元素中的另一者(寄存器xb)。如果包括xa的高速缓存行失效(例如,由于另一处理器或其他相干代理进行的存储),则可以观察到xa和xb的顺序为xb在xa之前,这不符合tso模型。因此,在一个实施方案中,处理器12可包括用于检查这些条件并确保正确操作的电路。
[0054]
图5是示出lsu 42的一个实施方案(并且在一个实施方案中,更具体地为执行电路34)用于确保具有多个原子元素的加载的排序的操作的流程图。然而,为了便于理解,框图以特定顺序示出,也可使用其他顺序。框可在lsu 42/执行电路34内的组合式逻辑电路中并行执行。框、框的组合和/或流程图作为一个整体可在多个时钟周期内为流水线式的。lsu 42/执行电路34可被配置为实施图5中所示的操作。
[0055]
如果由加载访问的操作大小和地址导致跨高速缓存行边界(因此加载的一个或多个原子元素可存在于一个高速缓存行中而其他原子元素存在于不同的高速缓存行中)(决策框84,“是”分支),则lsu 42可监视高速缓存行并且确保维持高速缓存行之间的排序,使得第一高速缓存行在第二高速缓存行之前被访问(例如,当第二高速缓存行保持在高速缓存中时第一高速缓存行不失效)。如果未维持排序(决策框88,“否”分支),则lsu 42可刷新加载op和相关op,该加载op和相关op可以被重新获取并被重新执行(框90)。如果维持排序(决策框88,“是”分支),则op可保持完成并且可退出(框92)。
[0056]
在一些实施方案中,处理器12可通过将加载指令解码/微编码成执行加载指令的部分的多个加载op,从而简化更复杂的加载指令。例如,可以将宽向量加载指令(诸如如上所述的加载指令)微编码为多个更小的加载,使得处理器中的数据路径不需要与向量寄存器一样宽。多个加载op仍可利用操作大小和原子性大小的解耦,如果这适用于更小的加载的大小的话。然而另外,多个加载op可能需要表现为依序执行以符合tso模型。实施排序的一种方式将是依序执行对应于复杂加载指令的加载op。然而,此类具体实施将涉及附加硬件并且将招致性能损失,该附加硬件用于检测加载op根据同一加载指令微编码并且确保加载op保持有序,在乱序执行在观察者看起来似乎是有序的情况下所述性能损失是不必要的。如果微编码序列中更新的加载由于排序问题而导致序列中更旧的加载被刷新,并且刷新重复进行(例如,由于另一处理器在相同的地址上被活锁),则可能发生的另一问题是活锁。
[0057]
在一个实施方案中,处理器12(并且更具体地,lsu 42)可被配置为允许根据同一加载指令微编码的加载op乱序执行。如果在执行加载op之后遇到排序问题,则lsu 42可刷新加载op,并且rob 20可检测加载op是微编码序列的一部分。如果加载靠近rob 20的头部,则可能发生刷新(除了活锁情况之外)的原因的数量减少。使用靠近rob的头部作为启发法,rob 20可发信号通知重新获取的加载指令(及其微编码加载op)将依序执行。加载op可对lsu 42标记为依序,lsu可强制加载op的依序执行。可避免进一步的刷新。
[0058]
图6是示出lsu 42和解码/映射单元22(其包括rob 20)的一个实施方案的框图。当需要刷新加载(附图标号100)时,lsu 42可发信号通知解码/映射单元22。例如,lsu 42可以向rob 20提供与正在刷新的加载相关联的重排序缓冲器标记(flush_load_rob_tag)。rob 20可刷新加载和任何后续op,并且可使得这些op被获取地址生成电路14重新获取。各种推
测状态也恢复到刷新点。
[0059]
rob 20可接收重排序缓冲器标记,执行刷新,并且引起推测状态恢复。另外,如果重排序缓冲器标记识别出靠近rob 20的头部的条目(其中rob 20的头部是rob 20中表示的最旧的指令),则rob 20可以发信号通知加载指令应当依序执行(图6中的in_order_load,附图标号102)。如果条目在rob 20的头部的阈值数量个条目(例如,n个条目,其中n是大于一的整数)内,则该条目可能靠近头部。在各种实施方案中,条目的数量(“n”)可以是在rob 20中可编程的,或可以是在硬件中固定的。也可以以其他方式指定条目的数量(例如,条目的百分比)。
[0060]
可以向解码/映射单元22中的其他电路提供in_order_load指示。例如,在加载指令被获取地址生成电路14从icache 18重新获取时,解码器可接收已经刷新的加载指令。解码器可以将加载指令解码成两个或更多个微编码加载op,并且可以用in_order_load指示来标记加载op以强制加载op依序执行。例如,保留站24n可使用该指示来阻止发起加载,直到它们在保留站24n中最旧为止。
[0061]
图7是示出了解码/映射单元22的一个实施方案用于将加载标记为依序执行的操作的流程图。然而,为了便于理解,框图以特定顺序示出,也可使用其他顺序。框可在解码/映射单元22内的组合式逻辑电路中并行执行。框、框的组合和/或流程图作为一个整体可在多个时钟周期内为流水线式的。解码/映射单元22可被配置为实施图7中所示的操作。
[0062]
如果lsu 42发起针对加载op的刷新(决策框104,“是”分支),并且加载op在rob 20的头部的n个条目内(决策框106,“是”分支),则解码/映射单元22可被配置为将根据重新获取加载指令生成的加载op标记为依序执行(框108)。如果lsu 42发起针对加载op的刷新(决策框104,“是”分支),并且加载op不在rob 20的头部的n个条目内(决策框106,“否”分支),则解码/映射单元22可被配置为不将根据重新获取加载指令生成的加载op标记为依序执行(框110)。即,加载op可乱序执行。如果lsu 42不发起针对加载op的刷新(决策框104,“否”分支),则解码/映射单元22的操作照常继续。如先前所提及的,在各种实施方案中,n可以是大于一的整数并且可以是固定的或可编程的。
[0063]
系统
[0064]
接下来转向图8,其示出了系统150的一个实施方案的框图。在例示的实施方案中,系统150包括耦接到一个或多个外围设备154和外部存储器158的片上系统(soc)152的至少一个示例。提供了电源156,其向soc 152供应供电电压以及向存储器158和/或外围设备154供应一个或多个供电电压。在一些实施方案中,可包括soc 152的多于一个实例(并且也可包括多于一个存储器158)。soc 152可包括如图1所示的处理器12的一个或多个实例。
[0065]
根据系统150的类型,外围设备154可包括任何期望的电路。例如,在一个实施方案中,系统150可为移动设备(例如个人数字助理(pda)、智能电话等),并且外围设备154可包括用于各种类型的无线通信的设备,诸如wifi、蓝牙、蜂窝、全球定位系统等。外围设备154还可包括附加的存储装置,该附加的存储装置包括ram存储装置、固态存储装置或磁盘存储装置。外围设备154可包括用户界面设备,诸如显示屏,其包括触摸显示屏或多触摸显示屏、键盘或其他输入设备、麦克风、扬声器等。在其他实施方案中,系统150可为任何类型的计算系统(例如,台式个人计算机、膝上型电脑、工作站、网络机顶盒等)。
[0066]
外部存储器158可包括任何类型的存储器。例如,外部存储器158可为sram、动态
ram(dram)(诸如同步dram(sdram))、双倍数据速率(ddr、ddr2、ddr3等)sdram、rambus dram、低功率版本的ddr dram(例如lpddr、mddr等)等等。外部存储器158可包括存储器设备可被安装到的一个或多个存储器模块,诸如单列直插内存模块(simm)、双列直插内存模块(dimm)等。另选地,外部存储器158可包括以芯片上芯片或封装上封装具体实施被安装在soc 152上的一个或多个存储器设备。
[0067]
计算机可读存储介质
[0068]
现在转向图9,其示出了计算机可读存储介质200的一个实施方案的框图。一般来讲,计算机可访问存储介质可包括在使用期间能够被计算机访问以向计算机提供指令和/或数据的任何存储介质。例如,计算机可访问存储介质可包括诸如磁性或光学介质的存储介质,例如,盘(固定或可拆卸)、带、cd-rom、dvd-rom、cd-r、cd-rw、dvd-r、dvd-rw或蓝光。存储介质还可包括易失性或非易失性存储器介质,诸如ram(例如,同步动态ram(sdram)、rambus dram(rdram)、静态ram(sram)等)、rom或闪存存储器。存储介质可被物理地包括在存储介质将指令/数据提供至其的计算机内。另选地,存储介质可连接至计算机。例如,存储介质可通过网络或无线链路诸如网络附接存储装置而被连接至计算机。存储介质可通过外围接口诸如通用串行总线(usb)而被连接。通常,计算机可访问存储介质200可以非暂态方式存储数据,其中非暂态在该上下文中可指不通过信号传输指令/数据。例如,非暂态存储装置可为易失性的(并且响应于断电而可能会丢失所存储的指令/数据)或为非易失性的。
[0069]
图9中的计算机可访问存储介质200可存储代表soc 152的数据库204。通常,数据库204可以是可以由程序读取并且直接或间接使用以制造包括soc 152的硬件的数据库。例如,数据库可以是诸如verilog或vhdl的高级设计语言(hdl)中硬件功能的行为级别描述或寄存器传送级别(rtl)描述。可通过合成工具读取该描述,合成工具可合成该描述以产生包括来自合成库的门电路列表的网表。网表包括一组门电路,其还表示包括soc 152的硬件的功能。然后可放置并路由网表,以产生用于描述要应用到掩模的几何形状的数据集。然后可以在各种半导体制造步骤中使用掩模以产生对应于soc 152的半导体电路。另选地,根据需要,计算机可访问存储介质200上的数据库204可以是网表(具有或不具有合成库)或数据集。
[0070]
虽然计算机可访问存储介质200存储soc 152的表示,但是其他实施方案可根据需要承载soc 152的任何部分的表示,包括处理器12、处理器12的任何子集或其部分等。数据库204可表示上述任何部分。
[0071]
根据以上描述,在一个实施方案中,处理器可包括数据高速缓存和加载/存储单元,该加载/存储单元耦接到该数据高速缓存并且被配置为执行存储器操作。加载/存储单元包括存储队列,该存储队列被配置为对已经被执行并且正在等待提交到数据高速缓存的一个或多个存储存储器操作进行排队。加载/存储单元被配置为在加载存储器操作的执行期间访问存储队列和数据高速缓存,其中加载存储器操作具有指定由加载存储器操作读取的数据量的操作大小。加载/存储单元实施符合由处理器采用的存储器排序模型的原子性大小。原子性大小小于针对加载存储器操作的操作大小。在一个实施方案中,操作大小可以是原子性大小的整数倍。在一个实施方案中,由加载存储器操作读取的数据包括具有原子性大小的多个原子元素,并且当从多个源中的单个源读取多个原子元素中的每个原子元素时,加载存储器操作的执行符合存储器排序模型。在一个实施方案中,数据高速缓存中的高
速缓存行是多个源中的一个源。在一个实施方案中,加载/存储单元被配置为确保响应于加载存储器操作从多个高速缓存行接收到字节而对多个原子元素进行排序。在一个实施方案中,存储队列中的第一存储存储器操作是多个源中的一个源。在一个实施方案中,加载存储器操作将多个寄存器作为目标。原子性大小可以是寄存器的大小,并且给定原子元素可包括被写入多个寄存器中的给定寄存器中的字节。在一个实施方案中,加载存储器操作是向量加载存储器操作,并且原子性大小基于由加载存储器操作读取的向量中的向量元素的向量元素大小。在一个实施方案中,原子性大小是向量元素大小,并且多个原子元素是向量元素。在一个实施方案中,原子性大小是向量元素大小的倍数,并且多个原子元素中的给定原子元素是多个相邻的向量元素。在一个实施方案中,处理器进一步包括重排序缓冲器。加载存储器操作可以是对应于加载指令的多个加载存储器操作中的一个加载存储器操作,并且加载/存储单元被配置为在检测到排序违反的情况下发信号通知加载存储器操作的刷新。重排序缓冲器可被配置为当发信号通知刷新时响应于检测到加载存储器操作在重排序缓冲器的头部的阈值数量个条目内而强制多个加载存储器操作的依序执行。
[0072]
在一个实施方案中,加载/存储单元包括存储队列和耦接到存储队列的执行电路,该存储队列被配置为对将数据写入一个或多个存储器位置的一个或多个存储存储器操作进行排队。执行电路被配置为执行加载存储器操作并且被配置为检测加载存储器操作读取由在存储队列中表示的第一存储存储器操作写入的至少一个字节。加载存储器操作将多个寄存器作为在加载存储器操作的执行期间读取的数据的目标,并且执行电路被配置为在以下情况下允许针对加载存储器操作从存储队列中的第一存储存储器操作转发数据:来自存储队列的数据是针对加载存储器操作的部分数据且针对加载存储器操作的剩余数据源自与第一存储存储器操作不同的源,只要多个寄存器中的每个寄存器从单个源获得完整数据集。在一个实施方案中,不同的源是耦接到加载/存储单元的数据高速缓存。在一个实施方案中,执行电路被配置为执行向量加载存储器操作以加载具有多个向量元素的向量。执行电路被配置为允许从存储队列转发向量元素,只要每个向量元素从单个源获得完整数据集。执行电路被配置为执行向量加载存储器操作以加载具有多个向量元素的向量,其中多个向量元素包括多个原子元素,并且其中原子元素中的每个原子元素包括多个向量元素内的多个相邻的向量元素,其中执行电路被配置为允许从存储队列转发多个原子元素中的给定原子元素,只要多个原子元素中的每个原子元素从单个源获得完整数据集。在一个实施方案中,如果多个寄存器中的至少一个寄存器没有从单个源接收到完整数据集,则执行电路被配置为暂停加载存储器操作,直到存储队列清空为止。
[0073]
在一个实施方案中,一种方法包括:执行具有操作大小的加载存储器操作;验证具有所述操作大小的数据内的多个原子元素中的每个原子元素完全源自存储队列中的存储存储器操作或完全源自不同的源;以及响应于验证而允许从存储队列转发。在一个实施方案中,方法进一步包括执行具有操作大小的第二加载存储器操作;检测具有操作大小的数据内的多个原子元素中的至少一个原子元素并非完全源自存储队列中的存储存储器操作或并非完全源自不同的源,但是多个原子元素中的至少一个原子元素源自存储队列;以及阻止完成第二加载存储器操作的完成。在一个实施方案中,阻止继续,直到存储队列清空为止。在一个实施方案中,多个原子元素对应于作为加载存储器操作的目标的多个寄存器。
[0074]
一旦充分了解了上面的公开,许多变型和修改对于本领域的技术人员而言将变得
显而易见。本公开旨在使以下权利要求书被阐释为包含所有此类变型和修改。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献