CN103383640B - 提高向量分解循环的性能 - Google Patents

提高向量分解循环的性能 Download PDF

Info

Publication number
CN103383640B
CN103383640B CN201310112340.9A CN201310112340A CN103383640B CN 103383640 B CN103383640 B CN 103383640B CN 201310112340 A CN201310112340 A CN 201310112340A CN 103383640 B CN103383640 B CN 103383640B
Authority
CN
China
Prior art keywords
instruction
vector
prediction
branch instruction
predicate
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.)
Active
Application number
CN201310112340.9A
Other languages
English (en)
Other versions
CN103383640A (zh
Inventor
J·E·高宁恩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Apple Inc
Original Assignee
Apple Computer Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Apple Computer Inc filed Critical Apple Computer Inc
Publication of CN103383640A publication Critical patent/CN103383640A/zh
Application granted granted Critical
Publication of CN103383640B publication Critical patent/CN103383640B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30072Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3848Speculative instruction execution using hybrid branch prediction, e.g. selection between prediction techniques

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)
  • Complex Calculations (AREA)

Abstract

本发明涉及提高向量分解循环的性能。更具体而言,提供一种用于抑制在向量分解循环中使用的后向分支指令的预测的方法,包括检测在谓词生成指令之后出现的第一后向分支指令。该谓词生成指令生成取决于相关性向量的谓词向量,在该相关性向量中,相关性向量的每一个元素指示在向量指令的各元素之间是否存在数据相关性。该方法还包括接收后向分支指令的预测的预测精度的指示。如果预测精度不满足阈值,那么抑制后向分支指令的预测,直到谓词生成指令取决的相关性向量可用为止。

Description

提高向量分解循环的性能
技术领域
本公开涉及处理器,更具体地涉及在向量分解循环的执行期间对某些分支指令的预测。
背景技术
在大部分的现代处理器中,分支预测已经成为常见的事件。虽然在很多情况中后向分支可能是高度可预测的,但是通过传统的分支预测器可能不好预测某些后向分支。更具体地,宏标量处理器和编译器依赖于向量分解循环来正确地处理可能的循环传递相关性,例如,存储器危险。向量分解循环使用后向分支来循环地迭代。在经常分解向量的情况中,传统的分支预测器可以不好地执行,其可能会负面地影响处理器性能。
发明内容
公开用于抑制在向量分解循环中使用的后向分支指令的预测的方法的各种实施例。广义地说,设想到这样的方法,其中,检测在谓词生成指令之后出现的第一后向分支指令。谓词生成指令生成取决于相关性向量的谓词向量,在该相关性向量中,相关性向量的每一个元素指示在向量指令的各元素之间是否存在数据相关性。如果接收到的后向分支指令的预测的预测精度的指示不满足阈值,那么可以抑制后向分支指令的预测,直到谓词生成指令所取决的相关性向量可用为止。
在一个实施例中,该方法包括:检测跟随在谓词生成指令之后的第一条件分支指令。谓词生成指令在被执行时生成取决于相关性向量的谓词向量。相关性向量的每一个元素包括指示在向量指令的各元素之间是否存在数据相关性的指数。另外,该方法可以包括:接收第一条件分支指令的预测精度的指示。响应于确定第一条件分支指令的预测精度不满足阈值,可以抑制第一条件分支指令的预测,直到谓词生成指令所取决的相关性向量可用为止。
在一个特定的实现方式中,该方法还可以包括:响应于检测到相关性向量可用,使用在相关性向量中指示的数据相关性信息来预测第一条件分支指令。
附图说明
图1是计算机系统的一个实施例的框图。
图2是图示图1中示出的处理器的实施例的附加细节的框图。
图3是图示程序代码循环的示例并行化的示图。
图4A是图示在例子1中示出的循环的标量执行期间的一系列变量状态的示图。
图4B是图示例子1的循环的宏标量向量化程序代码的执行的进程的示图。
图5A和图5B是图示程序源代码的向量化的一个实施例的示图。
图6A是图示非推测向量化程序代码的一个实施例的示图。
图6B是图示推测向量化程序代码的另一个实施例的示图。
图7是图示向量化程序代码的另一个实施例的示图。
图8是图示向量化程序代码的另一个实施例的示图。
图9是描绘在形成向量分解循环的程序指令的执行期间图2的处理器的一个实施例的运算的流程图。
以举例的方式在附图中示出特定实施例,并将在本文中对其进行详细的描述。但是,应该理解,附图和详细描述不应当将权利要求限制为所公开的具体实施例,即使在针对具体特征仅仅描述了一个实施例的情况中。相反,应当覆盖对于受益于本公开的本领域的技术人员来说显而易见的所有的修改、等同物和替换物。除非另有说明,在本公开中提供的特征的例子应当是示例性的,而不是限制性的。
在许可的意义(即,具有“可能的”的意义)上而不是在强制的意义(即,具有“必须”的意义)上使用如在本说明书全文中使用的词语“可以”。类似地,词语“包含”、“包括”和“含有”意指包括但不限于。
各种单元、电路或其他部件可以被描述为“被配置为”执行一种或多种任务。在这种语境中,“被配置为”是对通常指具有在运算期间执行一种或多种任务的“电路”的结构的广义描述。这样,单元/电路/部件可以被配置为即使在该单元/电路/部件当前不工作时也执行任务。一般地,形成对应于“被配置为”的结构的电路可以包括硬件电路。类似地,为了方便描述,各种单元/电路/部件可以被描述为执行一种或多种任务。这种描述应该被解释为包括词语“被配置为”。描述被配置为执行一种或多种任务的单元/电路/部件明显地不应当援引美国专利法第112条第6段(35U.S.C.§112,paragraphsix)的对于该单元/电路/部件的解释。
本公开的范围包括本文公开的任何特征或特征的组合,或者其任何概括,而无论其是否减轻本文解决的问题中的任何一个或全部。因此,在本申请的申请过程中,可以针对任何这样的特征组合定制新的权利要求。特别地,对于所附权利要求,从属权利要求的特征可以与独立权利要求的特征组合,并且,各个独立权利要求的特征可以以任何合适的方式组合,而不仅仅以所附权利要求中列举的特定组合的方式组合。
具体实施方式
计算机系统概述
现在转到图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可以包括一个或多个用于向量处理的机构(例如,向量执行单元)。下面将结合图2的描述来更详细地描述处理器102的向量执行单元的例子。
海量存储设备100、存储器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等)在每个周期(cycle)可以存取(即,读和/或写)多个高速缓冲器线。这些实施例可以使得对基于对非相邻存储器地址的指针或数组指数的向量而发生的存储器存取的更有效的处理
应当注意,在下面描述的时间结构和程序指令(即,代码)可以被存储在非暂态计算机可读存储装置上,该非暂态计算机可读存储装置可以是能够存储由计算机系统(例如,计算机系统100)所使用的代码和/或数据的任意装置或存储介质。总的来说,非暂态计算机可读存储装置包括但不限于:易失性存储器、非易失性存储器、磁和光存储装置(诸如磁盘驱动器、磁带、压缩盘(CD)、数字多功能盘或数字视频盘(DVD))或者能够存储现在知晓或以后开发的计算机可读介质的其它介质。这样,海量存储设备110、存储器108、L2高速缓冲器106、以及L1高速缓冲器104都是非暂态计算机可读存储装置的例子。
处理器
参考图2,示出图示图1的处理器的实施例的附加细节的框图。在图2示出的实施例中,处理器102可以包括多个流水线级(pipelinestage),尽管为简便起见在图2中未示出所有的流水线级。因此,如图所示,处理器102包括:L1高速缓冲器104、指令取出单元201、分支预测单元210、误预测单元212、整数执行单元202、浮点执行单元206、以及向量执行单元204。应当注意,作为一组的整数执行单元202、浮点执行单元206、以及向量执行单元204可以被交替地称为“执行单元”。
在各实施例中,执行单元可以执行诸如逻辑运算、数学运算或逐位运算的计算运算,例如,对相关类型的操作数。更具体地说,整数执行单元202可以执行涉及整数操作数的计算运算,浮点执行单元206可以执行涉及浮点操作数的计算运算,而向量执行单元204可以执行涉及向量操作数的计算运算。整数执行单元和浮点执行单元在本领域中是众所周知的,为简便起见不做进一步描述。如上所述,尽管图2中示出的处理器102的实施例包括一组特定的部件,但是,可以设想到,在可选实施例中,处理器102可以包括不同数量或类型的执行单元、功能单元和诸如指令解码单元、调度器或保留站、记录器缓存、存储器管理单元、I/O接口等的可以耦接到执行单元的流水线级。
向量执行单元204可以代表传统意义上的单指令多数据(SIMD)执行单元,其中,其可以并行地执行对多个数据元素的相同的运算。但是,应当注意,在某些实施例中,这里描述的向量指令不同于SIMD指令的其它实现。例如,在实施例中,通过向量指令进行运算的向量的元素可以具有不随着向量中的元素的数量而改变的大小。通过对比,在某些SIMD实现中,数据元素大小确实随着进行运算的数据元素的数量而改变(例如,SIMD架构可以支持八个8位元素上的运算,而只支持四个16位元素、两个32位元素等)。在一个实施例中,向量执行单元204可以对被包括在操作数的向量中的某些或全部数据元素进行运算。更具体地说,向量执行单元204可以被配置为对向量程序指令的向量操作数的不同元素同时进行运算。
在一个实施例中,向量执行单元204可以包括向量寄存器文件(未示出),其可以包括能够为向量执行单元204保持操作数向量和结果向量的向量寄存器。在某些实施例中,在向量寄存器文件中可以有32个向量寄存器,并且,每个向量寄存器可以包括128位。但是,在可选实施例中,每个寄存器可以有不同数量的向量寄存器和/或不同数量的位。
向量执行单元204可以被配置为从向量寄存器检索操作数,并执行向量指令,该向量指令使得向量执行单元204对操作数向量中的某些或全部数据元素并行地执行运算。例如,向量执行单元204可以对向量中的元素执行逻辑运算、数学运算或逐位运算。向量执行单元204可以在每个指令周期中执行一个向量运算(虽然如上所述,“周期”可以包括大于一个的时钟周期,该时钟周期可以被用于触发、同步和/或控制向量执行单元204的计算运算)。
在一个实施例中,向量执行单元204可以支持保持N个数据元素(例如,字节、字、双字等)的向量,其中,N可以是任何正整数。在这些实施例中,向量执行单元204可以并行地对操作数向量中的N个或更少的数据元素执行运算。例如,在向量长度是256位的实施例中,进行运算的数据元素是四字节元素,并且运算为将值与数据元素相加,这些实施例可以将值添加到向量中的任意数量的元素。应当注意,针对处理器102的不同实现,N可以不同。
在各个实施例中,向量执行单元204可以包括至少一个控制信号,该控制信号实现向量执行单元204对其进行计算的操作数向量中的数据元素的动态限制。具体地说,依赖于控制信号的状态,向量执行单元204可以选择性地对向量中的任意或全部数据元素进行运算。例如,在向量长度是512位并且被运算的数据元素是四字节元素的实施例中,控制信号可以被断言(assert)以防止对操作数向量中的某些或全部16个数据元素执行运算。请注意,“动态地”限制被执行运算的操作数向量中的数据元素会涉及针对运行时的每个周期分开地断言控制信号。
在某些实施例中,如下文所更详细地描述的,基于谓词的向量或者一个或多个标量谓词中所包含的值,向量执行单元204仅对所选的向量数据元素应用向量运算。在某些实施例中,在结果向量中的剩余数据元素仍然未受影响(也可以被称为“断定(predication)”)或者被强制为零(也可以被称为“归零(zeroing)”或“归零断定”)。在某些实施例中,由于向量执行单元204中的断定或归零而未被使用的数据元素处理子系统(“路线(lanes)”)的时钟被功率控制和/或时钟门控(clock-gate),从而降低向量执行单元204中的动态电力消耗。
在各实施例中,架构可以是向量长度不可知的,以允许在运行时适应并行化。更具体地说,当指令或运算是向量长度不可知的时,可以使用任何长度(高达支持硬件所支持的上限)的向量来执行运算(即,指令等)。例如,在向量执行硬件支持可以包括八个分开的四字节元素(这样具有八个元素的向量长度)的向量的实施例中,向量长度不可知运算可以对向量中的八个元素中的任意数量的元素进行运算。在支持不同的向量长度(例如,四个元素)的不同的硬件实现中,向量长度不可知运算可以对通过底层(underlying)硬件使得其可用的不同数量的元素进行运算。这样,编译器或程序员不需要具有对底层硬件(例如,向量执行单元204)所支持的向量长度的明确的了解。在这样的实施例中,编译器生成或者程序员编写不必依赖于(或使用)特定向量长度的程序代码。在某些实施例中,会禁止在程序代码中指定特定的向量大小。这样,在这些实施例中编译的代码(即,二进制代码)在可以具有不同向量长度的其它执行单元上运行,而潜在地实现了来自支持更长向量的处理器的性能提升。在这样的实施例中,可以用于诸如处理器的给定硬件的向量长度可以在运行期间从系统寄存器中读取。因此,随着处理技术允许更长的向量,在不需要软件开发人员进行任何工作的情况下,传统的二进制代码的执行得到了简单地加速。
通常,向量长度可以被实现为2的幂(例如,2、4、8等)。但是,在某些实施例中,向量长度不需要是2的幂。具体地说,三个、七个或其它个数据元素的向量可以以与具有2的幂个数据元素的向量相同的方式来使用。
在各实施例中,在向量中的每个数据元素都可以包含一个地址,该地址由向量执行单元204使用以并行地执行一系列存储器存取。在这样的实施例中,如果向量的一个或多个元素包含无效的存储器地址,那么会发生无效的存储器读操作。因此,以另外的方式会导致程序终止的无效的存储器读操作反而会使具有有效地址的任何元素被读取并使具有无效元素的元素被标记,从而允许在面对推测的事后认识到是非法的读操作时继续程序执行。
在某些实施例中,处理器102(以及由此而来的向量执行单元204)能够对指针的向量进行运算并使用指针的向量。在这样的实施例中,每个向量的数据元素的数量与每个向量的指针的数量相同,而不用考虑数据类型的大小。对存储器进行操作的指令可以具有指示存储器读取的大小的变量,但是在处理器寄存器中的元素应当与指针相同大小。在这些实施例中,支持32位和64位两种寻址模式的处理器可以选择来允许在32位模式中的每个向量的两倍的元素,从而实现更大的吞吐量。这意味着假定在相同宽度的数据路径的情况下,32位寻址的独特的吞吐量优势。实现特定的技术可以被用于放松要求。例如,通过寄存器配对或某些其它专用机构,在32位寻址模式可以支持双精度浮点数。
在一个实施例中,分支预测单元210可以被配置为针对条件分支指令生成用于取出单元201的分支目标程序计数器地址(PC)。更具体地说,对于有条件分支指令,分支预测单元210可以预测是否采取分支,并且可以基于该预测来生成用于取出单元201的PC。然后,根据预测的分支的结果,指令可以以推测的方式被取、发出和执行。在各实施例中,分支预测单元210可以使用多种预测机制中的任意一种来生成预测。例如,分支预测单元210可以使用为单个分支保留预测状态的局部预测器(例如,状态机、表格、计数器或其它数据结构)、对被视为整体的多个分支全部执行预测的全局预测器、合并本地和全局预测器的元件的混合预测器、或者其它恰当的措施。在某些实施例中,分支预测单元210可以利用动态地适合于在执行期间改变的分支行为(例如,当根据一种技术更好地预测的分支变为根据不同的技术更好地预测时,进行检测和适应)的预测器。
在一个实施例中,误预测单元212被配置为检测何时分支预测是不正确的(例如,分支在被执行时的实际行为不同于该分支的预测行为,这指示该分支被误预测)。另外,误预测单元212可以被配置为提供误预测的指示给执行单元202、206和204,以及分支预测单元210。注意,虽然误预测单元212被示出为分离单元,但是可以设想到,在其它的实施例中,误预测单元212可以是分支预测单元210的一部分,或者,它可以是取出单元201的一部分,或者,它可以是各种执行单元(例如,202、204和206)中的任何一者或全部的一部分。
如上所述,当传统的处理器误预测分支指令时,流水线被误预测路径中的指令冲洗(flush),这是因为鉴于不正确的推测而不应该允许这些推测地发出的指令修改处理器的状态。取出单元201然后可以取出用于正确的非推测路径的指令。但是,对冲洗和填充操作有处罚:在可以恢复有用工作之前,可能需要数百个执行周期。
因此,如下面结合图7的描述更详细地描述的,在一个实施例中,分支预测单元210可以保持各种预测的预测精度信息。与分支指令被预测行为的方式相比,一旦分支指令被执行,就可以基于该分支指令的实际行为来调整给定的分支指令的精度信息。为了避免与在向量分解循环中使用的误预测后向分支相关联的处罚中的一些,当预测精度差时,分支预测单元210可以被配置为抑制预测并等待与循环的迭代数量相对应的信息变成可用的。
宏标量架构概述
指令集架构(被称为宏标量架构)和支持硬件可以允许编译器生成循环的程序代码,而不必完全确定编译时的并行化,以及不需要丢弃有用的静态分析信息。现在将描述宏标量架构的各种实施例。具体地,如下面进一步描述的,提供这样的指令集,该指令集不要求循环的并行化,相反,如果动态条件允许,那么该指令集使得在运行时能够利用并行化。因此,该架构包括使得由编译器生成的代码能够通过切换使用的并行化的量根据运行时的条件在循环迭代的非并行(标量)和并行(向量)执行之间动态地切换的指令。
因此,该架构提供对于循环迭代启用不确定的向量并行化的量但不需要在运行时使用该并行化的指令。更具体地,该架构包括其有效向量长度可以根据运行时条件改变的向量长度不可知指令集因此,如果运行时相关性需要代码的非并行执行,那么以一个元素的有效向量长度进行执行。同样地,如果运行时条件允许并行执行,那么相同的代码以向量并行方式执行到运行时相关性(和底层硬件的向量长度)允许的某种程度。例如,如果向量的八个元素中的两个可以并行地安全执行,那么诸如处理器102的处理器可以并行地执行这两个元素。在这些实施例中,以向量长度不可知格式表达程序代码实现了在现有的系统中不存在的宽范围的向量化机会。
在各种实施例中,在编译期间,编译器首先分析程序代码中的给定循环的循环结构,并且执行静态相关性分析。编译器然后生成程序代码,该程序代码保留静态分析信息并指示诸如处理器102的处理器如何解决运行时相关性和以可能的最大的并行化量处理程序代码。更具体地,编译器可以提供用于并行地执行对应的循环迭代集的向量指令,并且可以提供用于动态地限制向量指令的执行的向量控制指令,以防止循环的迭代之间的数据相关性引起错误。这种方法将并行化的确定推迟到运行时间,其中,关于运行时相关性的信息可用,从而允许软件和处理器使并行化适应于动态地改变的条件。在图3中示出程序代码循环并行化的例子。
参考图3的左边,执行模式被示出具有尚未被并行化的循环的四个迭代(例如,迭代1至4),其中,每一个循环包括指令A至G。串行运算被示出具有垂直堆叠的指令。在图3的右边是已经被并行化的循环的版本。在该例子中,迭代内的每一个指令取决于其之前的至少一个指令,从而使得在给定迭代的指令之间存在静态相关性链。因此,不能对给定迭代内的指令进行并行化(即,给定迭代内的指令A至G相对于该迭代内的其它指令总是被串行地执行)。但是,在可选择的实施例中,给定迭代内的指令可能是可并行化的。
如图3中的循环的迭代之间的箭头所示,在给定迭代中的指令E和后续迭代的指令D之间存在运行时数据相关性的可能性。但是,在编译期间,编译器可以仅仅确定在这些指令之间存在数据相关性的可能性,但是编译器不能断定哪些迭代中相关性实际上将物化,因为该信息仅仅在运行时可用。在该例子中,通过从1E到2D和从3D到4D的实线箭头示出在运行时实际上物化的数据相关性,然而,使用从2E到3D的虚线箭头示出在运行时没有物化的数据相关性。因此,如图所示,运行时数据相关性实际上发生在第一/第二和第三/第四迭代之间。
因为在第二和第三迭代之间不存在数据相关性,所以第二和第三迭代可以被并行安全地处理。而且,给定迭代的指令A至C和F至G仅仅在迭代内具有相关性,因此,给定迭代的指令A能够与所有其他迭代的指令A并行地执行,指令B也可以与所有其他迭代的指令B并行地执行,等等。但是,因为第二迭代中的指令D取决于第一迭代中的指令E,所以,在可以执行第二迭代的指令D之前,必须执行第一迭代中的指令D和E。
因此,在右边的并行化循环中,这种循环的迭代被执行,以适应静态和运行时数据相关性二者,同时实现最大并行化。更具体地,所有四个迭代的指令A至C和F至G被并行地执行。但是,因为第二迭代中的指令D取决于第一迭代中的指令E,所以,在可以执行第二迭代的指令D之前,必须执行第一迭代中的指令D和E。然而,因为在第二和第三迭代之间没有数据相关性,所以这些迭代的指令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的其余元素被设置为零。该运算被称为“归零”,并且在谓词向量之前使用感叹号(“!”)符号来表示。
if(FIRST())goto...;//AlsoLAST(),ANY(),ALL(),CARRY(),
ABOVE(),orNONE(),(whereANY()==!NONE())
因此,下面的指令测试处理器状态标志和分支。
x+=VECLEN;
VECLEN是传输每个向量的元素的数量的机器值。该值由执行代码的处理器在运行时确定,而不是由汇编器来确定。
//注释
以与许多常见编程语言类似的方式,下面的例子使用双斜线来指示注释。这些注释可以提供关于在指示的向量中包含的值或者在对应例子中正在被执行的运算的解释的信息。
在这些例子中,其它的C++格式的运算符保持其传统的涵义,并且在逐个元素的基础上在整个向量上被应用。在利用函数调用的情况中,它们意味着将任何返回值置于目的地寄存器中的单个指令。为了简化理解,所有的向量都是整数的向量,但是,可选择的实施例支持其它的数据格式。
结构循环传递相关性
在下面的代码例子1中,示出使用传统向量架构的“非向量化”的程序代码循环。(请注意,除了非向量化以外,由于数据相关性的细粒性,该循环也不是传统的多线程架构上的可多线程的。)为了清楚起见,该循环已经被提炼(distil)为使循环不可向量化的基本循环传递相关性。
在该例子中,变量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相加,以形成然后被读取到目的地向量中的存储器地址的向量。如果指令被断定或归零,那么只有与有效元素相对应的地址被读取。在描述的实施例中,对无效地址的读取被允许为失效,但是,如果第一有效地址是无效的,那么这种失效只导致程序终止。
VectorWriteInt(Base,Offset,Value)
VectorWriteInt是执行存储器写操作的指令。由数据大小(在这种情况中为整数)标度的偏移的向量Offset与标量基本地址Base相加,以形成存储器地址的向量。值的向量Value被写到这些存储器地址。如果该指令被断定或归零,那么数据仅被写到有效地址。在所述实施例中,对非法地址的写总是产生失效。
dest=VectorIndex(Start,Increment)
VectorIndex是用于生成通过从由Start指定的标量开始值开始以增量单调地调整的值的向量的指令。当指数调整恒定时,该指令可以被用于初始化循环指数变量。当断定或归零被应用时,第一有效元素接收开始值,并且增量仅被应用到后续的有效元素。例如:
x=VectorIndex(0,1);//x={01234567}
dest=PropagatePostT(dest,src,pred)
PropagatePostT指令将如由pred所确定的在src中的有效元素的值传播到dest的后续非有效元素。有效元素和在第一个有效元素之前的任何非有效元素在dest在仍然不变。该指令的目的在于得到条件计算的值,并将条件计算的值传播到如等价的标量代码中所发生的后续循环迭代。例如:
Entry:dest={89ABCDEF}
src={12345678}
pred={00110010}
Exit:dest={89AB44E7}
dest=PropagatePriorF(src,pred)
PropagatePriorF指令将如由pred所确定的src的非有效元素的值传播到dest中的后续有效元素中。非有效元素被从src拷贝到dest。如果谓词的第一元素是有效的,那么src的最后的元素被传播到该位置。例如:
Entry:src={12345678}
pred={10110010}
Exit:dest={82225668}
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如下进行运算:
从全部零的初始化的谓词p2,GeneratePredicates生成将后续的向量计算分解为三个子向量(即,p′,p″,和p′″)的p2的新实例。这使得硬件能够以避免违反循环的数据相关性的组来处理向量。
在图4A中,示出图示在例子1中的循环的标量执行期间的一系列变量状态的示图。更具体地,使用条件式的随机化的50/50的方向分布,示出例子1的循环的变量状态的进程。在图4B中,示出图示例子1的循环的宏标量向量化程序代码的执行的进程的示图。在图4A和图4B中,使用左倾斜虚线标记示出从A[]读取的值,而使用右倾斜虚线标记示出写入B[]的值,并且,使用阴影背景示出“r”或“s”的值(取决于哪一个在给定迭代中改变)。观察到在“s”正改变时“r”绝不改变,反之亦然。
无法防止所有的值从A[]被并行读取或者被并行写入B[],因为任何值集都不参与循环传递相关性链。但是,对于r和s的计算,只有在条件式的值保持相同(即,真或假的运行)的同时,可以并行地处理元素。用于针对该循环执行程序代码的该模式在图4B中示出。注意,该例子使用具有长度为八个元素的向量。当处理第一向量指令时,单独地执行第一迭代(即,向量执行单元204仅处理第一向量元素),但是,迭代1至5被向量执行单元204并行地处理,然后,迭代6至7被向量执行单元204并行地处理。
参考图5A和图5B,示出图示程序代码的向量化的一个实施例的示图。图5A描绘原始源代码,而图5B图示表示可以使用宏标量架构执行的运算的向量化代码。在图5B的向量化代码中,循环1是从源代码的循环,而循环2是处理子向量分区的向量分解循环。
在本例子中,在全长度向量中读取和比较数组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中的虚拟存储器系统(未示出)填充(populate)对应页面,从而确保处理器102可以继续向前进行。
dest=Remaining(Pred)
Remaining指令评估谓词向量Pred,并且计算该向量中的其余元素。这对应于在最后有效谓词之后的无效谓词集。如果在Pred中没有无效元素,那么返回所有的有效谓词的向量。同样地,如果Pred是所有的有效谓词的向量,那么返回无效谓词的向量。例如:
Entry:pred={00101000}
Exit:dest={00000111}
图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指令计算控制哪些元素用于该分解循环的其余部分的谓词。
基于存储器的循环传递相关性
在前面的例子中,编译器能够确定在编译时不存在地址混淆。但是,这种确定通常难以进行或不可能进行。下面的例子3中示出的代码段图示在宏标量架构的各种实施例中如何应对通过存储器(其可能包括混淆现象)发生的循环传递相关性。
例子3:程序代码循环3
在例子3的代码段中,编译器不能确定A[x]是否与A[r]或A[s]混淆。但是,使用宏标量架构,编译器简单地插入导致硬件在运行时检查存储器危险的指令,并且在运行时相应地分解向量,以确保正确的程序行为。检查存储器危险的一种这样的指令是下面描述的CheckHazardP指令。
dest=CheckHazardP(first,second,pred)
CheckHazardP指令通过存储器检查与潜在的数据相关性的两个存储器操作相对应的存储器地址(或指数)的两个向量。向量“第一”保持用于第一存储器操作的地址,并且,向量“第二”保持用于第二运算的地址。谓词“pred”指示或控制“第二”的哪些元素要被运算。随着标量循环迭代在时间上向前进行,表示序列迭代的向量元素在向量内左右出现。在这种语境中,CheckHazardP指令可以评估。该指令可以计算表示相应对的第一和第二存储器操作之间的存储器危险的DIV。该指令可以正确地评估读后写、写后读和写后写的存储器危险。
与上述的ConditionalStop指令一样,与生成被取决的数据的迭代相对应的元素位置可以被存储在目的地向量中的与取决于该数据的迭代相对应的元素位置处。如果不存在数据相关性,那么零可以被存储在目的地向量中的与不具有相关性的迭代相对应的元素位置处。例如:
Entry:first={23456789}
second={87654321}
pred={11111111}
Exit:dest={00003210}
如上所示,第一向量(“第一”)的元素5和第二向量(“第二”)的元素3都访问数组指数6。因此,3被存储在DIV的位置5中。同样地,第一的元素6和第二的元素2都访问数组指数位置7,导致2被存储在DIV的位置6中,等等。零被存储在不存在数据相关性的DIV中。
在一些实施例中,CheckHazardP指令可以说明各种大小的数据类型。但是,为了清楚起见,只使用数组指数类型来描述指令的函数。
在上面的例子中的存储器访问具有三种存储器危险。但是,在描述的实施例中,可能只需要两个分区来安全地处理相关的存储器操作。更具体地,处理元素位置3上的第一危险使得更低或等同编号的元素位置上的后续相关性无意义(moot)。例如:
在下面的伪代码中示出描述的实施例用来分析DIV以确定向量应该在何处打破的处理。在一些实施例中,处理器102的向量执行单元204可以并行地执行该计算。例如:
该向量可以在间隔[STARTPOS,x)上被并行安全地处理,其中,x是DIV[x]>0的位置。也就是说,从STARTPOS直到(但不包括)位置x,其中,STARTPOS是指在之前处理的元素集之后的第一向量元素。如果之前处理的元素集是空的,那么STARTPOS在第一元素处开始。
在一些实施例中,可以使用ConditionalStop和/或CheckHazardP指令在代码中生成多个DIV。但是,GeneratePredicates指令使用单个DIV来对向量进行分解。存在两种处理这种情形的方法:(1)分解循环可以被嵌套;或者(2)DIV可以被组合并使用于单个分解循环中。任一种方法都产生正确结果,但是,最佳的方法取决于讨论的循环的特性。更具体地,在多个DIVS被期望不具有相关性的情况中,例如,当仅仅编译器不能确定输入参数上的混淆现象时,这些实施例可以将多个DIV组合为一个,从而减少分解开销。另一方面,在期望多种实现的存储器危险的情况中,这些实施例可以嵌套分解循环,从而提取可能的最大并行化(假设存在额外的并行化的前景)。
在一些实施例中,使用如下面示出的VectorMax(A,B)指令来组合DIV。
i2=CheckHazardP(a,c,p0);//i2={00202400}
i3=CheckHazardP(b,c,p0);//i3={00133000}
ix=VactorMax(i2,i3);//ix={00233400}
因为DIV的元素应该只包含表示时间上较早的相关性的小于该元素的位置的编号,所以后续的相关性仅仅起到进一步约束致分解的作用,其使得使从GeneratePredicates指令的角度来说较低值是冗余的。因此,获取所有DIV中的最大值有效地使得GeneratePredicates指令返回可以被并行安全地处理的元素集的相交。
图7是图示示例向量化程序代码的一个实施例的示图。更具体地,图7中示出的代码样本是图3中的代码(如上面呈示的)的向量化版本。参考图7,在C[]或D[]与A[]之间不存在混淆现象,但是,对A[]的运算可以相互混淆。如果编译器不能排除与C[]或D[]的混淆现象,那么编译器可以生成额外的危险检查。因为在这种情况中没有混淆现象的危险,所以对数组C[]和D[]的读操作已经被定位在向量分解循环之外,而对A[]的操作保留在分解循环内。如果实际上不存在与A[]的混淆现象,那么分区保留全向量大小,并且,分解循环简单地失败而没有迭代。但是,对于发生混淆现象的迭代,分解循环分解向量,以考虑数据相关性,从而确保正确的运算。
在图7的代码段中示出的实施例中,在整个地址向量上执行危险检查。但是,在一般的情况中,通常需要检查条件地执行的存储器操作之间的危险。CheckHazardP指令获取指示第二存储器操作的哪些元素是有效的谓词。如果第一运算的所有元素并非都是有效的,那么CheckHazardP指令自身可以被断定具有与第一操作数的有效的那些元素相对应的归零谓词。(注意,对于第一存储器操作被断定的情况,这样可以产生正确的结果。)
下面例子4中的代码段图示在数组E[]上具有存储器危险的循环。代码段条件地读写到数组内的不可预测的位置。在图8中,示出图示示例向量化程序代码的一个实施例的示图。更具体地,图8中示出的代码样本是图4中的代码(如上面呈示的)的向量化宏标量版本。
例子4:程序代码循环4
参考图8,向量化循环包括分别指示数组E[]是否要被读取还是写入的谓词p1和p2。CheckHazardP指令检查存储器危险的地址(h和i)的向量。参数p2作为控制第二存储器操作(写)的谓词被传递到CheckHazardP。因此,CheckHazardP识别对p2断定的无条件读取和条件写入之间的(一种或多种)存储器危险。CheckHazardP的结果是在p1中被断定为零。这样将零放置在用于将不会从E[]读取的元素位置的DIV(ix)中。记得零指示无危险。因此,在ix中存储的结果是表示对p1断定的条件读取和对p2断定的条件写入之间的危险的DIV。因为用DIV中的零表示无危险条件,所以使得这样成为可能。
注意,在上述实施例中,为了检查基于存储器的危险,使用CheckHazardP指令。如上所述,CheckHazardP指令将谓词视为控制第二向量的哪些元素被运算的参数。但是,在其他实施例中,可以使用其他类型的CheckHazard指令。例如,如下面的各种例子所使用的,根据特定的期望的代码实现方式,可以使用省略谓词参数的CheckHazard指令。在一个实施例中,该版本的CheckHazard指令可以简单地对两个输入向量无条件地进行运算。不管哪个版本的CheckHazard指令被使用,注意,与支持结果谓词和/或归零的任何宏标量指令一样,如上所述,可以通过使用谓词向量或归零向量来分别控制通过CheckHazard指令的执行是否修改结果向量的给定元素。也就是说,CheckHazardP指令的谓词参数控制与上述的普通谓词/归零向量不同的指令执行方面。
在谓词生成指令之后的第一后向分支的检测
如上所述,当对代码段进行向量化时,可以在程序代码中使用向量分解循环,该程序代码执行向量化,以正确地处理可能的循环传递相关性,例如,存储器危险。在这种程序代码中,诸如CheckHazard指令(如上所述)的宏标量指令可以生成DIV,通过作为向量分解循环的一部分的宏标量GeneratePredicates指令,稍后可以使用该DIV。另外,向量分解循环使用后向分支作为循环的一部分。如上所述,如果正确地预测该后向分支,那么可以保持处理器性能。但是,如果较差地预测该分支(在很多情况中是这样),那么性能可能会遭殃。因此,在某些情况中,抑制分支的预测并且等待DIV变得可用可能是有利的。也就是说,在一些实例中,在DIV可用之前有效地停止执行的处罚可能小于误预测形成向量分解循环的边界的分支的处罚。
作为会从这里描述的技术受益的向量分解循环的具体例子,在下面的例子5中示出生成表示B[]中的项目的直方图A[]的代码段的例子。
例子5
for(x=0;x<K;++x)
A[B[x]]=A[B[x]]+1;
当编译器对例子5的代码段进行向量化时,它必须识别B[]的向量中的任何元素是否包含相同的值。如果不能实现这样,那么代码将不会识别A[]的哪些元素将要被修改,从而影响同一向量中的A[]的后续修改。在例子6中示出宏标量代码段,该宏标量代码段包括处理例子5中的代码段的任何循环传递相关性的向量分解循环。
例子6
p1=FALSE;
V0=VectorRead(B,x);
V2=CheckHazard(V0,V0);//calculateDIV
PartLoop:
p1=GeneratePredicates(p1,V2);
p1:V1=VectorRead(A,V0);
p1:V1=VectorIncr(V1);
p1:VectorWrite(A,V1);
BranchonCarry-CleartoPartLoop
在例子6的代码段中,CheckHazard指令评估存储器地址以检测存储器危险(产生存储在V2中的DIV),并且,GeneratePredicates指令使用该信息来计算控制可以被并行安全地处理的元素的数目的谓词。如果整个向量不能被并行安全地处理,那么向量分解循环(PartLoop)迭代,直到全向量已经被处理(其由诸如正被设置的传递标记(Carry-flag)的处理器标记之一来指定)为止。
即使实际上在循环中不存在存储器危险,情况也通常是这样,即,编译器不能最后在编译时确定这一点。因此,即使编译器被强迫发出向量分解循环,整个向量也通常在运行时被并行地处理。在这种情况中,传统的分支预测器可以有效地操作,从而预测该循环绝不迭代,并且,保持全性能。
但是,在向量被频繁分解的情况中,传统的分支预测器通常较差地预测,从而负面地影响性能。由于向量分解循环的性质,这样可能是有害的。向量分解循环通常包含彼此串行地相关的指令链。因此,即使分支预测是完美的,该代码段的性能也会受到串行代码的约束。如上所述,对于较差地预测分支,存在性能处罚,并且,由于循环的性质,对于较好预测的有利一面(upside)被限制。此外,在分解循环实际上迭代多于一次的情况中,它将只迭代有限的次数(通常只有几次迭代)。在这些情况中,这样会导致高的误预测率,从而负面地影响功率和性能二者。因此,向量分解循环的分支预测精度可能会是至关重要的。因此,如下面进一步描述的,在检测到跟随在谓词生成指令之后的第一后向流控制指令时,根据接收到的预测精度的指示,可以抑制该流控制指令的预测,直到DIV变成可用为止。
在图9中,示出描绘在形成向量分解循环的程序指令的执行期间图2的处理器的一个实施例的运算的流程图。共同地参考图2至图9,开始于图9的框901,分支预测单元210检测跟随在谓词生成指令之后的第一条件后向分支指令。更具体地,在一个实施例中,条件后向分支指令可以是分支到目标地址的条件分支指令,该目标地址在分支指令之前(例如,到向量分解循环的开始),并且,该条件分支指令在条件语言评估为真时分支。在例子6中示出的实施例中,条件语言取决于进位清除条件代码。另外,谓词生成指令可以是宏标量GeneratePredicates指令,如上所述,宏标量GeneratePredicates指令可以产生取决于诸如DIV的相关性向量的谓词向量。在一个实现方式中,在GeneratePredicates指令之后被检测到的后向分支指令可以是这样的分支指令,该分支指令基于由上面详细地描述的宏标量CheckHazard指令或宏标量ConditionalStop指令设置的条件代码。注意,尽管与例子6结合使用了宏标量CheckHazard指令,但是可以设想到,可以代替地使用其它版本的宏标量CheckHazard指令,例如,断定的CheckHazardP指令。
如上所述,分支预测单元210可以生成和保持各种分支预测的预测精度信息。因此,分支预测单元210可以被配置为生成和/或接收后向分支指令的预测精度的指示(框903)。在一个实现方式中,精度指示可以是指示精度的精度值,然而,在其它实现方式中,精度指示可以是指示预测精度是否满足预定的精度阈值的二进制信号。
在各种实施例中,出于抑制预测的目的而确定给定的分支被精确地预测还是未被精确地预测的阈值可以是不明确的或硬编码的值,可以通过固件或处理的测试模式运算修改的值,或者可以通过软件自由地修改的值。阈值可以以各种方式被固定或者允许随着运行时行为的结果而动态地改变。在一些实施例中,不同的阈值可以针对不同的分支实例被分开地保持,例如,作为由分支预测单元210保持的分支历史表中的与给定分支相关联的统计数据的一部分。可替换地,代替明确地存储用于不同分支的阈值,分支预测单元210可以简单地存储给定的分支被精确地预测还是未被精确地预测的二进制指示,如上所述。
在一个实施例中,响应于确定后向分支指令的预测精度不满足预定的阈值,分支预测单元210可以被配置为抑制预测,直到DIV可用为止(框905)。更具体地,由于DIV信息指示循环将要迭代的精确的次数,所以,在一个实施例中,分支预测单元210可以被配置为使用DIV信息来预测任何未来的分支。例如,DIV可以指示向量可能需要三轮通过该循环。使用该信息,分支预测单元210可以避免误预测后向分支,因为可以从DIV确信地知道循环迭代数。
在一个实现方式中,分支预测单元210可以在等待DIV的同时停止流水线,从而防止任何额外的指令被取出。在另一个实现方式中,分支预测单元210可以使得处理器102在等待DIV可用的同时切换语境。在另一个实施例中,在DIV信息可用时,分支预测单元210可以将循环取出通知发送到取出单元201。响应于该指示,取出单元201可以使用DIV信息来加载用于向量分解循环的每一次迭代的指令。
注意,等待DIV变成可用可以基本上等同于等待控制分支的条件代码变成可用,因为它们都是由同一指令生成的。这样允许处理器102的取出单元201基于条件代码立即恢复取出,即使它会花费若干周期去分析DIV并相应地配置分支预测单元210。在流水线被停止以等待DIV的情况中,这样可以使流水线停止最少化。还注意,在一个实施例中,即使分支被抑制并使用DIV信息,也可以针对该分支继续追踪分支预测的精确。这样可以允许分支预测单元210检测何时预测的精度满足预测,并且改变其运算模式以预测分支,而不是等待DIV变成可用。也就是说,如果可以提高精度,那么可以在稍后的时间推翻基于较差的精度抑制给定分支的预测的决定。
尽管上面的实施例已经被相当详细地描述了,但是,一旦全面地理解上面的公开,对于本领域的技术人员来说,大量的变型和修改将会变得显而易见。下面的权利要求应当被解释为涵盖所有这样的变型和修改。此外,下面权利要求中的相容的权利要求应当可以以任何合适的组合被实施,并且这些组合具体地旨在被本文明确地公开。
处理器设备可以利用用于以任何合适的组合执行本文描述的任何方法步骤、运算或功能(包括下面列出的方法权利要求的步骤中的任何步骤)的任何合适的装置。因此,例如,即使处理器的结构元件不同于本文描述的示例结构元件,执行本文描述的步骤、运算或功能的处理器设备也被视为在本公开的范围内。

Claims (19)

1.一种用于分支指令预测的方法,包括:
检测跟随在谓词生成指令之后的第一条件分支指令,其中,所述第一条件分支指令在被获取时后向分支,并且其中,所述谓词生成指令在被执行时生成取决于相关性向量的谓词向量,其中所述相关性向量的每一个元素包括指示在向量指令的各元素之间是否存在数据相关性的指数,其中,所述第一条件分支指令形成执行所述向量指令一次或者多次的向量分解循环的一部分;
接收所述第一条件分支指令的预测精度的指示;以及
响应于基于所述预测精度的指示确定所述第一条件分支指令的预测精度不满足阈值,抑制所述第一条件分支指令的预测,直到所述谓词生成指令所取决的相关性向量可用为止。
2.根据权利要求1所述的方法,还包括:响应于检测到所述相关性向量可用,使用在所述相关性向量中指示的数据相关性信息来预测所述第一条件分支指令。
3.根据权利要求1所述的方法,其中,所述谓词生成指令是宏标量生成谓词指令。
4.根据权利要求1所述的方法,其中,抑制所述第一条件分支指令的预测包括预测所述第一条件分支指令以及丢弃所述预测。
5.根据权利要求1所述的方法,其中,抑制所述第一条件分支指令的预测包括在相关性向量可用之前防止新的指令的执行。
6.根据权利要求1所述的方法,其中,抑制所述第一条件分支指令的预测包括丢弃通过所述第一条件分支指令的执行不会改变程序指令执行的控制的流程的在先生成的预测。
7.根据权利要求1所述的方法,还包括:在所述相关性向量变成可用时,使用所述相关性向量来确定响应于所述第一条件分支指令的每一个执行而改变程序指令执行的控制的流程的次数。
8.根据权利要求1所述的方法,其中,抑制所述第一条件分支指令的预测包括在所述相关性向量变成可用之前防止新的指令被取出到执行流水线中。
9.一种处理器,包括:
取出单元,被配置为选择性地取出用于执行的指令;以及
预测单元,所述预测单元与所述取出单元耦接,并且被配置为检测跟随在谓词生成指令之后的第一条件分支指令,其中,所述第一条件分支指令在被获取时后向分支,并且其中,所述谓词生成指令在被执行时生成取决于相关性向量的谓词向量,其中所述相关性向量的每一个元素包括指示在向量指令的各元素之间是否存在数据相关性的指数,其中,所述第一条件分支指令形成执行所述向量指令一次或者多次的向量分解循环的一部分;
其中,所述预测单元被配置为生成所述第一条件分支指令的预测精度的指示;并且
其中,所述预测单元被配置为:响应于确定所述第一条件分支指令的预测精度不满足阈值,抑制所述第一条件分支指令的预测,直到所述谓词生成指令所取决的相关性向量可用为止。
10.根据权利要求9所述的处理器,其中,所述预测单元被配置为:响应于接收到在所述相关性向量中指示的数据相关性信息,预测所述第一条件分支指令。
11.根据权利要求9所述的处理器,其中,所述取出单元被配置为在等待所述相关性向量可用的同时停止。
12.根据权利要求9所述的处理器,还包括执行单元,所述执行单元与所述取出单元耦接,并且被配置为在等待所述相关性向量可用的同时切换语境。
13.根据权利要求9所述的处理器,其中,所述预测单元被配置为生成所述第一条件分支指令的预测,并且其中,为了抑制所述第一条件分支指令的预测,所述预测单元被配置为响应于确定所述第一条件分支指令的预测精度不满足阈值而丢弃所述第一条件分支指令的预测。
14.根据权利要求9所述的处理器,其中,所述第一条件分支指令限定指令循环的边界,并且其中,所述相关性向量指示所述指令循环将要被执行的精确的次数。
15.根据权利要求14所述的处理器,其中,响应于检测到所述相关性向量可用,所述预测单元被配置为提供循环取出指示,并且其中,所述取出单元被配置为:响应于接收到所述循环取出指示,取出用于所述指令循环的每一次迭代的指令。
16.根据权利要求9所述的处理器,其中,为了抑制所述第一条件分支指令的预测,所述预测单元还被配置为在所述相关性向量可用之前防止新的指令的执行。
17.根据权利要求9所述的处理器,其中,所述谓词生成指令是宏标量生成谓词指令。
18.一种用于分支指令预测的系统,包括:
存储器,所述存储器被配置为存储程序指令;以及
与所述存储器耦接的权利要求9至17中的任一项所述的处理器的一个或多个实例。
19.一种处理器,包括:
用于检测跟随在谓词生成指令之后的第一条件分支指令的装置,其中,所述第一条件分支指令在被获取时后向分支,并且其中,所述谓词生成指令在被执行时生成取决于相关性向量的谓词向量,其中所述相关性向量的每一个元素包括指示在向量指令的各元素之间是否存在数据相关性的指数,其中,所述第一条件分支指令形成执行所述向量指令一次或者多次的向量分解循环的一部分;
用于接收所述第一条件分支指令的预测精度的指示的装置;以及
用于在所述谓词生成指令所取决的相关性向量可用之前抑制所述第一条件分支指令的预测的装置,其中,所述抑制响应于基于所述预测精度的指示确定所述第一条件分支指令的预测精度不满足阈值而发生。
CN201310112340.9A 2012-04-02 2013-04-02 提高向量分解循环的性能 Active CN103383640B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/437,482 US9116686B2 (en) 2012-04-02 2012-04-02 Selective suppression of branch prediction in vector partitioning loops until dependency vector is available for predicate generating instruction
US13/437,482 2012-04-02

Publications (2)

Publication Number Publication Date
CN103383640A CN103383640A (zh) 2013-11-06
CN103383640B true CN103383640B (zh) 2016-02-10

Family

ID=48044642

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310112340.9A Active CN103383640B (zh) 2012-04-02 2013-04-02 提高向量分解循环的性能

Country Status (8)

Country Link
US (1) US9116686B2 (zh)
EP (1) EP2648090A3 (zh)
JP (1) JP2013254484A (zh)
KR (1) KR101511837B1 (zh)
CN (1) CN103383640B (zh)
BR (1) BR102013007865A2 (zh)
TW (1) TWI512617B (zh)
WO (1) WO2013151861A1 (zh)

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10241793B2 (en) 2013-03-15 2019-03-26 Analog Devices Global Paralleizing loops in the presence of possible memory aliases
US9323531B2 (en) * 2013-03-15 2016-04-26 Intel Corporation Systems, apparatuses, and methods for determining a trailing least significant masking bit of a writemask register
GB2519107B (en) 2013-10-09 2020-05-13 Advanced Risc Mach Ltd A data processing apparatus and method for performing speculative vector access operations
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
US10289417B2 (en) * 2014-10-21 2019-05-14 Arm Limited Branch prediction suppression for blocks of instructions predicted to not include a branch instruction
US20160179550A1 (en) * 2014-12-23 2016-06-23 Intel Corporation Fast vector dynamic memory conflict detection
GB2540941B (en) * 2015-07-31 2017-11-15 Advanced Risc Mach Ltd Data processing
GB2545248B (en) 2015-12-10 2018-04-04 Advanced Risc Mach Ltd Data processing
GB2548602B (en) * 2016-03-23 2019-10-23 Advanced Risc Mach Ltd Program loop control
GB2549737B (en) * 2016-04-26 2019-05-08 Advanced Risc Mach Ltd An apparatus and method for managing address collisions when performing vector operations
GB2571527B (en) * 2018-02-28 2020-09-16 Advanced Risc Mach Ltd Data processing
US11860996B1 (en) 2018-04-06 2024-01-02 Apple Inc. Security concepts for web frameworks
US10915322B2 (en) * 2018-09-18 2021-02-09 Advanced Micro Devices, Inc. Using loop exit prediction to accelerate or suppress loop mode of a processor
US11403256B2 (en) * 2019-05-20 2022-08-02 Micron Technology, Inc. Conditional operations in a vector processor having true and false vector index registers
US11507374B2 (en) 2019-05-20 2022-11-22 Micron Technology, Inc. True/false vector index registers and methods of populating thereof
US11327862B2 (en) 2019-05-20 2022-05-10 Micron Technology, Inc. Multi-lane solutions for addressing vector elements using vector index registers
US11340904B2 (en) 2019-05-20 2022-05-24 Micron Technology, Inc. Vector index registers
CN115113934B (zh) * 2022-08-31 2022-11-11 腾讯科技(深圳)有限公司 指令处理方法、装置、程序产品、计算机设备和介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5903750A (en) * 1996-11-20 1999-05-11 Institute For The Development Of Emerging Architectures, L.L.P. Dynamic branch prediction for branch instructions with multiple targets
US8131979B2 (en) * 2008-08-15 2012-03-06 Apple Inc. Check-hazard instructions for processing vectors

Family Cites Families (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5228131A (en) * 1988-02-24 1993-07-13 Mitsubishi Denki Kabushiki Kaisha Data processor with selectively enabled and disabled branch prediction operation
JPH1185515A (ja) 1997-09-10 1999-03-30 Ricoh Co Ltd マイクロプロセッサ
US6988183B1 (en) 1998-06-26 2006-01-17 Derek Chi-Lan Wong Methods for increasing instruction-level parallelism in microprocessors and digital system
US6353883B1 (en) 1998-08-04 2002-03-05 Intel Corporation Method and apparatus for performing predicate prediction
WO2000011548A1 (en) * 1998-08-24 2000-03-02 Advanced Micro Devices, Inc. Mechanism for load block on store address generation and universal dependency vector
JP2000322257A (ja) 1999-05-10 2000-11-24 Nec Corp 条件分岐命令の投機的実行制御方法
US7159099B2 (en) 2002-06-28 2007-01-02 Motorola, Inc. Streaming vector processor with reconfigurable interconnection switch
US7571302B1 (en) 2004-02-04 2009-08-04 Lei Chen Dynamic data dependence tracking and its application to branch prediction
US20060168432A1 (en) 2005-01-24 2006-07-27 Paul Caprioli Branch prediction accuracy in a processor that supports speculative execution
US7587580B2 (en) 2005-02-03 2009-09-08 Qualcomm Corporated Power efficient instruction prefetch mechanism
US20070288732A1 (en) * 2006-06-08 2007-12-13 Luick David A Hybrid Branch Prediction Scheme
WO2008029450A1 (fr) 2006-09-05 2008-03-13 Fujitsu Limited Dispositif de traitement d'informations comprenant un mécanisme de correction d'erreur de prédiction d'embranchement
US7627742B2 (en) 2007-04-10 2009-12-01 International Business Machines Corporation Method and apparatus for conserving power by throttling instruction fetching when a processor encounters low confidence branches in an information handling system
US8006070B2 (en) 2007-12-05 2011-08-23 International Business Machines Corporation Method and apparatus for inhibiting fetch throttling when a processor encounters a low confidence branch instruction in an information handling system
US8417921B2 (en) 2008-08-15 2013-04-09 Apple Inc. Running-min and running-max instructions for processing vectors using a base value from a key element of an input vector
US8959316B2 (en) 2008-08-15 2015-02-17 Apple Inc. Actual instruction and actual-fault instructions for processing vectors
US20110283092A1 (en) 2008-08-15 2011-11-17 Apple Inc. Getfirst and assignlast instructions for processing vectors
US8447956B2 (en) 2008-08-15 2013-05-21 Apple Inc. Running subtract and running divide instructions for processing vectors
US8271832B2 (en) 2008-08-15 2012-09-18 Apple Inc. Non-faulting and first-faulting instructions for processing vectors
US8793472B2 (en) 2008-08-15 2014-07-29 Apple Inc. Vector index instruction for generating a result vector with incremental values based on a start value and an increment value
US20100325399A1 (en) 2008-08-15 2010-12-23 Apple Inc. Vector test instruction for processing vectors
US8650383B2 (en) 2008-08-15 2014-02-11 Apple Inc. Vector processing with predicate vector for setting element values based on key element position by executing remaining instruction
US20110035568A1 (en) 2008-08-15 2011-02-10 Apple Inc. Select first and select last instructions for processing vectors
US8984262B2 (en) 2008-08-15 2015-03-17 Apple Inc. Generate predicates instruction for processing vectors
US20100115233A1 (en) 2008-10-31 2010-05-06 Convey Computer Dynamically-selectable vector register partitioning
JP5387819B2 (ja) 2008-12-26 2014-01-15 日本電気株式会社 分岐予測の信頼度見積もり回路及びその方法
US8521996B2 (en) 2009-02-12 2013-08-27 Via Technologies, Inc. Pipelined microprocessor with fast non-selective correct conditional branch instruction resolution
US9176737B2 (en) 2011-02-07 2015-11-03 Arm Limited Controlling the execution of adjacent instructions that are dependent upon a same data condition
US9268569B2 (en) 2012-02-24 2016-02-23 Apple Inc. Branch misprediction behavior suppression on zero predicate branch mispredict

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5903750A (en) * 1996-11-20 1999-05-11 Institute For The Development Of Emerging Architectures, L.L.P. Dynamic branch prediction for branch instructions with multiple targets
US8131979B2 (en) * 2008-08-15 2012-03-06 Apple Inc. Check-hazard instructions for processing vectors

Also Published As

Publication number Publication date
EP2648090A3 (en) 2017-11-01
CN103383640A (zh) 2013-11-06
TW201403470A (zh) 2014-01-16
WO2013151861A1 (en) 2013-10-10
JP2013254484A (ja) 2013-12-19
US9116686B2 (en) 2015-08-25
KR20130112009A (ko) 2013-10-11
US20130262833A1 (en) 2013-10-03
EP2648090A2 (en) 2013-10-09
BR102013007865A2 (pt) 2015-07-07
KR101511837B1 (ko) 2015-04-13
TWI512617B (zh) 2015-12-11

Similar Documents

Publication Publication Date Title
CN103383640B (zh) 提高向量分解循环的性能
CN103353834B (zh) 对零谓词分支误预测的分支误预测行为抑制
US8359460B2 (en) Running-sum instructions for processing vectors using a base value from a key element of an input vector
US9529574B2 (en) Auto multi-threading in macroscalar compilers
US8447956B2 (en) Running subtract and running divide instructions for processing vectors
US9400651B2 (en) Early issue of null-predicated operations
US9182959B2 (en) Predicate count and segment count instructions for processing vectors
CN107810477A (zh) 解码的指令的重复使用
KR102379894B1 (ko) 벡터 연산들 수행시의 어드레스 충돌 관리 장치 및 방법
US9317284B2 (en) Vector hazard check instruction with reduced source operands
US9367309B2 (en) Predicate attribute tracker
US20140025938A1 (en) Prediction optimizations for macroscalar vector partitioning loops
US9442734B2 (en) Completion time determination for vector instructions
WO2020181670A1 (en) Control flow optimization in graphics processing unit
US20130318332A1 (en) Branch misprediction behavior suppression using a branch optional instruction
US9390058B2 (en) Dynamic attribute inference
Ashraf et al. Hybrid model based testing tool architecture for exascale computing system
CN104239001A (zh) 至少一个处理流水线中的操作数生成
Calvert et al. Mapping the join calculus to heterogeneous hardware
KR20220142454A (ko) 다중 simd 양자 프로세서에서의 신뢰할 수 있는 계산을 위한 예견 원격전송
WO2022208173A2 (en) Vectorizing a loop
KR20230116028A (ko) 이중 분기 실행을 사용하는 고도의 병렬 처리 아키텍처

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