CN103353834A - 对零谓词分支误预测的分支误预测行为抑制 - Google Patents
对零谓词分支误预测的分支误预测行为抑制 Download PDFInfo
- Publication number
- CN103353834A CN103353834A CN2013101752788A CN201310175278A CN103353834A CN 103353834 A CN103353834 A CN 103353834A CN 2013101752788 A CN2013101752788 A CN 2013101752788A CN 201310175278 A CN201310175278 A CN 201310175278A CN 103353834 A CN103353834 A CN 103353834A
- Authority
- CN
- China
- Prior art keywords
- vector
- instruction
- predicate
- flow control
- misprediction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 230000001629 suppression Effects 0.000 title 1
- 239000013598 vector Substances 0.000 claims abstract description 262
- 238000000034 method Methods 0.000 claims abstract description 32
- 230000004044 response Effects 0.000 claims abstract description 28
- GOLXNESZZPUPJE-UHFFFAOYSA-N spiromesifen Chemical compound CC1=CC(C)=CC(C)=C1C(C(O1)=O)=C(OC(=O)CC(C)(C)C)C11CCCC1 GOLXNESZZPUPJE-UHFFFAOYSA-N 0.000 claims description 16
- 238000012423 maintenance Methods 0.000 claims description 4
- 230000008672 reprogramming Effects 0.000 claims description 3
- 230000004087 circulation Effects 0.000 description 45
- 238000013139 quantization Methods 0.000 description 20
- 238000003860 storage Methods 0.000 description 20
- 230000006399 behavior Effects 0.000 description 15
- 238000010586 diagram Methods 0.000 description 14
- 238000012545 processing Methods 0.000 description 14
- 230000008569 process Effects 0.000 description 11
- 230000008859 change Effects 0.000 description 9
- 238000005192 partition Methods 0.000 description 7
- 230000003068 static effect Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 5
- 238000007667 floating Methods 0.000 description 5
- 230000005055 memory storage Effects 0.000 description 5
- 230000000694 effects Effects 0.000 description 4
- 238000004458 analytical method Methods 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 3
- 239000011159 matrix material Substances 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000000712 assembly Effects 0.000 description 2
- 238000000429 assembly Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000009792 diffusion process Methods 0.000 description 2
- 238000006073 displacement reaction Methods 0.000 description 2
- 230000005764 inhibitory process Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- OCKGFTQIICXDQW-ZEQRLZLVSA-N 5-[(1r)-1-hydroxy-2-[4-[(2r)-2-hydroxy-2-(4-methyl-1-oxo-3h-2-benzofuran-5-yl)ethyl]piperazin-1-yl]ethyl]-4-methyl-3h-2-benzofuran-1-one Chemical compound C1=C2C(=O)OCC2=C(C)C([C@@H](O)CN2CCN(CC2)C[C@H](O)C2=CC=C3C(=O)OCC3=C2C)=C1 OCKGFTQIICXDQW-ZEQRLZLVSA-N 0.000 description 1
- 238000010009 beating Methods 0.000 description 1
- 230000033228 biological regulation Effects 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000002612 cardiopulmonary effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000000354 decomposition reaction Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000003179 granulation Effects 0.000 description 1
- 238000005469 granulation Methods 0.000 description 1
- 230000000873 masking effect Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000008707 rearrangement Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30072—Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/28—Error detection; Error correction; Monitoring by checking the correct order of processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30058—Conditional branch instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
- G06F9/3861—Recovery, e.g. branch miss-prediction, exception handling
Abstract
本发明涉及一种用于抑制分支误预测行为的方法和系统,其中使得控制流响应于确定谓词矢量为空而转向指令周围的分支的条件分支指令被预测为不被采用。然而,响应于检测到该预测是不正确的,禁止误预测行为。
Description
技术领域
本发明公开涉及处理器,尤其是,涉及在所断定分支指令(predicated branchinstruction)的分支误预测期间的矢量指令执行。
背景技术
在大多数现代处理器中分支预测已经变得很常见。当后向分支是可以高度预测的时,依赖于正在处理的数据的性质,前向分支可以或者不可以被很好地预测。
在执行计算时,处理矢量指令的一些处理器使用掩蔽断定(maskingpredication)来控制是否修改矢量中的元素或保持它们的值不被修改。尤其是,谓词矢量(predicate vector)可以控制是否修改矢量的各个元素。在一些情况下,在该谓词矢量包含全零时,分支指令可以用于该所断定指令周围的分支。在该分支被准确地预测的情况下,这通常可以改进功率和性能。
在常规矢量处理器中,当分支被误预测时,处理器管道(processor pipeline)通常可以被刷新(flush),并且新指令从诸如分支目标地址的不同地址被取出。然而,这种类型的常规分支误预测行为可能是不必要的和浪费的。
发明内容
公开了用于抑制分支误预测行为的方法的各种实施例。一般来说,设想了一种方法,其中使得控制流响应于确定谓词矢量为空(null)而转向指令周围的分支的条件分支指令被预测为不被采用。然而,响应于检测到该预测不正确,禁止误预测行为。
在一实施例中,所述方法包括生成预测程序指令执行的控制流没有响应于条件流控制指令的执行而被改变的预测。所述条件流控制指令响应于确定谓词矢量的一个或多个元素中的每一个都为空而改变所述控制流。此外,所述方法还可以包括检测所述预测是不正确的,并且响应于检测到所述预测是不正确的而禁止误预测行为。
在一特定实现中,禁止该误预测行为可以包括执行落入在该条件流控制指令的误预测路径(mispredicted path)中的程序指令。
在另一特定实现中,禁止该误预测行为可以包括禁止从处理器的执行管道刷新在流控制指令和指令目标之间的按程序顺序的程序指令。
附图说明
图1是计算机系统的一个实施例的框图。
图2是图解图1所示的处理器的一个实施例的附加细节的框图。
图3是图解程序代码循环的示例并行化的图。
图4A是图解例子1中所示的循环的标量执行期间各种状态序列的图。
图4B是图解例子1的循环的宏标量矢量化程序代码的执行进展(progression)的图。
图5A和图5B是图解程序源代码的矢量化的一个实施例的图。
图6A是图解非推测性矢量化程序代码的一个实施例的图。
图6B是图解推测性矢量化程序代码的另一个实施例的图。
图7是描绘在所断定分支指令的分支误预测期间图2的处理器的一个实施例的操作的流程图。
特定实施例通过附图中的例子被示出并且将在这里详细地描述。然而,可以理解的是,附图和详细描述并非意图将权利要求限制到所公开的特定实施例,即使在这里针对特定特征仅仅描述了单个实施例也是如此。相反,意图要覆盖对受益于本公开的本领域技术人员显而易见的所有改变、等同和替换。除非另有说明,在本公开中提供的特征的示例意图是说明性的而非限制性的。
如在整个本申请中使用的那样,词“可以”是在允许的意义下(即,意味着有可能)使用的,而不是在强制的意义下(即,意味着必须)使用的。相似地,词“包括”、“包含”意味着包括但不限制于此。
各种单元、电路、或其他组件可以被描述为“被配置成”执行一个或多个任务。在这种背景下,“被配置成”是通常意味着“具有在操作期间执行该一个或多个任务的电路”的结构的广义记载。同样地,该单元/电路/组件能够被被配置成执行该任务,即使在该单元/电路/组件当前并不存在时也是如此。一般来说,形成对应于“被配置成”的结构的电路可以包括硬件电路。类似地,为了便于描述,各种单元/电路/组件可以被描述为执行一个或多个任务。这种描述应被解释为包括短语“被配置成”。记载被配置成执行一个或者多个任务的单元/电路/组件明显不是要调用35U.S.C.§112第6段对于该单元/电路/组件的解释。
本公开的范围包括这里公开(明确地或者隐含地)的任意特征或各特征的组合,或其任何概括,不论其是否减轻本文所要解决的任意或所有问题。因此,新权利要求可以在本申请(或者要求了其优先权的申请)的审查进行期间整理成为特征的任意这种组合。具体地,参考所附权利要求,来自从属权利要求的特征可以与独立权利要求的特征组合,并且可以以任意恰当的方式,而不仅仅是以在所附权利要求中列举的特定组合,来组合来自各个独立权利要求的特征。
具体实施方式
计算机系统概述
现在转向图1,示出了计算机系统一个实施例的框图。计算机系统100包括处理器102、二级(L2)高速缓存106、存储器108、以及海量存储装置110。如图所示,处理器102包括一级(L1)高速缓存104。值得注意的是虽然在计算机系统100中显示并描述了特定组件,但是在可替换实施例中,在计算机系统100中可以存在不同组件以及不同数量的组件。例如,计算机系统100可以不包含一些存储器分级体系(例如,存储器108和/或海量存储装置110)。可替换地,虽然L2高速缓存106被图示在处理器102外部,但是设想了在其他实施例中,L2高速缓存106可以在处理器102内部。进一步注意到:在这样的实施例中,可以使用三级(L3)高速缓存(未图示)。此外,计算机系统100可以包含图形处理器、视频卡、视频捕获装置、用户接口装置、网卡、光驱动器和/或使用总线、网络、或其他合适的通信渠道(为了简化都未示出)耦合至处理器102的其他外围装置。
在各种实施例中,处理器102可以是执行计算操作的通用处理器的代表。例如,处理器102可以为中央处理单元(CPU),诸如微处理器、微控制器、专用集成电路(ASIC)、或现场可编程门阵列(FPGA)。然而,如下面进一步描述的,处理器102可以包含一个或者多个用于矢量处理的机构(例如,矢量执行单元)。处理器102的示例矢量执行单元结合图2的描述在下面将被更加详细地描述。
海量存储装置110、存储器108、L2高速缓存106与L1高速缓存104为存储装置,其一起形成了存储处理器102的数据和指令的存储器分级体系。更具体地,海量存储装置110可以是高容量、非易失性存储器,诸如磁盘驱动器或具有长存取时间的大闪存单元,同时L1高速缓存104、L2高速缓存106以及存储器108可以较小,具有较短的存取时间。这些较快的半导体存储器存储频繁使用的数据的副本。存储器108可以是存储装置的动态随机存取存储器(DRAM)族中的存储装置的代表。存储器108的大小通常大于L1高速缓存104和L2高速缓存106,而L1高速缓存104和L2高速缓存106通常使用存储装置的静态随机存取存储器(SRAM)族中的较小装置来实现。在一些实施例中,L2高速缓存106、存储器108以及海量存储装置110在计算机系统100中的一个或者多个处理器之间共享。
在一些实施例中,存储器分级体系中的装置(即,L1高速缓存104等)能够每个周期存取(即,读和/或写)多个高速缓存线。这些实施例能够更加有效地处理基于到非连续存储器地址的指针或数组索引的矢量进行的存储器存取。
值得注意的是,下面描述的数据结构和程序指令(即,代码)可以被存储在非暂时性计算机可读存储装置上,该非暂时性计算机可读存储装置可以是能够存储由计算机系统(例如,计算机系统100)使用的代码和/或数据的任何装置或存储介质。一般来说,非暂时性计算机可读存储装置包括,但不限于,易失性存储器、非易失性存储器、磁性和光学存储装置,诸如盘驱动器、磁带、光盘(CD)、数字万用盘或数字视频盘(DVD)、或现在已知的或以后开发的能够存储计算机可读介质的其他介质。这样,海量存储装置110、存储器108、L2高速缓存106、和L1高速缓存104是非暂时性计算机可读存储装置的所有示例。
处理器
参照图2,示出了图示了图1的处理器的一个实施例的其他细节的框图。在图2所示的实施例中,处理器102可以包括多个管道段,虽然为了简便起见图2并未示出全部。因此,如图所示,处理器102包括L1高速缓存104、指令获取单元201、分支预测单元210、误预测单元212、整数执行单元202、浮点执行单元206以及矢量执行单元204。值得注意的是整数执行单元202、浮点执行单元206和矢量执行单元204作为一个组可以被互换地称作“执行单元”。
在各种实施例中,执行单元可以,例如,对于相关类型的操作数,执行可计算操作,诸如逻辑运算、数学运算或按位运算。更具体地,整数执行单元202可以执行涉及整数操作数的计算操作,浮点执行单元206可以执行涉及浮点操作数的计算操作,以及矢量执行单元204可以执行涉及矢量操作数的计算操作。整数执行单元和浮点执行单元通常被本领域所公知以及出于简便起见不再进一步描述。如上所述,虽然图2所示的处理器102的实施例包括组件的特定集合,可以设想的是在可替换实施例中处理器102可以包括不同数量或不同类型的执行单元、功能单元和管道段,诸如指令解码单元、调度器或保留站(reservationstation)、重排缓冲区、存储器管理单元、I/O接口等,其可以耦合到执行单元。
矢量执行单元204可以表示经典意义上的单指令多数据(SIMD)执行单元,其中它可以对多个数据元素并行地执行相同的操作。然而,值得注意的是在一些实施例中,这里描述的矢量指令可以与SIMD指令的其他实现不同。例如,在一个实施例中,由矢量指令对其进行操作的矢量元素可以具有不随矢量中的元素的数量变化的大小。相反,在一些SIMD实现中,数据元素大小随对其执行操作的数据元素的数量(例如,SIMD架构可以支持对8个8位元素的操作,而不仅仅是4个16位元素、2个32位元素等。)而变化。在一个实施例中,矢量执行单元204可以对包括在操作数的矢量中的数据元素中的一些或者全部进行操作。更具体地,矢量执行单元204可以被配置成对矢量程序指令的矢量操作数的不同元素进行并发操作。
在一个实施例中,矢量执行单元204可以包含矢量注册文件(未示出),其可以包括能够保持用于矢量执行单元204的操作数矢量和结果矢量的矢量寄存器。在一些实施例中,在矢量注册文件中有32个矢量寄存器,并且每个矢量寄存器可以包括128比特。然而,在可替换实施例中,可以有不同数量的矢量寄存器和/或每个寄存器有不同数量的比特。
矢量执行单元204可被配置成从矢量寄存器检索操作数和执行使得矢量执行单元204对操作数矢量中的一些或全部数据元素并行地执行操作的矢量指令。例如,矢量执行单元204能对矢量中的元素执行逻辑运算、数学运算或按位运算。矢量执行单元204可以在每个指令周期中执行一个矢量操作(虽然如上所述,但是“周期”可以包括多于一个用于触发、同步和/或控制矢量执行单元204的可计算操作的时钟周期)。
在一个实施例中,矢量执行单元204可以支持具有N个数据元素(例如,字节、字、双字等)的矢量,其中N可以是任何正整数。在这些实施例中,矢量执行单元204可以对操作数矢量中的N个或更少个数据元素并行地执行操作。例如,在矢量的长度为256位的实施例中,被操作的数据元素是四字节元素,并且该操作为将数据元素与一值相加,这些实施例可以将该值与矢量中的任意数量的元素相加。值得注意的是对于处理器102的不同实现,N可以不同。
在各种实施例中,矢量执行单元204可以包括至少一个控制信号,该控制信号使能操作数矢量中的数据元素的动态限制,矢量执行单元204对所述操作数矢量进行操作。特别地,依赖于控制信号的状态,矢量执行单元204可对矢量中的任意或全部数据元素进行选择性操作。例如,在矢量为512比特长并且被操作的数据元素为4字节元素的实施例中,控制信号被断言(assert)以防止操作对该操作数矢量中的16个数据元素中的一些或全部执行。注意:“动态”限制在对其执行操作的操作数矢量中的数据元素可以包括在运行时在每个周期单独地断言控制信号。
在一些实施例中,如下更加详细地描述的,基于包含在谓词的矢量或一个或者多个标量谓词中的值,矢量执行单元204将矢量操作仅应用于所选择的矢量数据元素。在一些实施例中,结果矢量中的剩余数据元素保持不受影响(其也可以被称作“断定(predication)”)或被强迫为零(其也可以被称作“调零(zeroing)”或“调零断定”)。在一些实施例中,用于该数据元素处理子系统(“航道(lane)”)的时钟,所述时钟由于矢量执行单元204中的断定或调零而没有被使用,能是有效的(power)和/或时钟门控的(clock-gated),从而降低在矢量执行单元204中的动态功率消耗。
在各种实施例中,该架构可以为矢量长度不可知的以允许它在运行时适应并行性。更具体地,在指令或操作是失量长度不可知的时,可以使用任意长度的矢量执行该操作(即,指令等),直到由支持硬件强加的限制。例如,在矢量执行硬件支持能包括8个单独的4字节元素(因此具有8个元素的矢量长度)的矢量的实施例中,矢量长度不可知操作能对矢量中的8个元素中的任意数量元素进行操作。在支持不同矢量长度(例如,四元素)的不同硬件实现上,矢量长度不可知操作可以对不同数量的元素进行操作,由底层硬件使得该操作可得到所述元素。因此,编译器或程序员不需要明确知道由底层硬件(例如,矢量执行单元204)支持的矢量长度。在这样的实施例中,编译器生成或者程序员书写不需要依赖(或使用)特定矢量长度的程序代码。在一些实施例中,可以禁止在程序代码中指定特定矢量大小。因此,在这些实施例中的编译代码(即,二进制代码)在其他执行单元上运行,所述执行单元可以具有不同的矢量长度,同时从支持更长矢量的处理器中可能实现性能增益。在这样的实施例中,矢量长度可以用于给定的硬件单元,诸如可以在运行时期间从系统寄存器读取的处理器。因此,由于处理技术允许更长的矢量,遗留二进制代码的执行简单地加速而不需要软件开发人员的任何劳动。
一般来说,矢量长度可以被实现为2的幂(例如,2、4、8等)。然而,在一些实施例中,矢量长度不需为2的幂。具体地,3、7或者另一数量的数据元素的矢量能够以和2的幂个数据元素的矢量一样的方式使用。
在各种实施例中,矢量中的每个数据元素能包含一地址,矢量执行单元204使用该地址用于并行地执行一组存储器存取。在这样的实施例中,如果该矢量的一个或者多个元素包含无效的存储器地址,会发生无效的存储器读操作。因此,无效的存储器读操作,其否则将使得程序终止,可以替代地使得含有有效地址的任意元素被读取并且具有无效地址的元素可被标记,从而允许程序执行在面对推测性的且事后得知为非法的读取操作时继续。
在一些实施例中,处理器102(并且因此,矢量执行单元204)能对指针矢量进行操作并使用指针矢量。在这样的实施例中,每个矢量的数据元素的数量与每个矢量的指针的数量相同,而不用考虑数据类型的大小。对存储器操作的指令可以具有指示存储器存取的大小的变量,但是在处理器寄存器中的元素应该和指针大小相同。在这些实施例中,支持32位和64位寻址模式的处理器可以选择允许在32位模式下每个矢量的多个元素的2倍,因而获得更大的吞吐量。假设相同宽度数据路径,这意味着给32位寻址带来了显著的吞吐量优势。使用特定于实现的技术以放松要求。例如,通过注册器配对或一些其他特定机制,在32位模式下能支持双精度浮点数。
在一个实施例中,分支预测单元210可被配置成为条件分支指令生成用于获取单位201的分支目标程序计算器地址(PC)。更具体地,对于条件分支指令,分支预测单元210可以预测分支是将被采用或不被采用,并且控制逻辑(未示出)可以基于该预测生成用于获取单元201的PC。然后,可以依赖于该分支的所预测结果以推测性方式,获取、发布、和执行指令。在各种实施例中,分支预测单元210可以使用各种预测机制中的任一种生成该预测。例如,分支预测单元210可以使用维持各个分支的预测状态(例如,状态机、表格、计数器或其他数据结构)的本地预测器,在总体上考虑的多个分支上执行预测的全局预测器,组合本地和全局预测器的各元素的混合预测器,或其他合适的方法。在一些实施例中,分支预测单元210可以使用预测器,其动态地适应在执行期间变化的分支行为(例如,检测何时根据一种技术被较好地预测的分支根据不同技术将被更好地预测并适应)。
在一个实施例中,误预测单元212被配置成检测何时分支预测是不正确的(例如,其在此时执行的分支的实际行为不同于该分支的预测行为,这指示了误预测该分支。)此外,误预测单元212可以被配置成为执行单元202、206和204以及分支预测单元210提供误预测指示。值得注意的是虽然误预测单元212作为单独的单元示出,但是可以在其他实施例中设想误预测单元212可以是分支预测单元210的一部分,或者它可以是获取单元201的一部分,或者它可以是各种执行单元(例如,202、204和206)的任意或全部的一部分。
如上所述,在常规处理器误预测分支指令时,刷新管道以清除误预测路径中的指令,这是因为不应该允许这些推测性发布的指令根据不正确的推测修改处理器的状态。然后获取单元能获取正确的、非推测性路径的指令。但是,对于这个刷新和填充操作有如下惩罚:在重新开始有用的工作之前可能需要数百个执行周期。因而,如下面联系附图7的描述而详细地描述的,存在某种分支指令,其在被误预测时,可以不需要刷新在误预测路径中的指令以保证正确的处理器操作,例如,因为断定可以使得误预测路径中的指令即使被执行也没有影响。这样的分支指令所导致的对于执行误预测路径中的指令的惩罚轻于允许刷新误预测路径中的指令和从不同分支目标中获取指令的常规误预测行为所造成的惩罚。更具体地,存在在下面描述的宏标量架构中的某些指令,其在支持允许执行误预测路径中的指令的情况下可以抑制常规误预测行为。
宏标量架构概述
指令集架构(也称为宏标量架构)与支持硬件可以允许编译器生成用于循环的程序代码,而不必完全确定编译时的并行性,以及不用丢弃有用的静态分析信息。现在将描述宏标量架构的各种实施例。具体地,如下面将进一步描述的,提供一指令集,其不要规定循环具有并行性,而是替代地,如果动态条件允许的话,使得能够在运行时利用并行性。因此,该架构包括指令,该指令使得由编辑器生成的代码能够依赖于运行时条件通过切换所使用的并行性的量来在非并行(标量)和并行(矢量)之间动态切换。
因此,该架构提供了指令,所述指令使不确定量的矢量并行性用于循环迭代,而不需要在运行时使用该并行性。更具体地,该架构包括一组矢量长度不可知指令,其有效矢量长度依赖于运行时条件而变化。因此,如果运行时依赖需要代码的非并行执行,那么执行针对一个元素的有效矢量长度进行。类似地,如果运行时条件允许并行执行,以运行时依赖(以及底层硬件的矢量长度)所允许的任何程度的矢量并行方式执行相同的代码。例如,如果矢量的8个元素中的2个能安全地并行执行,那么诸如处理器102的处理器可以并行执行这两个元素。在这些实施例中,以矢量长度不可知格式表示程序代码使得能够有在现有系统中不存在的大范围的矢量化机会。
在各种实施例中,在编译期间,编译器首先分析程序代码中给定循环的循环结构并且执行静态依赖分析。然后,编译器生成程序代码,其保持静态分析信息并指令诸如处理器102的处理器例如如何解决运行时依赖以及如何以最大可能数量的并行性处理该程序代码。更具体地,编译器可以提供用于并行地执行对应的循环迭代集合的矢量指令,并且可以提供矢量控制指令,其用于动态限制矢量指令的执行以避免循环迭代之间的数据依赖导致错误。这个方法将并行化的确定推迟到运行时,在那里可以获得关于运行时依赖的信息,因而允许软件和处理器使并行性适应动态变化条件。图3示出了程序代码循环并行性的例子。
参照图3的左侧,示出了具有没有被并行化的循环的四次迭代(例如,迭代1-4)的执行模式,其中每个循环包括指令A-G。以垂直堆叠的指令示出了顺序操作。在图3的右侧是已经并行化的循环版本。在这个例子中,一次迭代中的每个指令依赖于在它之前的至少一个指令,以使得在给定迭代的指令之间具有一个静态的依赖链。因此,在给定迭代中的指令不能被并行化(即,在给定迭代中的指令A-G总是响应于迭代中的其他指令被顺序执行)。然而,在可替换实施例中,在给定迭代中的指令可以被并行化。
如图3中循环迭代之间的箭头所示,在给定迭代中指令E和随后迭代的指令D之间有可能存在运行时数据依赖。然而,在编译期间,编译器仅能确定在这些指令之间存在数据依赖的可能性,但是由于这个信息仅在运行时是可得的,编译器不能告知在哪个迭代中依赖将被实际具体化。在这个例子中,在运行时实际具体化的数据依赖由从1E到2D、与3E到4D的实心箭头示出,而在运行时没有被具体化的数据依赖由从2E到3D的虚线箭头显示。因此,如所示出的,运行时数据依赖实际发生在第一/第二和第三/第四次迭代之间。
由于在第二和第三次迭代之间不存在数据依赖,因而第二和第三次迭代能安全地并行处理。此外,给定迭代的指令A-C与F-G仅在迭代中具有依赖,并且因此,给定迭代的指令A能和所有其他迭代的指令A并行执行,指令B也能和所有其他迭代的指令B并行执行,以此类推。然而,由于第二次迭代中指令D依赖于第一次迭代中的指令E,因而第一次迭代中的指令D和E必须在指令D之前执行以使得第二次迭代能被执行。
因此,在右侧的并行循环中,执行这样循环的迭代以容纳静态和运行时数据依赖,同时获取最大化的并行性。更具体地,并行执行所有四次迭代的指令A-C和F-G。但是,由于第二次迭代中指令D依赖于第一次迭代中的指令E,第一次迭代中的指令D和E必须在指令D之前执行以使得第二次迭代能够被执行。然而,由于在第二次迭代和第三次迭代之间没有数据依赖,这些迭代的指令D和E能被并行执行。
宏标量架构的例子
下面的例子介绍宏标量操作并演示它们在诸如图3所示的并在并行化循环例子中如上所述的循环之类的矢量化循环中的使用。为了易于理解,这些例子使用C++格式的伪代码来演示。
值得注意的是下面的示例实施例是出于讨论的目的。实际指令和操作仅试图帮助理解架构。然而,在可替换实施例中,指令或操作可以以不同的方式实现,例如,使用更为原始的操作的微代码序列或者使用不同的子操作序列。注意避免指令的进一步分解以使得关于宏操作的信息和对应的使用模型不会被模糊。
符号
在下面例子的描述中,以下格式用于变量,除非另有说明,该变量为矢量量:
p5=a<b;
依赖于测试a<b的结果,矢量p5的元素被设置为0或1。注意:矢量p5能为“谓词矢量”,如下面更加详细描述的。一些生成谓词矢量的指令也设置处理器状态标志以反映结果谓词。例如,处理器状态标志或条件代码能包括FIRST、LAST、NONE、和/或ALL标志。
~p5;a=b+c;
只有谓词矢量p5中的活动(即,非零)元素所指定的矢量‘a’中的元素接收b+c的结果。a的其余元素没有改变。这个操作被称作“断言”,并且在谓词矢量前使用鼻音化符号(“~”)来标记。
!p5;a=b+c;
只有谓词矢量p5中的活动(即,非零)元素所指定的矢量‘a’中的元素接收b+c的结果。a的其余元素被设置为0。这个操作被称作“调零(zeroing)”,并且在谓词矢量前使用惊叹号“!”来标记。
if(FIRST())goto...;//同样,LAST(),ANY(),ALL(),CARRY(),
ABOVE(),or NONE(),(其中,ANY()==!NONE())
因此,下面的指令测试处理器状态标志和分支。
x+=VECLEN;
VECLEN为传递每个矢量中的元素数量的机器值。在运行时由执行代码的处理器确定该值,而不是由汇编程序确定。
//注释
以对于很多常见编程语言类似的方式,下面的例子使用前向双斜线表示注释。这些注释可以提供关于所指示矢量中包含的值的信息或在对应例子中执行的操作的解释。
在这些例子中,其他C++-格式的运算符号保持他们的常规含义,但是逐个元素地被应用于矢量上。在使用函数调用之处,它们意味着单个指令,其设置返回至目的地寄存器的任何值。为了便于理解,所有矢量都为整数矢量,但是可替换实施例支持其他数据格式。
结构化带循环依赖
在下面的代码例子1中,示出了使用常规矢量架构的“不可矢量化”的程序代码循环。(值得注意的是除了是不可矢量化的,由于数据依赖的精细粒度特性,这个循环在常规多线程架构上也不是多线程的)。为了清楚起见,这个循环已经被提取出使得循环不可矢量化的基本带循环依赖。
在这个例子中,变量r和s具有带循环依赖,其使用常规架构来避免矢量化。然而,注意到,只要已知条件(A[x]<FACTOR)始终为真或始终为假,那么循环是可矢量化的。当允许条件在执行期间(通常情况)变化时,这些假设发生变化。在这个例子中出于简化考虑,我们推测在A[]和B[]之间没有)重叠。
例1:程序代码循环
使用宏标量架构,通过将矢量划分为对其条件(A[x]<FACTOR)不变的段,使得例1中的循环被矢量化。用于划分这样的矢量的过程的例子,以及使得能够进行该划分的指令的例子,都在下面给出。值得注意的是,对于这个例子,所描述的划分仅需要被应用于条件从句中的指令。除了可能在最后循环迭代上执行,A[x]的第一次读取和最后操作B[x]=r+s总是在全矢量上并行地执行。
结合宏标量架构,示出并描述了指令和矢量化代码的例子以解释矢量处理器(诸如图2的处理器102)的操作。通常组织下面的描述以便描述一些指令并随后给出使用该指令的一个或者多个矢量化代码。在一些情况下,在给定示例中,探讨了特定类型的矢量化问题。
dest=VectorReadInt(Base,Offset)
VectorReadInt是用于执行存储器读取操作的指令。根据数据大小(在这个情况下是整数)缩放的位移矢量Offset被加至标量基地址Base,以形成存储器地址的矢量,其然后被读取到目的地矢量中。如果该指令被断定或为零,则仅读取对应于活动元素(active element)的地址。在所描述的实施例中,允许对无效地址的读取会报错,但是如果第一活动地址是无效的,则这样的错误仅导致程序终止。
VectorWriteInt(Base,Offset,Value)
VectorWriteInt是用于执行存储器写入操作的指令。根据数据大小(在这个情况下是整数)缩放的位移矢量Offset被加至标量基地址Base,以形成存储器地址的矢量。值矢量Value被写入这些存储器地址。如果该指令被断定或为零,则数据仅被写入活动地址。在所描述的实施例中,对非法地址的写入总会造成错误。
dest=VectorIndex(Start,Increment)
VectorIndex是用于生成值的矢量的指令,从由Start指定的标量起始值开始按照增量单调地调整所述值。在索引调整是固定的时,该指令可以被用于初始化循环索引变量。在应用断定或调零时,第一活动元素接收起始值,并且该增量仅被应用于随后的活动元素。例如:
x=VectorIndex(0,1);//x={0 1 2 3 4 5 6 7}
dest=PropagatePostT(dest,src,pred)
PropagatePostT指令传播src中活动元素的值,其由pred确定,至dest中随后的非活动元素。活动元素以及在第一活动元素之前的任意非活动元素在dest中保持不变。该指令的目的是取一个有条件计算的值,并且传播该有条件计算的值至随后的循环迭代,就象在等同的标量代码中发生的那样。例如:
Entry:dest={8 9 A B C D E F}
src={1 2 3 4 5 6 7 8}
pred={0 0 1 1 0 0 1 0}
Exit:dest={8 9 A B 4 4 E 7}
dest=PropagatePriorF(src,pred)
PropagatePriorF指令传播src的非活动元素的值,其由pred确定,至dest中随后的活动元素。非活动元素从src拷贝至dest。如果该谓词的第一元素是活动的,那么src的最后元素被传播至那个位置。例如:
Entry:src={1 2 3 4 5 6 7 8}
pred={1 0 1 1 0 0 1 0}
Exit:dest={8 2 2 2 5 6 6 8}
dest=ConditionalStop(pred,deps)
ConditionalStop指令评估谓词矢量pred,并且识别邻近谓词元素之间的转换,其暗示了deps指定的数据依赖。标量值deps可看作是从左到右进行处理的四比特矩阵,这些比特中的每一个都指示在pred中的真/假元素之间的可能转换。如果设置了,这些比特表示存在所指示的依赖,而如果未设置,则保证没有依赖。它们是:
kTF-将来自谓词为真的迭代的带循环的依赖暗示给谓词的值为假的随后的迭代。
kFF-将来自谓词为假的迭代的带循环的依赖暗示给谓词的值为假的随后的迭代。
kFT-将来自谓词为假的迭代的带循环的依赖暗示给谓词的值为真的随后的迭代。
kTT-将来自谓词为真的迭代的带循环的依赖暗示给谓词的值为真的随后的迭代。
与生成所依赖的数据的迭代对应的元素位置被存储在对应于依赖于该数据的迭代的元素位置处的目的地矢量中。如果不存在数据依赖,值0被存储在该元素处的目的地矢量中。该结果依赖索引矢量,或者DIV,包含表示依赖的元素位置索引矢量。出于下面描述的原因,矢量的第一元素是元素编号1(而不是0)。
作为例子,考虑上面例1的循环中的依赖。在这个循环中,在条件从句的真和假迭代之间的转换表示带循环的依赖,其需要中断并行性。这能使用下面的指令处理:
p1=(t<FACTOR); //p1={00001100}
p2=ConditionalStop(p1,kTF|kFT);//p2={00004060}
由于第四次迭代生成所需的数据,并且第五次迭代依赖于该数据,4被存储在输出矢量p2(其为DIV)的位置5中。同样应用于第七次迭代,其依赖于来自第六次迭代的数据。DIV的其他元素被设置为0以指示不存在依赖。(值得注意的是:在这个例子中矢量的第一元素是元素编号1。)
dest=GeneratePredicates(Pred,DIV)
GeneratePredicates采用依赖索引矢量DIV,并且在给出由pred处理、指示的前一组的情况下,生成与可以被安全地并行处理的下一组元素对应的谓词。如果没有pred的元素是活动的,为可以安全地并行处理的第一组元素生成谓词。如果Pred指示矢量的最后元素已经被处理,那么该指令生成非活动谓词的结果矢量,其指示没有元素要处理,并且设置ZF标记。设置CF标记以指示结果的最后元素是活动的。使用第一例子中的值,GeneratePredicates操作如下:
根据全为0的初始化谓词p2,GeneratePredieates生成p2的新实例,其将随后的矢量计算划分为三个子矢量(即:p’,p”和p”’)。这使得硬件能够处理组中的矢量,这避免了违反循环的数据依赖。
在图4A中,示出了图解例1中循环的标量执行期间变化状态序列的图。更具体地,使用条件表达式方向的随机50/50分布,示出了例1循环的变化状态的进展。在图4B中,示出了图解例1中循环的宏标量矢量化程序代码的执行进展的图。在图4A和图4B中,使用向左倾斜条示出了读取自A[]的值,同时使用向右倾斜条示出了写入B[]的值,以及使用阴影背景示出了“r”或“s”的值(依赖于哪个在给定迭代中改变)。可以观察到在“s”变化的同时“r”从未改变,并且反之亦然。
由于没有一组值参与带循环依赖链,因而不能避免将所有值从A[]中并行读取或并行写入至B[]。然而,对于r和s的计算,仅当条件表达式的值保持相同(即,为真或假的行程(run))时,能并行处理各元素。图4B中示出了这个循环的程序代码的执行的这个模式。值得注意的是,该例子使用长度为8元素的矢量。在处理第一矢量指令时,单独执行第一次迭代(即,矢量执行单元204仅处理第一矢量元素),反之矢量执行单元204并行地处理迭代1-5,然后矢量执行单元204并行地处理迭代6-7。
参照图5A和图5B,示出了图解程序代码的矢量化的一个实施例的图。图5A描述原始源代码,而图5B图解了矢量化代码,其表示可以使用宏标量架构实现的操作。在图5B的矢量化代码中,Loop1是来自源代码的循环,而Loop2是处理子矢量划分的矢量划分循环。
在例子中,读取矩阵A[]并且在全长度矢量中比较矩阵A[](例如,对于N个元素的矢量,一次读取矩阵A[]的N个位置)。矢量i2是控制矢量划分的DIV。通过监测谓词p1在假和真之间的转换,其指示应当观测到带循环依赖,来确定划分。谓词矢量p2确定在任一时刻哪个元素被操作。在这个特定循环中,p1在任意子矢量划分的所有元素中具有相同的值,仅该划分的第一元素需要被检查以确定更新哪个变量。
在更新变量“s”后,PropagatePostT指令将活动划分中的最终值传播至矢量中随后的元素。在循环的顶部,PropagatePriorF指令从矢量的所有元素中的最后矢量位置复制“s”的最后值以为下一遍处理做准备。值得注意的是使用不同的方法传播变量“r”,从而图示在某些情况中使用PropagatePriorF指令的效率。
软件推测
在前一例子中,由于控制流判决独立于带循环依赖,可以在矢量划分循环开始之前确定矢量划分。然而,并不总是如此。考虑下面图2A和图2B中所示的两个循环:
例子2A:程序代码循环1
例子2B:程序代码循环2
在例2A中,控制流判决独立于带循环依赖链,而在例2B中控制流判决为带循环依赖链的一部分。在一些实施例中,例2B中的循环可以导致如下推测:“j”的值将保持不变,并且如果这个预测证明是不正确的,则稍后补偿。在一些实施例中,对“j”值的推测没有显著地改变该循环的矢量化。
在一些实施例中,编译器可以被配置成总是预测在循环的迭代之间没有数据依赖。在这样的实施例中,在存在运行时数据依赖的情况下,并行处理的该组活动元素可以被减少以表示在那时能安全地并行处理的元素组。在这些实施例中,由于没有并行性被实际丢失(即,如果必要,以非并行方式一次一个元素地处理迭代),对于误预测比实际存在的多的并行性,几乎没有惩罚。在这些实施例中,可在后续阶段简单地识别实际并行量。
dest=VectorReadIntFF(Base,Offset,pf)
VectorReadIntFF是VectorReadInt的第一出错变量。如果至少第一活动元素是有效地址,则这个指令不生成错误。对应于无效地址的结果被强制为零,并且返回标志pf,其能被用于对使用这个数据的后续指令掩蔽谓词。如果不映射该地址的第一活动元素,该指令报错以允许计算机系统100(未示出)中的虚拟存储器系统填充对应页,因而保证处理器102可以继续向前进行。
dest=Remaining(Pred)
Remaining指令评估谓词矢量Pred,并且计算矢量中的剩余元素。这对应于在最后的活动谓词之后的非活动谓词集合。如果Pred中没有活动元素,返回所有活动谓词的矢量。类似地,如果Pred是所有活动谓词的矢量,返回非活动谓词的矢量。例如:
Entry:pred={0 0 1 0 1 0 0 0}
Exit:dest={0 0 0 0 0 1 1 1}
图6A和图6B为图解示例矢量化程序代码的实施例的图。更具体地,图6A中所示的代码样本是例2A(如前所示)中代码的矢量化版本。图6B中所示的代码样本是图2B中代码的矢量化版本。参照图6B,A[]的读取和后续比较已经被移动至矢量划分循环内。因此,这些操作假定(推测)“j”的值没有改变。只有在使用“j”之后,可能确定在何处“j”可以改变值。在更新“j”之后,如果迭代通过整个矢量需要的话,则重新计算剩余矢量元素。在推测代码样本中Remaining指令的使用允许程序在程序能确定实际上被安全处理(即,不具有未解决的数据依赖)的这些元素的子组之前,确定要在矢量划分循环中保持处理哪些元素。
在各种实施例中,提供了容错读取支持。因此,在这样的实施例中,使用来自矢量指令的无效元素的地址(例如,VectorReadFF),处理器102可以推测性地从存储器读取数据以尝试加载稍后用于计算的值。然而,一旦发现已经发生了无效读取,这些值被最终丢弃,并且因此不恰当地改正程序行为。由于这样的读取可以引用不存在的或受保护的存储器,这些实施例可以被配置成在存在从存储器中读取的无效但不相关的数据时继续正常执行。(值得注意的是在支持虚拟存储器的实施例中,这可能有不分页的额外好处,直到肯定需要分页为止。)。
在图6A和图6B所示的程序循环中,在条件为真时的迭代和随后的迭代之间存在带循环依赖,而不需要考虑用于稍后迭代的谓词值。这个被反映在ConditionalStop指令的参数中。
图6A和图6B中的样本程序代码突出了非推测性和推测性矢量划分之间的不同。更具体地,在例2A中,读取存储器并且在ConditionalStop之前计算谓词。在ConditionalStop指令之后开始划分循环。然而,在例2B中,在划分循环中执行ConditionalStop指令,并且服务于识别使得早期操作无效的依赖。在两种情况下,GeneratePredicates指令计算谓词,该谓词控制哪些元素被用于划分循环的剩余部分。
误预测空谓词上的分支
如上所述,谓词矢量以及因而断定可以被用于通过给定矢量操作,确定矢量的哪些元素将被改变或保持不变。由于可针对矢量操作的每个元素单独地控制断定,可能在一些情况下,可以断定矢量操作的每个元素,以使得在执行矢量操作时,不会实际修改结果矢量的元素。矢量的元素未被修改的谓词矢量也可以被称为空谓词(null predicate)或空白谓词(empty predicate)。因此,如果谓词矢量为空的或空白的,那么将不存储由谓词矢量断定的指令的结果。如果和空谓词一起执行,这样的指令将没有作用,虽然它们仍然消耗执行资源(例如,在执行管道中的一段)。它们可能因此被安全地从执行中完全省略,这可以释放执行资源以处理有用的工作。
在一些实施例中,分支指令(其可以被称为“在空白/空谓词上的分支指令”)的变量可以被用于指令周围的分支,其由空谓词矢量断定。如果,例如,在谓词矢量中的所有元素是非活动的或“空”的,这样的分支指令或其他流控制指令将改变程序代码的控制流,结果是在未采用路径或分支指令的阴影中的程序指令将不被执行。因此,在空谓词指令上的分支可以被用于跳过那些指令,以使得它们甚至不需要在空谓词上被执行。例如,下面的代码段包括if-else语句。if条件为真时执行的操作和在if条件为假时执行的操作互相排斥。
例3
在下面的例4中示出图解例3的代码段的矢量化的示例代码段。在下面的示例代码段中,示出了如上所述的分支指令。
例4
在例4的代码段中,p1=(condition)是谓词生成指令,并且在该分支和它们各自的目标之间的指令是在每个分支的阴影中的指令。在p1矢量为空时,空白p1指令上的分支被用于指令周围的分支。为了实现在例3的代码段中通过if-else语句实现的互斥性,在例4的代码段中补充p1矢量。因此,通过在第二分支指令中的p1矢量的相反逻辑意义上进行分支来提供互斥性。
在这样的流控制指令被预测为不被采用并且该预测是错误的时,这个情况会有一个问题。如上所述,常规误预测行为指示刷新管道并且将新指令取入该管道。在此情形中,由于误预测路径中的指令结果将不被存储,那么在执行那些指令时不会产生任何危害。通常执行该指令的惩罚比刷新和重新填充管道要轻。因此,如下进一步描述的,在检测到这样一个流控制指令的误预测时,该误预测行为可以被抑制。
在图7中,示出了描绘在所断定分支指令的分支误预测期间图2处理器的一个实施例的操作的流程图。一起参考图2至图7以及从图7的框701开始,分支预测单元210生成程序指令执行的控制流没有响应于条件流控制指令的执行而被改变的预测,其中条件流控制指令响应于确定谓词矢量的元素为空而改变所述控制流。更具体地,在一个实施例中,流控制指令可以是空谓词指令上的分支,并且预测可以是未被采用预测的分支。
误预测单元212被配置成检测分支误预测。因此,误预测单元212可以检测该预测是不正确的(框703)。例如,在一个实施例中,误预测单元212可以追踪该分支指令被预测为被采用还是未被采用。一旦该分支指令被执行,矢量执行单元基于该分支条件的评估,可以提供对该分支实际上被采用或者未被采用的指示给误预测单元212。响应于检测到误预测,误预测单元212可以禁止处理器误预测行为(框705)。在一个实施例中,误预测单元212可以被配置成生成误预测指示,并且提供该指示给获取单元201、执行单元(202、204以及206)以及分支预测单元210。在这样的实施例中,具有来自误预测分支的指令的执行单元的管道免于被刷新,因而允许落入分支指令的误预测路径中的指令在无需改变机器状态的情况下被执行。
在一个实施例中,误预测单元212可以被配置成在以下条件被满足时提供指示:在空或空白谓词上的分支被错误地预测为未被采用,在空白谓词上的分支的条件代码标志(CCF)是谓词生成指令的结果,并且在分支指令和分支目标之间的所有指令基于以下之一被断定:由谓词生成指令产生的谓词,或者由谓词生成指令生成的谓词从调零断定中得出的谓词。如果上面条件被满足,则不正确执行的指令不能影响机器状态,这是因为它们已经利用空白谓词被执行,并因此是有益的。
虽然已经用相当可观的细节描述了上面的实施例,一旦上面的公开被充分领会,许多变化和修改将对本领域技术人员来说变得显而易见。意欲将以下权利要求解释为包括所有这样的变化和修改。
Claims (20)
1.一种方法,包括:
生成预测程序指令执行的控制流没有响应于条件流控制指令的执行而被改变的预测,其中所述条件流控制指令响应于确定谓词矢量的一个或多个元素中的每一个都为空而改变所述控制流;
检测所述预测是不正确的;以及
响应于检测到所述预测是不正确的而禁止误预测行为。
2.如权利要求1所述的方法,其中禁止误预测行为包括:
执行落入所述条件流控制指令的误预测路径中的程序指令。
3.如权利要求1所述的方法,其中禁止误预测行为包括:
禁止从处理器的执行管道中刷新在所述条件流控制指令和指令目标之间的按程序顺序的程序指令。
4.如权利要求1所述的方法,其中所述谓词矢量的一个或多个元素中的每一个都控制对应的矢量元素将接收特定矢量指令的结果,还是将在所述特定矢量指令的执行期间保持不被修改。
5.如权利要求4所述的方法,其中禁止所述误预测行为进一步依赖于接收到对于由所述条件流控制指令指定的条件代码标志的状态是谓词生成指令的结果的确定。
6.如权利要求4所述的方法,其中禁止所述误预测行为进一步依赖于接收到对于落入在所述条件流控制指令和所述条件流控制指令的指令目标之间的误预测路径中的程序指令依赖于所述谓词矢量中的谓词元素的确定。
7.如权利要求4所述的方法,其中禁止所述误预测行为进一步依赖于接收到对于落入在所述条件流控制指令和所述条件流控制指令的指令目标之间的误预测路径中的程序指令依赖于通过所述谓词矢量从调零断定中得出的谓词矢量。
8.一种处理器,包括:
包括多个执行管道的执行单元,所述多个执行管道被配置成对矢量程序指令的矢量操作数的不同元素进行并发操作;
耦合至所述执行单元的预测单元,被配置成生成流控制指令将不改变程序指令执行的控制流的预测,其中所述流控制指令响应于确定谓词矢量的一个或者多个元素中的每一个都为空而改变所述控制流;以及
误预测检测单元,被配置成检测所述预测是不正确的;
其中所述误预测检测单元进一步被配置成响应于检测到所述预测是不正确的而禁止所述执行管道的误预测行为。
9.如权利要求8所述的处理器,其中为了禁止误预测行为,所述误预测检测单元被配置成允许所述执行单元执行落入所述流控制指令的误预测路径中的程序指令。
10.如权利要求8所述的处理器,其中所述谓词矢量的一个或者多个元素中的每一个都控制对应的矢量元素将接收特定矢量指令的结果、还是将在所述特定矢量指令的执行期间保特不被修改。
11.如权利要求10所述的处理器,其中所述误预测检测单元进一步被配置成响应于接收到对于由所述流控制指令指定的条件代码标志的状态是谓词生成指令的结果的确定而禁止误预测行为。
12.如权利要求11所述的处理器,其中所述误预测检测单元进一步被配置成响应于接收到对于落入在所述流控制指令和所述流控制指令的指令目标之间的误预测路径中的程序指令是依赖于谓词矢量中的谓词元素、还是依赖于通过所述谓词矢量从调零断定中得出的谓词矢量的确定而禁止误预测行为。
13.一种方法,包括:
生成程序指令执行的控制流没有响应于条件流控制指令的执行而被改变的预测,其中所述条件流控制指令响应于确定谓词矢量的一个或多个元素中的每一个都为空而改变所述控制流;
检测所述预测是不正确的;以及
响应于检测到所述预测是不正确的,执行落入在所述条件流控制指令和所述条件流控制指令的目标指令之间的误预测路径中的程序指令。
14.如权利要求13所述的方法,进一步包括:
响应于检测到所述预测是不正确的,应用所述谓词矢量以丢弃落入在所述条件流控制指令和所述条件流控制指令的目标指令之间的误预测路径中的程序指令的执行结果。
15.如权利要求13所述的方法,其中所述谓词矢量的每个元素的值控制对应的矢量元素将接收特定矢量指令的结果、还是将在特定矢量指令的执行期间保持不被修改。
16.如权利要求13所述的方法,进一步包括:
响应于接收到对于由所述条件流控制指令指定的条件代码标志的状态为谓词生成指令的结果的确定而执行落入在所述条件流控制指令和所述目标指令之间的误预测路径中的程序指令。
17.一种处理器,包括:
包括多个执行管道的执行单元,所述多个执行管道被配置成对矢量程序指令的矢量操作数的不同元素进行并发操作;
耦合至所述执行单元的分支预测单元,被配置成生成分支指令的执行将不导致分支被采用的预测,其中所述分支指令的执行导致响应于确定谓词矢量的一个或多个元素中的每一个都为空而采用所述分支;以及
误预测检测单元,被配置成检测所述预测是不正确的;
其中,响应于检测到所述预测是不正确的,所述误预测检测单元被配置成禁止所述执行管道的一个或者多个管道段的刷新,以使得所述执行单元执行落入所述分支指令的误预测路径中的程序指令。
18.如权利要求17所述的处理器,其中所述谓词矢量的每个元素的值控制对应的程序变量矢量元素将接收特定矢量指令的结果,还是将在特定矢量指令的执行期间保持不被修改。
19.如权利要求18所述的处理器,其中所述预测单元被配置成禁止响应于接收到对于由所述分支指令指定的条件代码标志的状态是谓词生成指令的结果的确定而刷新所述执行管道的一个或者多个管道段。
20.一种系统,包括:
存储器,被配置成存储程序指令;以及
耦合至所述存储器的处理器,其中所述处理器包括:
包括多个执行管道的执行单元,所述多个执行管道被配置成对矢量程序指令的矢量操作数的不同元素进行并发操作;
耦合至所述执行单元的预测单元,被配置成生成流控制指令将不改变程序指令执行的控制流的预测,其中所述流控制指令响应于确定谓词矢量的一个或者多个元素中的每一个都为空而改变所述控制流;以及
误预测检测单元,被配置成检测所述预测是不正确的;
其中所述误预测检测单元被配置成响应于检测到所述预测是不正确的而禁止所述执行管道的误预测行为。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/404,362 | 2012-02-24 | ||
US13/404,362 US9268569B2 (en) | 2012-02-24 | 2012-02-24 | Branch misprediction behavior suppression on zero predicate branch mispredict |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103353834A true CN103353834A (zh) | 2013-10-16 |
CN103353834B CN103353834B (zh) | 2016-09-28 |
Family
ID=47720430
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310175278.8A Active CN103353834B (zh) | 2012-02-24 | 2013-02-22 | 对零谓词分支误预测的分支误预测行为抑制 |
Country Status (7)
Country | Link |
---|---|
US (1) | US9268569B2 (zh) |
EP (1) | EP2631785A1 (zh) |
JP (1) | JP5612148B2 (zh) |
KR (1) | KR101417597B1 (zh) |
CN (1) | CN103353834B (zh) |
TW (1) | TW201349111A (zh) |
WO (1) | WO2013126228A2 (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108780395A (zh) * | 2016-03-23 | 2018-11-09 | Arm有限公司 | 矢量预测指令 |
CN109426519A (zh) * | 2017-08-31 | 2019-03-05 | 辉达公司 | 线内数据检查以进行工作量简化 |
CN111538535A (zh) * | 2020-04-28 | 2020-08-14 | 支付宝(杭州)信息技术有限公司 | 一种cpu指令处理方法、控制器和中央处理单元 |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9116686B2 (en) | 2012-04-02 | 2015-08-25 | Apple Inc. | Selective suppression of branch prediction in vector partitioning loops until dependency vector is available for predicate generating instruction |
US9389860B2 (en) | 2012-04-02 | 2016-07-12 | Apple Inc. | Prediction optimizations for Macroscalar vector partitioning loops |
US20140189330A1 (en) * | 2012-12-27 | 2014-07-03 | Ayal Zaks | Optional branches |
US9367314B2 (en) | 2013-03-15 | 2016-06-14 | Intel Corporation | Converting conditional short forward branches to computationally equivalent predicated instructions |
US9817663B2 (en) | 2013-03-19 | 2017-11-14 | Apple Inc. | Enhanced Macroscalar predicate operations |
US9348589B2 (en) | 2013-03-19 | 2016-05-24 | Apple Inc. | Enhanced predicate registers having predicates corresponding to element widths |
GB2519108A (en) * | 2013-10-09 | 2015-04-15 | Advanced Risc Mach Ltd | A data processing apparatus and method for controlling performance of speculative vector operations |
KR101826707B1 (ko) | 2014-03-27 | 2018-02-07 | 인텔 코포레이션 | 마스킹된 결과 요소들로의 전파를 이용하여 연속 소스 요소들을 마스킹되지 않은 결과 요소들에 저장하기 위한 프로세서, 방법, 시스템 및 명령어 |
EP3123300A1 (en) | 2014-03-28 | 2017-02-01 | Intel Corporation | Processors, methods, systems, and instructions to store source elements to corresponding unmasked result elements with propagation to masked result elements |
US9519482B2 (en) * | 2014-06-20 | 2016-12-13 | Netronome Systems, Inc. | Efficient conditional instruction having companion load predicate bits instruction |
TWI566090B (zh) * | 2014-10-17 | 2017-01-11 | Insyde Software Corp | Debugging firmware / software to produce tracking systems and methods, recording media and computer program products |
GB2540942B (en) * | 2015-07-31 | 2019-01-23 | Advanced Risc Mach Ltd | Contingent load suppression |
GB2558220B (en) * | 2016-12-22 | 2019-05-15 | Advanced Risc Mach Ltd | Vector generating instruction |
US11645078B2 (en) * | 2019-07-19 | 2023-05-09 | Intel Corporation | Detecting a dynamic control flow re-convergence point for conditional branches in hardware |
US11113067B1 (en) * | 2020-11-17 | 2021-09-07 | Centaur Technology, Inc. | Speculative branch pattern update |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5522053A (en) * | 1988-02-23 | 1996-05-28 | Mitsubishi Denki Kabushiki Kaisha | Branch target and next instruction address calculation in a pipeline processor |
US5799180A (en) * | 1995-10-31 | 1998-08-25 | Texas Instruments Incorporated | Microprocessor circuits, systems, and methods passing intermediate instructions between a short forward conditional branch instruction and target instruction through pipeline, then suppressing results if branch taken |
US6988213B1 (en) * | 1997-01-22 | 2006-01-17 | Intel Corporation | Method and system to surpress speculative execution of instructions in a microprocessor |
CN101160561A (zh) * | 2005-02-24 | 2008-04-09 | 高通股份有限公司 | 通过循环结束分支来抑制分支历史寄存器的更新 |
US20100325483A1 (en) * | 2008-08-15 | 2010-12-23 | Apple Inc. | Non-faulting and first-faulting instructions for processing vectors |
Family Cites Families (42)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5471593A (en) | 1989-12-11 | 1995-11-28 | Branigin; Michael H. | Computer processor with an efficient means of executing many instructions simultaneously |
JPH04137169A (ja) | 1990-09-28 | 1992-05-12 | Nec Corp | 情報処理装置 |
JPH04349570A (ja) * | 1991-05-28 | 1992-12-04 | Nec Corp | 情報処理装置 |
US5835967A (en) * | 1993-10-18 | 1998-11-10 | Cyrix Corporation | Adjusting prefetch size based on source of prefetch address |
US5682493A (en) * | 1993-10-21 | 1997-10-28 | Sun Microsystems, Inc. | Scoreboard table for a counterflow pipeline processor with instruction packages and result packages |
DK0661625T3 (da) * | 1994-01-03 | 2000-04-03 | Intel Corp | Fremgangsmåde og apparatur til implementering af et firetrins system til bestemmelse af programforgreninger (Four Stage Bra |
US5687338A (en) * | 1994-03-01 | 1997-11-11 | Intel Corporation | Method and apparatus for maintaining a macro instruction for refetching in a pipelined processor |
US5809271A (en) * | 1994-03-01 | 1998-09-15 | Intel Corporation | Method and apparatus for changing flow of control in a processor |
US5732253A (en) * | 1994-10-18 | 1998-03-24 | Cyrix Corporation | Branch processing unit with target cache storing history for predicted taken branches and history cache storing history for predicted not-taken branches |
US5692168A (en) * | 1994-10-18 | 1997-11-25 | Cyrix Corporation | Prefetch buffer using flow control bit to identify changes of flow within the code stream |
US5835951A (en) * | 1994-10-18 | 1998-11-10 | National Semiconductor | Branch processing unit with target cache read prioritization protocol for handling multiple hits |
US5740416A (en) * | 1994-10-18 | 1998-04-14 | Cyrix Corporation | Branch processing unit with a far target cache accessed by indirection from the target cache |
DE69629495T2 (de) * | 1995-10-06 | 2004-06-09 | Advanced Micro Devices, Inc., Sunnyvale | Vereinheitlichter multifunktions-operationsverteiler für die ungeordnete befehlsexekution in einem superskalaren prozessor |
US6182210B1 (en) * | 1997-12-16 | 2001-01-30 | Intel Corporation | Processor having multiple program counters and trace buffers outside an execution pipeline |
US6157998A (en) * | 1998-04-03 | 2000-12-05 | Motorola Inc. | Method for performing branch prediction and resolution of two or more branch instructions within two or more branch prediction buffers |
JP2000293373A (ja) * | 1999-04-12 | 2000-10-20 | Hitachi Ltd | 分岐予測装置 |
US6918032B1 (en) | 2000-07-06 | 2005-07-12 | Intel Corporation | Hardware predication for conditional instruction path branching |
US7165169B2 (en) * | 2001-05-04 | 2007-01-16 | Ip-First, Llc | Speculative branch target address cache with selective override by secondary predictor based on branch instruction type |
US20030135719A1 (en) | 2002-01-14 | 2003-07-17 | International Business Machines Corporation | Method and system using hardware assistance for tracing instruction disposition information |
US7155598B2 (en) | 2002-04-02 | 2006-12-26 | Ip-First, Llc | Apparatus and method for conditional instruction execution |
JP3709933B2 (ja) | 2002-06-18 | 2005-10-26 | 日本電気株式会社 | 分岐予測による分岐命令高速化方法、およびプロセッサ |
US7159103B2 (en) | 2003-03-24 | 2007-01-02 | Infineon Technologies Ag | Zero-overhead loop operation in microprocessor having instruction buffer |
US20050097304A1 (en) * | 2003-10-30 | 2005-05-05 | International Business Machines Corporation | Pipeline recirculation for data misprediction in a fast-load data cache |
US7587580B2 (en) * | 2005-02-03 | 2009-09-08 | Qualcomm Corporated | Power efficient instruction prefetch mechanism |
US7254700B2 (en) * | 2005-02-11 | 2007-08-07 | International Business Machines Corporation | Fencing off instruction buffer until re-circulation of rejected preceding and branch instructions to avoid mispredict flush |
US7711934B2 (en) * | 2005-10-31 | 2010-05-04 | Mips Technologies, Inc. | Processor core and method for managing branch misprediction in an out-of-order processor pipeline |
US7734901B2 (en) | 2005-10-31 | 2010-06-08 | Mips Technologies, Inc. | Processor core and method for managing program counter redirection in an out-of-order processor pipeline |
US8266413B2 (en) | 2006-03-14 | 2012-09-11 | The Board Of Trustees Of The University Of Illinois | Processor architecture for multipass processing of instructions downstream of a stalled instruction |
US7617387B2 (en) * | 2006-09-27 | 2009-11-10 | Qualcomm Incorporated | Methods and system for resolving simultaneous predicted branch instructions |
US7624254B2 (en) * | 2007-01-24 | 2009-11-24 | Qualcomm Incorporated | Segmented pipeline flushing for mispredicted branches |
US7925868B2 (en) * | 2007-01-24 | 2011-04-12 | Arm Limited | Suppressing register renaming for conditional instructions predicted as not executed |
US8209525B2 (en) | 2008-08-15 | 2012-06-26 | Apple Inc. | Method and apparatus for executing program code |
US8099586B2 (en) * | 2008-12-30 | 2012-01-17 | Oracle America, Inc. | Branch misprediction recovery mechanism for microprocessors |
US8131984B2 (en) | 2009-02-12 | 2012-03-06 | Via Technologies, Inc. | Pipelined microprocessor with fast conditional branch instructions based on static serializing instruction state |
US20100262813A1 (en) | 2009-04-14 | 2010-10-14 | International Business Machines Corporation | Detecting and Handling Short Forward Branch Conversion Candidates |
JP5423156B2 (ja) * | 2009-06-01 | 2014-02-19 | 富士通株式会社 | 情報処理装置及び分岐予測方法 |
US20110047357A1 (en) | 2009-08-19 | 2011-02-24 | Qualcomm Incorporated | Methods and Apparatus to Predict Non-Execution of Conditional Non-branching Instructions |
US8458684B2 (en) * | 2009-08-19 | 2013-06-04 | International Business Machines Corporation | Insertion of operation-and-indicate instructions for optimized SIMD code |
US8433885B2 (en) | 2009-09-09 | 2013-04-30 | Board Of Regents Of The University Of Texas System | Method, system and computer-accessible medium for providing a distributed predicate prediction |
US8555040B2 (en) | 2010-05-24 | 2013-10-08 | Apple Inc. | Indirect branch target predictor that prevents speculation if mispredict is expected |
US9098295B2 (en) * | 2011-01-21 | 2015-08-04 | Apple Inc. | Predicting a result for an actual instruction when processing vector instructions |
US8862861B2 (en) * | 2011-05-13 | 2014-10-14 | Oracle International Corporation | Suppressing branch prediction information update by branch instructions in incorrect speculative execution path |
-
2012
- 2012-02-24 US US13/404,362 patent/US9268569B2/en active Active
-
2013
- 2013-02-11 WO PCT/US2013/025504 patent/WO2013126228A2/en active Application Filing
- 2013-02-20 EP EP13155929.6A patent/EP2631785A1/en not_active Ceased
- 2013-02-21 TW TW102106080A patent/TW201349111A/zh unknown
- 2013-02-22 CN CN201310175278.8A patent/CN103353834B/zh active Active
- 2013-02-22 KR KR1020130019269A patent/KR101417597B1/ko active IP Right Grant
- 2013-02-22 JP JP2013049602A patent/JP5612148B2/ja active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5522053A (en) * | 1988-02-23 | 1996-05-28 | Mitsubishi Denki Kabushiki Kaisha | Branch target and next instruction address calculation in a pipeline processor |
US5799180A (en) * | 1995-10-31 | 1998-08-25 | Texas Instruments Incorporated | Microprocessor circuits, systems, and methods passing intermediate instructions between a short forward conditional branch instruction and target instruction through pipeline, then suppressing results if branch taken |
US6988213B1 (en) * | 1997-01-22 | 2006-01-17 | Intel Corporation | Method and system to surpress speculative execution of instructions in a microprocessor |
CN101160561A (zh) * | 2005-02-24 | 2008-04-09 | 高通股份有限公司 | 通过循环结束分支来抑制分支历史寄存器的更新 |
US20100325483A1 (en) * | 2008-08-15 | 2010-12-23 | Apple Inc. | Non-faulting and first-faulting instructions for processing vectors |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108780395A (zh) * | 2016-03-23 | 2018-11-09 | Arm有限公司 | 矢量预测指令 |
CN108780395B (zh) * | 2016-03-23 | 2023-02-28 | Arm有限公司 | 矢量预测指令 |
CN109426519A (zh) * | 2017-08-31 | 2019-03-05 | 辉达公司 | 线内数据检查以进行工作量简化 |
US11609761B2 (en) | 2017-08-31 | 2023-03-21 | Nvidia Corporation | Inline data inspection for workload simplification |
CN109426519B (zh) * | 2017-08-31 | 2023-04-28 | 辉达公司 | 线内数据检查以进行工作量简化 |
US11977888B2 (en) | 2017-08-31 | 2024-05-07 | Nvidia Corporation | Inline data inspection for workload simplification |
CN111538535A (zh) * | 2020-04-28 | 2020-08-14 | 支付宝(杭州)信息技术有限公司 | 一种cpu指令处理方法、控制器和中央处理单元 |
Also Published As
Publication number | Publication date |
---|---|
WO2013126228A2 (en) | 2013-08-29 |
US9268569B2 (en) | 2016-02-23 |
WO2013126228A3 (en) | 2015-06-18 |
EP2631785A1 (en) | 2013-08-28 |
US20130227251A1 (en) | 2013-08-29 |
JP2013175201A (ja) | 2013-09-05 |
JP5612148B2 (ja) | 2014-10-22 |
KR101417597B1 (ko) | 2014-07-09 |
CN103353834B (zh) | 2016-09-28 |
TW201349111A (zh) | 2013-12-01 |
KR20130097676A (ko) | 2013-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103353834A (zh) | 对零谓词分支误预测的分支误预测行为抑制 | |
CN103383640B (zh) | 提高向量分解循环的性能 | |
US8359460B2 (en) | Running-sum instructions for processing vectors using a base value from a key element of an input vector | |
US8793472B2 (en) | Vector index instruction for generating a result vector with incremental values based on a start value and an increment value | |
US8447956B2 (en) | Running subtract and running divide instructions for processing vectors | |
US20100325398A1 (en) | Running-min and running-max instructions for processing vectors | |
US9182959B2 (en) | Predicate count and segment count instructions for processing vectors | |
US20150058832A1 (en) | Auto multi-threading in macroscalar compilers | |
US8984262B2 (en) | Generate predicates instruction for processing vectors | |
CN103140828A (zh) | 基于硬件限制利用可调事务尺寸来动态优化代码的装置、方法和系统 | |
US20110035567A1 (en) | Actual instruction and actual-fault instructions for processing vectors | |
US20110035568A1 (en) | Select first and select last instructions for processing vectors | |
CN107810477A (zh) | 解码的指令的重复使用 | |
CN103534686A (zh) | 异构核心的自动内核迁移 | |
CN103348323A (zh) | 动态二进制优化 | |
US20110283092A1 (en) | Getfirst and assignlast instructions for processing vectors | |
US20100325399A1 (en) | Vector test instruction for processing vectors | |
US20120166765A1 (en) | Predicting branches for vector partitioning loops when processing vector instructions | |
US20140025938A1 (en) | Prediction optimizations for macroscalar vector partitioning loops | |
US20150227369A1 (en) | Completion Time Prediction for Vector Instructions | |
US9442734B2 (en) | Completion time determination for vector instructions | |
US20130318332A1 (en) | Branch misprediction behavior suppression using a branch optional instruction | |
US20120192005A1 (en) | Sharing a fault-status register when processing vector instructions | |
CN102508776B (zh) | 多线程交叉双精度短向量结构的评测激励自动构造方法 | |
Frank | SUDS: Automatic parallelization for Raw processors |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |