向量加载指令的制作方法

文档序号:14649939发布日期:2018-06-08 21:35阅读:125来源:国知局
向量加载指令的制作方法

本技术涉及数据处理领域。更具体地,本技术涉及用于将数据从数据存储的存储位置加载到至少一个向量寄存器中的多个数据元素的向量加载指令。



背景技术:

一些数据处理设备可以支持向量处理,在该向量处理中,可以对向量的每个数据元素执行给定处理操作以生成结果向量的相应数据元素。这允许利用单个指令处理多个不同数据值,以减少处理给定数量的数据值所需的程序指令的数量。向量处理还可以被称为SIMD(单指令多数据)处理。向量加载指令可以用于将数据从数据存储中的相应存储位置加载到至少一个向量寄存器中的各个元素中。



技术实现要素:

至少一些示例提供一种设备,包括:处理电路,用于响应于向量加载指令,执行加载操作以将数据从数据存储加载到至少一个向量寄存器中的多个元素;其中:响应于第一类型的向量加载指令,在针对以预定序列对所述至少一个向量寄存器中的第一有效数据元素执行的加载操作检测到异常条件时,处理电路被配置为执行响应动作,并且在针对以所述预定序列对所述第一有效数据元素以外的有效数据元素执行的加载操作检测到异常条件时,处理电路被配置为抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;并且响应于第二类型的向量加载指令,在针对所述至少一个向量寄存器中的任意有效数据元素执行的加载操作检测到所述异常条件时,处理电路被配置为抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;其中第一类型的向量加载指令和第二类型的向量加载指令通过它们的指令编码被区分。

至少一些示例提供一种数据处理方法,包括:响应于向量加载指令,执行加载操作以将数据从数据存储加载到至少一个向量寄存器中的多个元素;在向量加载指令是第一类型并且针对以预定序列对所述至少一个向量寄存器中的第一有效数据元素执行的加载操作检测到异常条件时,执行响应动作;在向量加载指令是第一类型并且针对以所述预定序列对所述第一有效数据元素以外的有效数据元素执行的加载操作检测到异常条件时,抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;以及在向量加载指令是第二类型并且针对所述至少一个向量寄存器中的任意有效数据元素执行的加载操作检测到异常条件时,抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;其中第一类型的向量加载指令和第二类型的向量加载指令通过它们的指令编码被区分。

至少一些示例提供一种设备,包括:用于响应于向量加载指令而执行加载操作以将数据从数据存储加载到至少一个向量寄存器中中的多个元素的装置;其中:响应于第一类型的向量加载指令,在针对以预定序列对所述至少一个向量寄存器中的第一有效数据元素执行的加载操作检测到异常条件时,用于执行的装置被配置为执行响应动作,并且在针对以所述预定序列对所述第一有效数据元素以外的有效数据元素执行的加载操作检测到异常条件时,用于执行的装置被配置为抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;并且响应于第二类型的向量加载指令,在针对所述至少一个向量寄存器中的任意有效数据元素执行的上述加载操作检测到异常条件时,用于执行的装置被配置为抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;其中第一类型的向量加载指令和第二类型的向量加载指令通过它们的指令编码被区分。

至少一些示例还提供一种计算机程序,用于控制计算机以提供对应于上述设备的虚拟机执行环境。计算机程序可以存储在计算机可读取存储介质上,该存储介质可以是非暂态存储介质。

至少一些示例提供一种计算机实现的方法,用于基于源程序来生成用于由处理电路进行处理的指令,该方法包括:在源程序内检测包括多个迭代的源循环,每个迭代包括第一类型的向量加载指令,该第一类型的向量加载指令用于触发处理电路来执行加载操作以将数据从数据存储加载到至少一个向量寄存器的多个数据元素,其中第一类型的向量加载指令具有编码,该编码指示在由处理电路针对以预定序列对所述至少一个向量寄存器中的第一有效数据元素执行的加载操作检测到异常条件时,处理电路将执行响应动作,并且在针对以所述预定序列对所述第一有效数据元素以外的有效数据元素执行的加载操作检测到异常条件时,处理电路将抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;以及响应于检测到源循环,生成针对经展开的循环的指令,该经展开的循环包括少于源循环的迭代,其中经展开的循环的每个迭代对应于源循环的至少两个迭代,并且包括:所述第一类型的向量加载指令;及至少一个第二类型的向量加载指令,该至少一个第二类型的向量加载指令具有编码,该编码指示在针对所述至少一个向量寄存器中的任意有效数据元素执行的加载操作检测到异常条件时,处理电路将抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息。

至少一些示例还提供一种数据处理设备,该数据处理设备被配置为执行上述用于生成指令的方法。

可以提供一种计算机程序,包括指令,该指令用于控制计算机以执行上述用于生成指令的方法。计算机程序可以存储在计算机可读取存储介质上,该存储介质可以是非暂态性存储介质。

附图说明

本技术的更多方面、特征及优势将在以下示例描述中显而易见,这些示例将结合附图进行阅读,其中:

图1示意性地示出了数据处理设备的示例,该数据处理设备支持向量数据传送指令;

图2示出了在至少一个向量寄存器中的多个数据元素与数据存储中对应于连续地址块的存储位置之间执行数据传送的示例;

图3示出了将给定大小的数据元素映射至不同大小的地址块的三个示例;

图4示出了使用基址寄存器和立即偏移值来标识要访问的地址块的起始地址的向量数据传送指令的示例,该立即偏移值指定为地址块大小之倍数;

图5示出了处理向量数据传送指令的方法;

图6示出了用于使用向量数据传送指令而生成将由处理电路处理的指令的方法;

图7及图8示出了处理第一类型的向量加载指令的异常条件;

图9示出了处理第二类型的向量加载指令的异常条件;

图10及图11示出了区分第一类型和第二类型的向量加载指令的两个示例;

图12示出了用于记录累积故障信息的故障寄存器的使用,该累积故障信息标识哪个数据元素触发了针对指示序列的异常条件;

图13示出了用于使用故障信息来控制对执行检测到故障的向量加载指令的重复尝试的两种不同技术;

图14示出了处理向量加载指令的异常条件的方法;

图15示出了使用第一类型和第二类型的加载指令生成将由处理电路处理的指令的方法;并且

图16示出了虚拟机实现方式。

具体实施方式

现在将描述一些特定示例。将理解,本发明不限定于这些特定示例。

图1是其中可以采用所描述实施例的技术的系统的框图。在图1所示的示例中,该系统采用流水线处理器的形式。由提取电路10从指令缓存15(通常经由一个或多个其他等级的缓存(诸如等级2缓存50)耦合至存储器55)提取指令,从提取电路10它们被传递通过解码电路20,解码电路20解码每个指令以生成用于控制流水线处理器中的下游执行资源的适当控制信号,以执行指令所需的操作。将形成解码指令的控制信号传递至发布阶段电路25,用于发布至流水线处理器中的一个或多个流水线30、35、40、80。可认为流水线30、35、40、80共同形成处理电路。

发布阶段电路25可访问寄存器60,在寄存器60中可存储操作所需的数据值。具体地,针对向量运算的源操作数可被存储在向量寄存器65中,并且针对标量运算的源操作数可被存储在标量寄存器75中。此外,一个或多个谓词(掩码)可被存储在谓词寄存器70中,以当执行某些向量运算时用作针对所处理的向量操作数的数据元素的控制信息。一个或多个标量寄存器还可用于存储数据值,该数据值用于导出这类控制信息以在某些向量运算的执行期间使用(例如,向量加载/存储指令可指定标量寄存器为下文讨论的基底寄存器)。

寄存器16还可包括用于提供各种控制信息的多个控制寄存器76,控制信息例如用于控制处理流水线的操作的配置信息,或者指示在处理期间生成的条件或指令结果的属性的状态信息。例如,控制寄存器76可包括第一故障寄存器(first faulting register,FFR)78及向量大小寄存器(vector size register,VS)79,将在下文更详细地描述。

源操作数及任何相关联的控制信息可经由路径47被路由到发布阶段电路25,以使得它们连同标识待执行的(一个或多个)操作的控制信号可被调度至适当的执行单元以实现每个所解码的指令。假设在图1所示的各种执行单元30、35、40、80为用于对向量操作数进行运算的向量处理单元,但若需要,则可提供单独的执行单元(未显示)以处理装置所支持的任何标量运算。

考虑到各种向量运算,可例如将算术运算连同所需的源操作数(及诸如谓词之类的任何控制信息)一起转发到算术逻辑单元(arithmetic logic unit,ALU)30,以实现将在这些源操作数上执行的算术或逻辑运算,并且结果值通常被输出为用于存储在向量寄存器组65中的指定寄存器中的目的地操作数。

除ALU 30之外,可提供浮点单元(floating point unit,FPU)35以执行响应于所解码的浮点指令的浮点运算,并且可提供向量排列单元80以对向量操作数执行某些排列运算。此外,加载/存储单元(load/store unit,LSU)40用于执行加载操作以将数据值从存储器55(经由数据缓存45及任何介入的其他等级的缓存,诸如等级2缓存50)加载到寄存器组60中的指定寄存器,并且用于执行存储操作以将数据值从执行寄存器存储回存储器55。应了解,还可提供未在图1中示出的其他类型的执行单元。

图1所示的系统可以是按程序顺序执行指令序列的有序处理系统,或者可以是乱序系统,允许在其中出于尝试提升性能的目的来重新排序执行各种指令的顺序。如本领域技术人员将理解的,在乱序系统中,可提供额外结构(未在图1中明确示出),例如提供寄存器重命名电路以将由指令指定的架构寄存器映射至来自寄存器组45中的物理实体寄存器池的物理寄存器(该物理寄存器池通常大于架构寄存器的数量),因此使得移除某些风险,促进更多使用乱序处理。此外,通常可提供重排序缓冲器以追踪乱序执行,并且允许按顺序提交各种指令的执行的结果。

在描述的实施例中,图1的电路本文布置为对存储在向量寄存器65中的向量操作数执行向量运算,其中向量操作数包括多个数据元素。针对对这样的向量操作数执行的某些向量运算(诸如算术运算),可将所需的运算并行(或迭代)地应用至向量操作数中的各种数据元素。谓词信息(还称为掩码)可用于标识向量中的哪些数据元素是针对特定向量运算的有效数据元素,并且因此是应当应用运算的数据元素。

当将要处理较大数据阵列并且需要将相同运算组应用至阵列的每个成员时,向量处理可以是特别有用的。利用完全标量方法,指令序列需要从数据缓存45或存储器55加载阵列的每个元素,处理该元素,并随后将结果存回存储器,针对阵列的每个元素重复该序列。相反,利用向量处理,单一指令可将阵列的多个元素加载到一个或多个向量寄存器65的若干数据元素中,并然后在随后将结果存回数据存储之前,由一组通用指令处理在向量寄存器中的这些元素中的每一个。这可允许响应于单一指令序列来处理多个待处理的元素(优选地,允许至少一些元素被并行处理)以通过减少提取、发布及执行指令的数量来提升性能。

因此,如图2所示,向量处理系统可支持向量加载或存储指令(本文共同称为向量数据传送指令),这些指令用于在对应于连续地址块100的数据存储中的存储位置与至少一个向量寄存器65中的多个数据元素之间传送数据。针对加载指令,至少一个向量寄存器65的每个有效元素102加载有数据,该数据是从连续地址块100的相应部分104读取的。针对存储指令,将来自给定有效数据元素102的数据存储至连续块100的对应部分104的存储位置。

响应于给定向量数据传送指令而访问的地址块100具有特定大小SB。块大小SB=NR×NE×SS,其中:

·NR是作为指令目标的寄存器的数量,

·NE是在每个寄存器中的数据元素的数量,以及

·SS是由对应于寄存器65的单一数据元素102的地址块的子部分104中的一个表示的地址的单元的大小。

参数NR、NE、SS中的每一个可以是下列项中的任一项:

·针对给定处理器硬连线的固定值(例如,一些处理器仅可支持目标为单一向量寄存器的加载/存储指令),

·在控制寄存器76的一者中(明确地或隐式地经由对另一变量的依赖性)指定的可变值,或者

·在向量数据传送指令的编码中(明确地或隐式地经由对另一变量的依赖性)指定的可变值。例如指令编码的运算码或另一字段可标识哪个值用于NR、NE、和/或SS。

因此,不同指令集架构可选择表示这些参数的不同方式。

例如,如图1所示,可提供向量大小寄存器79以标识向量大小VS,对应于在一个向量寄存器65中的位的总数量,并且指令编码可标识用于当前运算的数据元素大小ES(即一个数据元素中的位或字节的数量)。标识可变控制寄存器中的向量大小VS可用于允许跨可使用不同向量大小来实现的一系列平台执行同一代码。由于处理电路可确定NE=VS/ES,每寄存器数据元素的数量NE可通过指定数据元素大小ES由指令隐式地标识。在此情形下,连续地址块大小SB还可表示为SB=NR×VS/ES×SS。

应注意,SB、VS、ES及SS可以以给定长度的某些单元表示,例如,作为若干位或若干字节、或若干多个位或字节、或一些其他数据单元。在下面的示例中如果以字节表示SB,则SS也应以字节表示,但VS及SS可以以其他单元(例如,位、字节)表示,只要它们是相同的。一般而言,SB及SS应在相同单元中,并且VS及ES应在相同单元中,但SB及SS可在与VS及SS不同的单元中。

另一方面,可由指令编码确定寄存器的数量NR。例如,运算码可指定这是单一、双重还是三重寄存器加载/存储,也就是说,或该指令可包括指定寄存器的数量NR的字段。

此外,还可由指令编码标识存储单元大小SS(同样,不同运算码可映射至不同存储单元大小SS,或在编码标识SS中可存在字段)。图3示出了存储单元大小SS可能不同于数据元素大小ES的原因的示例。如图3的部分A)所示,一些指令可利用来自数据存储的相应数量的数据填充给定数据元素大小的数据元素(例如,ES=32位=4字节),使得SS=ES=32位=4字节。然而,如图3的部分B)及C)所示,一些处理器还可允许来自数据存储的较少量的数据传送至较大数据元素或从较大数据元素传送。例如,图3的部分B)及C)示出了其中存储单元大小SS分别是2字节及1字节的示例。利用这样的向量加载,来自大小为SS的存储器单元的数据被符号扩展或零扩展以填充大小为ES的一个数据元素。相似地,针对存储指令,当将数据存储至数据存储中时,将来自数据元素的4-字节值截断为2字节或1字节。

在另一方面,其他系统可能不支持当加载或存储存储器时扩展或截断数据,在此情况下SS可以是等于数据元素大小ES的固定值,并且在此情况下SB简单地等于NR×VS并不必在指令或控制寄存器中指定SS。

应注意,尽管块大小SB等于NR×NE×SS,但并不必通过将这些参数相乘来确定。如上所示,这些参数中的一个或多个可以是固定或可基于另一相关参数来确定,因此存在生成相等结果的其他方式。此外,如果元素的数量NE、存储单元大小SS及诸如向量大小VS或数据元素大小ES之类的任何其他相关参数一般是2的幂,则不同于将这些值相乘,可使用移位运算生成相等结果。

此类连续向量加载/存储指令可用于形成程序循环,此循环可重复地从数据存储加载数据块SB,使用一系列向量数据处理指令以某种方式处理此程序循环(例如,向量加法、向量乘法等),并且随后在将块100的起始地址增加对应于针对后续迭代的块大小SB之前,将结果向量存储回存储器。因此,向量化代码通常可包括下面所述的形式的循环:

注意,尽管该简单示例示出了每迭代仅单一向量加载,但实际上,在每个迭代中将加载若干不同的向量以允许在后续数据处理中合并这些向量。

然而,提供这种循环在执行用于控制围绕该循环的程序流是生成性能成本。除了加载/存储指令及实际数据处理指令之外,还需要用于管理循环的一些额外指令,例如,用于递增/递减表示循环已执行多少次的指针或循环计数器(例如,上文[x0])的指令、用于比较指针或计数器与极限值以确定何时结束该循环的指令、及用于当尚未满足终止条件时分支回到循环的开始的条件分支指令。这些指令将必须在循环的每个迭代上执行,并且这降低性能,特别是当循环控制指令的数量与用于实际数据处理的向量指令的数量相比比较大时。

为降低循环控制的成本,可以执行循环展开以利用具有较少迭代的展开循环来替代源代码中的给定程序循环。展开循环的每个迭代可具有更多指令以高效地执行原始源循环的多个迭代的处理。例如,若展开循环的每个迭代包括用于处理对应于存储器中的4个不同的数据块的数据的4序列的加载、数据处理及存储指令,则循环控制开销可降低3/4。下面示出了这样的展开循环的示例:

尽管循环的单个迭代较长,但通过执行控制指令(例如,incb、cmp、bge),可以不经常提升总性能。除了降低循环控制开销之外,还可以通过实现诸如软件流水线化或模块调度之类的其他优化技术来提升性能,这可允许对处理器资源的更好的利用。例如,展开循环的一个迭代中两个或更多个不同的向量指令可以至少部分地并行处理(例如,通过使用较大向量大小),而在原始源循环中在该时间将遇到仅一个指令以使得这类提升不可用。在一些情形中,可在软件中执行循环展开,例如,通过将源代码编译为由处理器硬件执行的可执行代码的编译器。然而,还可以在硬件中执行循环展开,例如,通过可检测循环并使用展开循环将其替代的流水线的较早阶段。

然而,出于若干原因,使用仅寄存器值来指定传送的起始地址的连续向量数据传送指令不良好地支持循环展开。连续向量数据传送指令可指定地址的块100的起始地址#A,该地址使用指定基址的标量基底寄存器以及指定将被添加到基底寄存器以形成起始地址#A的索引值的标量索引寄存器(index register)来访问。然而,该方法不利于循环展开,由于它在执行循环以初始化由展开循环的每个相应的向量数据传送指令使用的全部索引寄存器之前需要开销,并且在循环中还需要用于递增每个索引寄存器的额外指令。此外,使用额外的索引寄存器增加标量寄存器文件上的压力,因为在循环的每个迭代中将需要引用更大量的寄存器。若没有足够的标量寄存器来容纳在循环的一个迭代中需要的全部值,则随后此需要将来自一些寄存器的数据存储至存储器或缓存(例如,推送至堆栈),并且将寄存器溢出和填充到堆栈上是不期望的,因为它可能危害性能。

替代地,如图4所示,提供一种向量数据传送指令,该指令使用基底寄存器120及立即偏移值122来标识连续地址块100的起始地址#A。立即值是在指令编码中直接指定而非引用寄存器的值。除基底寄存器120及立即偏移122之外,指令编码还可包括标识待执行的运算类型的运算码124、对一个或多个目标寄存器126的指示、及对存储用于控制向量运算的谓词值的谓词寄存器128的指示。

似乎惊讶的是,使用基底寄存器120及立即偏移122来指定目标地址的连续向量数据传送指令将是有用的。尽管使用立即值来指定偏移而非使用索引寄存器避免了初始化及递增展开循环中的索引寄存器的成本及与使用更多寄存器相关联的增加的寄存器压力,但实际上,用于向量处理器的向量大小可以非常长(例如,256字节)并且用于每个指令的块大小SB可相对较大。如果将原始循环的4或8个迭代展开为展开循环的单一迭代,则针对循环的最后一个数据传送的所需偏移可能较大并可需要大量位数以在指令编码内的立即偏移中进行表示。实际上,许多向量指令集架构具有受限的可用编码空间,因为指令编码的大部分位已被用于指定运算码、目标寄存器、谓词值、基底寄存器及给定指令可能需要的任何其他参数,并且因此可能简单地不存在用于较大立即偏移的足够空间。增加指令编码中的位数还可能不是选项,因为这将增加用于在处理流水线中传送指令的总线大小并增加存储给定程序所需的存储器空间的数量,在功率消耗及电路区域方面该给定程序可能过于昂贵。使用立即偏移值的另一问题是当正在生成展开循环时可能不知道在针对展开循环中的连续数据传送指令的起始地址之间的差异,因为如上文所讨论的,不同硬件实现方式可使用不同的向量大小,或者向量大小在单一实现方式中是可变的,并且因此编译器序(或执行循环展开的其他软件或硬件)可能无法得知针对给定指令应指定什么偏移。出于这些原因,使用基底寄存器及简单的立即字节偏移来指定给定指令的起始地址似乎不是可行选项。

然而,在图4所示的向量数据传送指令中,立即偏移不被指定为绝对值,而是作为待加载的地址的连续地址块的块大小SB的倍数。加载/存储单元40可包括生成起始地址#A的地址生成单元,该起始地址的值等于将存储在标量基底寄存器Xb的之基址与立即偏移值imm与块大小SB的乘积相加的结果。如上文针对图2所讨论的,确定区块大小SB等于NR×NE×SE。可以不同方式确定立即值imm与块大小SB的乘积。尽管一些实现方式可实际上将立即值imm乘以块大小SB,但若块大小SB是2的幂,则另一选项是将立即值imm左移对应于log2(SB)的位数。可随后将该乘积加高基址以生成起始地址#A。

图5示出了处理连续向量数据传送指令的方法。在步骤130处,确定该指令是否是指定基底寄存器及立即偏移的连续向量数据传送指令。若不是,则以另一方式处理该指令。若该指令是指定基底寄存器及立即偏移的连续向量数据传送指令,则在步骤132处,加载/存储单元40计算起始地址#A,该起始地址的值等于基址#基底加上乘积imm×SB的结果。注意,可以以给出等于#基底+imm×SB的结果的任何方式来确定起始地址#A,但实际上不需要以此方式计算(例如,可使用上文讨论的移位来实现乘法)。在步骤134处,加载/存储单元利用与在地址#A开始的地址的连续块100的相应部分相对应的每个数据元素,以及当该数据元素由谓词寄存器128中的谓词标识为有效数据元素时在给定数据元素和地址块100的相应部分104之间执行的数据传送来触发一系列的数据传送。例如,目标寄存器的最低有效元素可映射至地址#A处的数据,下一元素可映射至地址#A+SS处的数据,以此类推,其中一个或多个目标寄存器65的第n个元素对应于地址#A+n*SS(其中0≤n<NR×NE)。

该方法解决了上文讨论的问题,因为通过将立即偏移指定为块大小SB的倍数,在编写程序代码或编译代码时不必知道向量大小VS。这允许通过具有不同向量大小的一系列不同的硬件实现方式来执行同一指令。此外,由于实际上指定立即偏移的连续向量加载/存储指令仅有用于循环展开,并且寄存器压力将趋于限制可被展开为展开循环的单一迭代的原始源循环的迭代数量,因此实际上可使得立即偏移122非常小。例如,在许多系统中,将原始循环的多于8个的迭代展开为展开循环的单一迭代是不常见的,并且因此表示值0到7范围内的正值的之3位无符号立即值可以是足够的。这表示甚至当指令集架构具有受限编码空间时,非常小的立即偏移122仍可适合于指令集编码。

尽管图4示出了使用指令的位的给定模式的指令编码,但在汇编语法中该指令可如下表示:

LD1H Zd.S,Pg/Z,[Xb,#1]

LD2H{Zd1.H,Zd2.H},Pg/Z,[Xb,#2]

LD3H{Zd1.H,Zd2.H,Zd3.H},Pg/Z,[Xb,#3]

其中在全部上述示例中,将立即值编码为4位二进制值0b000l,但在语法中将其表示为正在从存储器加载的寄存器的数量的倍数。助忆符(mnemonics)LD1H、LD2H、LD3H指正被加载的寄存器的数量(即NR分别等于1、2及3)。替代地,针对上文所示的3种情形汇编语法可将立即值定义为#1。

下文示出了针对循环展开使用该形式的指令的示例:

//使用向量长度多次加载展开×4向量循环

//x0=针对当前循环迭代的阵列指针

//p0-p3=针对展开迭代#0至#3的谓词

//z0-z3=针对展开迭代#0至#3的加载结果

在该示例中,展开循环的第一向量加载指令具有立即偏移0并且连续的其他加载指定立即偏移1、2、3等,以指示每个加载将分别从由该数目单元的块大小SB替代的地址块加载数据。

然而,实际上,展开循环的第一加载不必指定0偏移。软件流水线化技术可期望在循环的某位置处而非在循环的开始或结束处递增循环指针,并因此在该情形下,针对基底寄存器的参考点可以是展开循环的中间加载指令中的一个的地址。这可以使得允许指定负偏移是有用的。因此,可将立即偏移值122指定为可以以具有给定位数的2的补码形式编码的有符号整数值。例如,4个位可编码在-8至+7范围内之2的补码值。例如,若在前两次加载之后但在最后两次加载之前执行针对此循环的递增,则偏移可如下定义:

图6示出了执行循环展开的方法。该方法可由生成用于处理电路响应于给定源程序来处理的指令的任何软件或硬件来执行。例如,该方法可由采用源程序并生成待执行的编译代码的编译器来执行,或者该方法可由将实际执行指令的同一处理流水线中的电路来动态执行。通常,执行循环展开的硬件或软件被称为循环展开器。

在步骤140处,接收源程序的指令。在步骤142处,检测源程序是否包括具有多个迭代的源循环,其中每个迭代i包括向量数据传送指令,其目标为大小是SB并具有起始地址A[i]的连续地址块。若该源程序不包括这样的循环,则该方法结束并且以另一方式处理该源程序。然而,如果源程序包括这样的源循环,则在步骤144处,则循环展开器生成针对与源循环相比具有较少迭代的展开循环的指令,其中展开循环的每个迭代对应于源循环的N个迭代,并且至少包括使用基底寄存器及零偏移来指定起始地址的参考向量数据传送指令,以及使用基底寄存器及被指定为块大小SB的倍数的立即值来指定起始地址的至少一个其他的向量加载或存储指令。展开循环的每个迭代还可包括用于将基底寄存器递增对应于N×SB的量的递增指令。根据在循环中递增底寄存器的时序,参考指令可较早、较迟或中途通过循环的其他向量数据传送指令。可以以如上文所述的相同方式使用立即偏移或如将在下文讨论的使用寄存器参考来指定参考向量数据传送的零偏移。

在步骤146处,输出所生成的指令以用于由处理电路处理。例如,指令可被输出为编译程序,其随后可被存储至存储器55以用于由处理电路处理。替代地,若在流水线中动态地执行展开,则可将输出指令发送至随后阶段以用于处理。

立即偏移字段122的特定大小可取决于正在使用的特定指令集架构。实际上,向量寄存器60、标量寄存器75或谓词寄存器70的数量可有效限制可被展开为展开循环的单一迭代源循环的迭代的数量,并且因此不可用于提供适应大于该限制的任何值的立即偏移字段122。例如,若预期源循环的每个迭代将使用最大数量的R个标量寄存器,并且该架构定义M个标量寄存器,随后实际上可被展开为单一迭代的源循环的迭代的最大数量将是M/R,并因此可选择立即偏移字段122的大小以使得可表示的最大值是M/R-1。还可分配额外的位以适应有符号值,以使得可定义负偏移和正偏移二者。例如,通常R可以是2或4,并且因此针对编码偏移值M/2-1或M/4-1提供充分的位空间可能是足够的。例如,若M=32,则通常展开超过8个迭代可能是罕见,并且因此3位无符号偏移字段或4位有符号字段可能足以适应其中很可能使用具有立即偏移的向量数据传送指令的最实际的情况。另一方面,若与标量寄存器相比具有较少的谓词寄存器70,则谓词寄存器的数量是对实际上可被展开为展开循环的单一迭代的循环的迭代数量的限制因素。因此,通常存在限制展开的数量的一些约束,并且可以基于针对给定实现方式生成的约束来选择立即偏移字段122的大小。

综上所述,使用基底寄存器及立即偏移值来标识连续地址块的起始地址的向量数据传送指令令人惊奇地甚至可用于具有相对较长向量或具有可变向量长度的系统。由于立即偏移值被定义为连续地址块的大小的倍数,其可根据由硬件使用的向量长度来可变地选择,因此不必提前知道绝对块大小,并且因此可跨使用不同向量长度的不同平台或在支持可变向量长度的平台上执行同一代码。由于对于循环展开,预期被展开的迭代的数量相对较小,则在指令编码中立即偏移值不需要较大字段,并且因此甚至可用于具有受限可用编码空间的指令集架构。

尽管该形式的向量数据传送指令可用于使用固定大小的连续地址块的装置,它特别地可用于提供可变大小的地址块的装置。装置可具有用于存储可变控制参数的存储元件,当执行该指令时可读取该可变控制参数以确定应用于立即偏移值的乘数以形成对该基址的偏移的乘数。例如,可变控制参数可以是标识一个向量寄存器的大小的向量大小。

可以以各种方式确定待访问的连续块的起始地址,该起始地址等于基址加上立即偏移值和对应于连续地址块的大小的乘数的乘积,但在实际上不需要以此方式来确定。该乘数可具有等于乘积NR×NE×SS的值,其中NR为针对其数据将响应于向量数据传送指令而被传送的向量寄存器的数量,NE为每个向量寄存器所包括的数据元素的数量,并且SS为对应于单一数据元素的地址的单元的存储单元大小。NR、NE、SS各自可以是固定的,在指令编码中定义或根据存储在控制寄存器中的可变参数来定义。

一种可用方法是针对在控制寄存器中定义的向量大小VS(一个向量寄存器的大小)、针对标识(明确地或隐式地经由运算码)NR、SS及ES(一个数据元素的大小)的指令编码、并且针对等于NR×VS/ES×SS的待确定的乘数。编程器/编译器根据需要执行的运算很可能提前知道NR、NE、SS,而VS则取决于特定的硬件实现方式。因此,使用指令编码在控制寄存器中定义VS而非其他参数NR、SS、ES允许跨使用不用向量大小的一系列硬件实现方式执行同一代码。

不必在实际上执行乘法以确定用于乘以立即偏移的乘数。通常NE、SE、ES、VL的可能的值可对应于2的幂,并且因此左移特定位数可能等于乘法。

立即偏移值可以是无符号整数值,当不需要负偏移时其允许较小的立即字段。替代地,立即偏移值可以是有符号整数值以允许使用负偏移,负偏移是有用的,因为允许负偏移赋予在循环的不同点处更新基址更多的灵活性,例如,其可用于使用软件流水线技术来提升性能。

由向量数据传送指令引用的基底寄存器可以是标量寄存器(与分散-集中型加载/存储指令相反,该分散-集中型加载/存储指令指定向量寄存器以标识针对将被加载/存储的目标向量的每个元素的不同地址)。

在一些情形中,当向量数据传送指令是向量加载指令时,当针对对于向量的给定数据元素执行的加载操作检测到异常条件时,可抑制用于处理异常条件的响应动作,并且替代地可存储元素标识信息以标识哪个数据元素是触发异常条件的给定数据元素。该方法可用于允许循环推测,其中在管理这些元素是否实际上应该已经被处理的相关联条件之前处理一些元素,这可有助于提升性能。这将在下文更详细地讨论。

指定立即偏移值的向量数据传送指令可以是加载指令或存储指令。

处理向量化代码的另一问题为处理异常条件,例如,地址传送故障或存储器许可故障。通常,将由向量化代码处理的数据阵列将不包括块大小SB的准确倍数,并且因此循环的最终迭代可仅具有处理有效数据的一些元素。在一些向量化循环中,循环的每个迭代可具有用于检查所加的载数据元素之一是否满足停止条件的至少一个指令,该停止条件指示已经到达阵列末端,并且若满足该条件则终止循环。如果在加载下一元素之前必须针对停止条件单独地加载和测试每个元素,则可能丢失向量化的性能益处,并且因此通常向量加载指令可加载数据块并随后测试所加载的数据的任何元素是否满足停止条件。因此,可以在实际知道这些元素是否为需要处理的有效元素之前加载一些元素。在用于确定应被处理的元素是否已被处理的相关联条件之前处理至少一个元素的该技术可被称为循环推测。

然而,若循环的给定迭代加载超越将处理的阵列的末端的数据,则这可能导致错误,因为可能未在页表中针对超过阵列的末端的地址定义地址传送数据而导致地址传送故障,或者正被执行的处理可能不具有访问超出阵列的末端的地址的许可而导致存储器许可故障。因此,当使用循环推测时更可能是诸如地址传送故障或存储器许可故障之类的异常条件。

若针对给定数据元素产生异常条件,但仍未到达阵列的末端,则这是有效异常条件并且需要采取相应的响应动作,例如,执行用于处理故障的异常处理例程。例如,异常处理例程可触发操作系统更新页表以针对所需地址定义地址传送映射。然而,针对从超出所需阵列的末端的地址加载的元素,若出现异常条件,则不希望触发响应动作,因为该地址不应以任何方式被访问并且仅将该地址处的加载触发为对代码进行向量化的人为现象,该代码具有超出阵列的末端的给定向量长度VL或块大小SB。因此,当执行循环推测时,可能不期望对全部异常条件触发响应动作。

图7及图8示出了用于对此进行寻址的第一类型的向量加载指令的操作。第一类型的指令还被称作第一故障(first faulting;FF)加载指令,因为该指令在针对正在被加载的向量的第一有效元素检测到异常条件时触发响应动作,而在其他元素出现异常条件时不触发响应动作。在该示例中,设想元素具有自最低有效元素到最高有效元素的预定序列,因此第一有效元素是由谓词值Pg指示为有效的最低有效元素。例如,在图7中,元素0具有谓词位0,并且元素1至3具有谓词位1,因此第一有效元素是元素1。

在图7中,对第一有效元素(元素1)执行的加载操作出现异常条件,因此触发响应动作,如执行异常处理例程。一般而言,第一有效元素将以非推测方式而被加载,因为没有可以导致满足停止条件的更早有效元素,并且因此如果故障发生,则这是有效故障,并且触发响应动作以处理该情况。

另一方面,如图8所示,针对第一故障向量加载指令,如果第一有效元素之外的元素(在该示例中,例如元素2)发生异常条件,则抑制响应动作。相反,处理电路更新第一故障寄存器(first faulting register;FFR)78以标识哪个元素导致了该故障。如果随后的数据元素中的多个数据元素发生故障(除了第一有效元素),则可以在FFR 78中标识这些元素中的第一元素的位置,或如下所讨论的,FFR可以标识发生故障的第一元素和任意随后元素。

该方法一般对循环推测有用,因为该方法意味着在第一有效元素之外的元素出现异常条件时,不立即触发响应动作。FFR 78更新后,一些指令可以检查比发生故障的元素更早的元素是否满足停止条件,如果满足,则无需处理异常条件便终止循环,因为异常条件仅因为向量循环延伸超过待处理数据的末端而出现。另一方面,如果尚未满足停止条件,则FFR 78可以用于标识哪个元素触发了异常条件,并且这可以用于利用现在是第一有效元素的故障元素来触发指令的循环序列的重复,以便在异常条件再次出现时,可以立即触发响应动作,因为故障元素将是第一有效元素。因此,虽然第一故障方法可以延迟正在被处理的有效异常条件(因为指令序列可能需要重复数次以允许故障的每个相应元素被作为第一有效元素而进行处理),但是该开销通常被通过允许每个循环迭代中处理更多元素(导致更少循环控制开销)而达到的效能增益超过,这是可能的,因为虽然在解决停止条件之前循环的每个迭代加载大数据块,但是第一故障机制也阻止了假响应动作被经推测处理的元素而触发,这些响应动作随后被证实并非必要。

如图8所示,FFR 78可以被定义为包括多个位的元素掩码,每个位对应于正在被加载的向量中的元素中的一个。对应于故障元素和任意随后元素的位具有第一值(在该示例中,是0),并且任何比故障元素更早的元素的位具有第二值(在此示例中,是1)。以该方式定义FFR 78可用于使得新谓词或地址能够针对执行指令序列的随后尝试被确定(参看下文图13),使得故障元素变成第一故障元素,以用于随后的尝试。因此,FFR78可以用于允许数据元素的处理在故障解决之后恢复,无需不必要地对未触发故障的元素重复已执行的操作。

因此,该形式的第一故障指令可用于向量化的代码,以阻止对于用于处理被作为向量化假像而引入的异常条件的操作系统或其他软件的不必要陷阱。然而,在执行循环展开时,指令的第一故障形式不对除了经展开的循环的第一指令之外的指令起作用。虽然经展开的循环的第一加载的第一有效元素很可能是非推测性的(因为没有更早的有效元素可以使得停止条件被满足),但是对于后续加载而言,第一有效元素也可以是推测加载元素。通常,一旦经展开的循环内的全部加载均已完成,便可以解决经展开的循环的停止条件,因此除了由经展开的循环的第一加载所加载的第一有效元素之外的任何元素都可能是推测元素,因此对经展开的循环内每个加载的第一有效元素触发响应动作是不期望的。

如图9所示,可以提供第二类型的向量加载指令,该指示被称作非故障(non-faulting;NF)向量加载指令。在执行非故障向量加载指令时,即使第一有效元素出现异常条件,响应动作仍被抑制而FFR 78以与图8类似的方式更新以标识故障的元素。因此,对于非故障类型的加载指令而言,无论哪个元素触发故障,都不触发响应动作,并且更新第一故障寄存器78以标识导致故障的元素。如以下示例所示,这允许循环展开针对经展开的循环中的第一加载而使用指令的第一故障形式(例如ldff1d),并且针对经展开的循环内的随后加载使用指令的非故障形式(例如ldnf1d):

//通过使用非故障加载发明展开x 3向量循环

//x0=当前循环迭代的阵列指针

//p0-p2=经展开的迭代#0至#2的谓词

//z0-z2=经展开的迭代#0至#2的加载结果

可以在指令编码内以任意方式区分两类指示。可以针对这些指令提供两个完全不同的操作码,或在指令编码中提供具有标志的共同操作码,该标志指定指令是第一故障还是非故障。然而,这将需要指令集架构内附加的编码空间,需要附加的操作码被分配用于这些指令,这可以防止另一种操作被包括在指令集架构内,或需要编码的附加位以表示该标志。

因此,编码第一和第二类型的指令的更有效方法可以是使用以下方法,其中地址偏移在指令内被表示为用信号指示该指令是第一类型还是第二类型的指令。如上所述,可以提供指定立即偏移122的指令形式,该立即偏移122表示块大小SB的倍数,这主要对循环展开十分实用,这也是很可能使用第二类型指示的情况。因此,定义地址偏移的方法还可以确定该指令是第一故障还是非故障。

图10示出了区分两类指示的第一示例。在该示例中,如果立即偏移值是零,则指令是第一(第一故障)类型,并且如果立即偏移值非零,则指示是第二(非故障)类型。通常,在执行循环展开时,经展开的循环的第一加载将具有零偏移,并且随后的加载将具有非零偏移,因此立即偏移是否为零可以用于标识故障行为类型。这使得两个指令形式能够触发不同的异常处理行为,无需编码内的任何附加位空间。

图11示出了区分指令的第二示例。除图4中示出的类型的向量加载指令(该指令指定立即偏移)之外,指令集架构也可以包括相应向量加载指令,该相应向量加载指令通过使用索引寄存器而指定偏移。在该情况下,在向量加载指令使用索引寄存器来指定偏移时,指令可以被视作第一故障类型的指令,并且在偏移量由立即值指定时,指令可以被视作非故障类型的加载指令。由于立即偏移值及非故障类型的加载指令的使用很可能主要用于循环展开,使用非故障类型的加载指令的大多数示例也将指定立即偏移值,因此将指定立即值的加载指令默认为非故障避免了耗尽指令编码内任何其他位空间以用于标识非故障行为的需求。

在使用图11中示出的方法时,经展开的循环的第一加载可以使用索引寄存器指定其偏移量,使得其触发第一故障行为。在一些情况下,通用寄存器可以被分配用于存储第一加载的索引,并且虽然这将在每次经展开的循环迭代时需要一个附加标量寄存器,但是因为随后的加载可以使用立即值来指定偏移量,这产生的寄存器压力将小于每个加载都具有单独索引寄存器的情况。在任一情况下,经展开的循环的第一加载往往将使用零偏移,并且一些架构定义预定寄存器,该预定寄存器默认假定等于零(除能设为任何值的通用寄存器之外)。存储零的硬连接寄存器可以在硬件中提供,或预定寄存器可以不对应于实际寄存器,并且处理电路可以将预定寄存器的寄存器说明符映射至零输入值,无需访问寄存器组。因此,通过引用经展开的循环的第一加载的预定寄存器,即使在第一加载通过使用索引寄存器来指定偏移时,也不必耗尽通用标量寄存器。

因此,上文示出的经展开的循环的示例可以基于图11中示出的方法被修正,以使得第一故障指令ldff1d通过引用预定寄存器xzr来标识其偏移,并且第一故障指令根据默认将被视作第一故障,因为该指令使用索引寄存器来标识其偏移,这与非故障指令ldnf1d相反,该非故障指令引用立即值#1、#2等等:

//使用非故障加载发明展开x 3向量循环

//x0=当前循环迭代的阵列指针

//p0-p2=经展开的迭代#0至#2的谓词

//z0-z2=经展开的迭代#0至#2的加载结果

图12示意性地示出了使用FFR 78来追踪根据指令序列出现的异常条件的示例,这些指令序列作用于给定数据元素集,序列中的每个指令使用来自前一指令的结果。如果这些指令中任何指令的给定元素触发故障,则执行该元素及该序列中后续指令的任何后续元素的处理是不期望的。因此,第一故障寄存器能够以累积方式定义,以便在序列开始之前,将所有位设定为等于1,随后,如果任何指令触发给定元素的故障(除了第一故障指令的第一有效元素),则对应于给定元素及任何后续元素的位便在第一故障寄存器78中被清除,而将针对剩余指令序列的位保持空闲。使用与运算结合第一故障寄存器78与谓词值Pg,可由此为任何后续指令生成修正的谓词Pg’,以阻止故障元素被进一步处理。如果后续指令(例如,图12中的指令1)随后对更早的元素生成另一故障,则FFR 78的至少一个其他位可以被清除为0,以使得下一指令将处理更少元素。

或者,并非对前述掩码Pg与FFR进行与运算,如图13所示,而是指令(例如,上文示例中示出的rdffr指令)能够简单地读取FFR并且存储结果至相应寄存器p4/p5/p6,该寄存器被序列的后续指令用作谓词寄存器。

上文示例中的brkn指令具有以下格式:

BRKN Pdm.B、Pg、Pn.B、Pdm.B,

该指令控制处理电路执行以下操作:

如果PN中对应于Pg中最末的(即,最左边、最高有效)真实/有效/非零位的谓词位也是真实/有效/非零,则Pdm保持不变;并且

如果Pn中对应于Pg中最末的(即,最左边、最高有效)真实/有效/非零位的谓词位是假/无效/零,则Pdm清除所有假/无效/零。

换句话说:

Pdm=LastActive(Pg,Pn)?Pdm:0;

(//LastActive()发现Pg中的最左边设定位并且返回Pn中的相同位是否为真)。

换句话说,brkn指令确保如果第一加载检测到故障(意味着该加载之后,FFR中的最后有效元素是假),则通过将该指令全部设定为零来将该故障传播至第二加载的FFR结果,以此类推。Brkn指令将“中断”条件传播至经展开的循环的下一次迭代。

一旦已到达序列末端,则任何成功完成的元素都被视作有效结果,并且循环可以包括一些指令以用于检验FFR 78并解决停止条件,以确定故障元素产生的故障是由于循环推测而产生的假故障(因此故障无需处理及循环可结束),还是需要通过重复序列而处理的有效故障。如图13所示,FFR 78可用于针对执行序列的重复尝试而确定新谓词(掩码)或新地址。图13的左侧示出了利用第一元素产生新谓词,该元素曾发生故障(第一元素在FFR 78中具有‘0’位),现在成为第一有效元素(第一元素在更新的掩码中具有‘1’位)。或者,如图13右侧所示,还可以使用FFR 78更新加载指令的基址,以使得随后尝试的基址现在对应于由故障元素加载的地址。总之,在重复序列时,发生故障的元素现在成为第一有效元素,因此如果该元素再发生故障,则第一故障类型的指令在循环序列开始时将触发回应动作。

图14示出了处理可能遇到异常条件的向量加载指令的方法。在步骤200中,处理器确定当前指令是否为向量加载指令,如果不是,则指令以某个其他方式处理。在遇到向量加载指令时,在步骤202中,对向量的多个数据元素执行加载操作。每个元素的地址可以基于起始地址而计算,该起始地址使用基址寄存器和偏移计算得出,或使用基址寄存器和索引寄存器计算得出。在步骤204中,确定是否检测到向量的任何给定数据元素发生异常条件。如果没有,则方法返回步骤200以处理下一指令,并且加载操作将成功执行。

尽管如此,如果检测到异常条件,则在步骤206中,确定触发故障的给定数据元素是否为向量的第一有效数据元素。如果多个元素触发故障,则确定这些元素的第一元素是否是第一有效元素。如果故障的给定数据元素是第一有效数据元素,则在步骤208中,确定当前的向量加载指令是第一故障类型还是非故障类型。如果向量加载指令是第一故障类型的指令,则在步骤210中,触发响应动作,例如,执行异常处理例程或记录一些指令故障已发生的信息。另一方面,如果指示是非故障形式的指令,则在步骤212中,抑制响应动作(即,不执行),并且在步骤214中,更新第一故障寄存器78以标识故障的给定数据元素。如果在步骤206中,给定数据元素不是第一有效元素,则方法直接从步骤206跳至步骤212(抑制响应动作,并且更新FFR 78,无论该指令是第一故障还是非故障)。

图14中示出的技术可用于所有向量加载指令类型,不仅是上文讨论的类型的连续加载。因此,具有不同故障行为的第一类型和第二类型的加载指令也可以针对收集加载指令被定义,这些指令指定地址向量,该地址向量定义目标向量中每个元素的多个离散地址,其中加载从每个离散地址中收集数据放入该目标向量。

图15示出了生成用于由处理电路进行处理的指令的方法,该方法可以由循环展开器执行,该循环展开器可以以软件(例如,编译器)或硬件(例如,将执行生成的指令的相同流水线内的电路)被实现。在步骤250中,接收源程序的指令。在步骤252中,循环展开器确定源程序是否包括具有迭代的源循环,其中每个迭代包括第一故障向量加载指令,并且如果没有这类循环,则方法结束,并且以一些其他方法生成指示。然而,如果源程序包括源循环,则在步骤254中,循环展开器生成针对迭代少于源循环的经展开的循环的指令。经展开的循环的每个迭代包括第一故障向量加载指令和至少一个非故障向量加载指令。在步骤256中,循环展开器随后输出指令以用于由处理电路处理,源循环被替换为经展开的循环。

将理解,一些循环展开方法可以结合图6及图15的技术,以使用图15示出的第一/第二类型的指令,以及其中至少第二类型的指示使用立即值指定偏移的选项。其他的循环展开方法可以仅使用图6及图15示出的一个或其他技术。

图16示出了可以使用的虚拟机实现方式。虽然前文描述的实施例利用操作支持相关技术的特定处理硬件的设备及方法而实施本发明,但是还可以提供硬件装置的所谓虚拟机实现方式。这些虚拟机实现方式在主机处理器530上运行,该主机处理器运行主机操作系统520,该主机操作系统支持虚拟机程序510。通常,需要大型高功率处理器提供以合理速度执行的虚拟机实现方式,但这类方法在某些环境中可能合理,如在需要运行另一处理器的本端码以获得兼容性的情况下,或出于再使用原因。虚拟机程序510向应用程序500提供应用程序编程接口,该接口与将由实际硬件提供的应用程序编程接口相同,该实际硬件是通过虚拟机程序510模型化的装置。由此,程序指令(包括上述对存储器访问的控制)可以使用虚拟机程序510而在应用程序500内执行,以模型化指令与虚拟机硬件的交互模型。

总之,可以在指令集架构中定义第一类型和第二类型的向量加载指令。针对第一类型的指令,在针对以预定序列对目标向量寄存器的第一有效数据元素执行的加载操作检测到异常条件时,触发响应动作,但在针对除了第一有效元素之外的有效数据元素执行的加载操作检测到异常条件时,抑制响应动作,并且在该情况下,存储元素标识信息,该元素标识信息标识被检测到异常条件的有效数据元素。针对第二类型的指令,在针对目标向量寄存器的任何有效元素执行的加载操作检测到异常条件时,抑制响应动作并且存储元素标识信息。

该方法有助于改良性能,因为该方法允许一起使用用于改良向量化的代码的性能的两个技术,即循环展开(其中循环的多个迭代组合为经展开的循环的单个迭代)和循环推测(其中可以在用于确定加载操作是否应当实际执行的关联条件已经被解决之前执行至少一个有效数据元素的加载操作)。相比之下,利用上述形式的指令,将难以同时使用循环展开及循环推测。通过提供除第一类型之外的第二类型的向量加载指令,在经展开的循环中,在这些元素在循环停止条件已经被解决之前正在被推测处理时,第二类型的指令可以用于阻止假异常处理响应动作被由经展开的循环中并非第一加载指令的指令所处理的元素触发。

一般而言,向量加载指令可以具有指示哪个元素是有效还是无效的掩码(或谓词)。在执行第一类型或第二类型的指令之后,可以执行至少一个其他指令以基于元素标识信息而生成新掩码及新地址中的至少一个,该掩码及地址用于随后对执行第一类型的向量加载指令的尝试。如果生成新掩码,则新掩码可以利用触发异常条件并且现在是第一有效元素的给定数据元素被生成,而如果产生新地址,则新地址可以设置对应于由触发了异常条件的给定数据元素先前加载的地址。随后,在使用新掩码或地址重复第一类型的向量加载指令时,由于故障元素现在是第一有效元素,因此如果故障仍发生,则可以触发响应动作以解决异常条件。

元素标识信息可以以各种方式设置。例如,元素标识信息可以仅是导致了异常条件的给定数据元素的标识符。

然而,一种有用方法是设置以下元素,该元素利用对应于至少一个向量寄存器中每个元素的多个指示来标识掩码,其中针对该向量寄存器正在传送数据。对应于检测到发生异常条件的元素和预定序列中任何后续元素的指示可以设置为第一值(例如,0),并且对应于序列中更早元素的指示(如果有)可以设置为第二值(例如,1)。以该方式定义标识掩码的元素是有用的,因为该方法使得标识掩码的元素与确定哪些元素有效的谓词(掩码)的结合更为简单。

一般而言,哪个元素被视为第一有效元素可以根据任何任意元素序列而确定。例如,预定序列可以从向量的最低有效元素延伸至最高有效元素,或反之亦然。然而,实际上向量往往趋于填充来自位于最低有效元素的最低地址的数据和来自位于最高位元素的最高地址的数据,并且大多数程序设计者/编译器趋于从最低地址向最高地址写循环迭代。因此,在预定序列从最低有效元素延伸至最高有效元素时,这往往正好以写入向量化的代码的方式映射。因此,在某些示例中,第一有效元素可以是寄存器中最低有效的有效数据元素(least significant active data element)。

如上所述的第一类型和第二类型的向量加载指令可用于连续向量加载(其中对应于将加载的每个数据元素的地址是连续的)并且用于非连续(收集)形式的向量加载(其中每个数据元素的地址是非连续的并由地址向量指定)。

然而,对连续类型的向量加载而言,至少第二类型的向量加载指令使用基址寄存器和立即偏移值来指定要加载的连续地址块的起始地址是有用的,该立即偏移值表示为要加载的连续地址块的大小的倍数。第一类型的向量加载指令也可以以该方式定义,且如果如此,则这些指令可以通过其操作码,或通过立即偏移值是零(针对第一类型)还是非零(针对第二类型)来区分。

在其他示例中,第二类型的向量加载指令可以将其偏移指定为立即值,但第一类型可指定偏移(索引)寄存器,该寄存器存储偏移值,该值与基址相加以形成要访问的连续地址块的起始地址。因此,指令的寻址模式可用于区分故障行为的类型。该方法尤其对以下系统十分有用,该系统提供默认对应于零值的预定零寄存器说明符,因为这允许第一类型的指令通过参考索引寄存器而定义零偏移,无需浪费通用寄存器以存储零偏移。

检测到的数据元素的异常条件可以是任何条件,该条件用信号发送某种异常结果或某种错误。然而,在异常条件包括地址转换故障或存储器许可故障时,第一/第二形式的指令可以尤为有用。响应动作可以变化,并且可以包括异常处理例程的触发执行,和/或设置状态信息以指示所发生的异常条件。

更多示例配置在以下条款中定义:

(1)一种设备,包括:

多个向量寄存器,用于存储包括多个数据元素的向量操作数;以及

处理电路,被配置为响应于指定基址寄存器和立即偏移值的向量数据传送指令而在至少一个向量寄存器的多个数据元素与数据存储中对应于连续地址块的存储位置之间传送数据;

其中,响应于向量数据传送指令,处理电路被配置为利用一个值来确定所述连续地址块的起始地址,该值等同于将存储在基址寄存器中的基址与立即偏移值和对应于所述连续地址块大小的乘数的乘积相加的结果。

(2)如条款(1)所述的设备,包括存储元素,用于存储可变控制参数,其中处理电路被配置为根据可变控制参数来确定所述连续地址块的大小。

(3)如条款(2)所述的设备,其中,可变控制参数指定标识一个向量寄存器的大小的向量大小VS。

(4)如任何前述条款所述的设备,其中处理电路被配置为利用一个值来确定乘数,该值等同于NR x NE x SS的乘积,其中:

NR是所述至少一个向量寄存器中的向量寄存器的数量,其中针对这些向量寄存器将响应于向量数据传送指令来传送数据。

NE是所述至少一个向量寄存器中的每个向量寄存器所包含的数据元素的数量,并且

SS是对应于单个数据元素的地址单元的存储单元大小。

(5)如条款(4)所述的设备,包括存储元素,用于存储标识一个向量寄存器大小的向量大小VS;

其中处理电路被配置为利用一个值来确定乘数,该值等同于NR x VS/ES x SS的乘积;

其中ES是一个数据元素的数据元素大小;并且

处理电路被配置为基于向量数据传送指令的编码来确定ES、NR及SS。

(6)如任何前述条款所述的设备,其中立即偏移值包括无符号整数值。

(7)如条款(1)至(5)中任一条款所述的设备,其中立即偏移值包括有符号整数值。

(8)如任何前述条款所述的设备,其中基址寄存器包括标量寄存器。

(9)如任何前述条款所述的设备,其中响应于向量数据传送指令,对于所述至少一个向量寄存器中的每个数据元素,处理电路被配置为执行数据传送操作以用于在数据元素与对应于连续地址块各个部分的存储位置之间传送数据。

(10)如条款(9)所述的设备,其中在向量数据传送指令是向量加载指令并且针对该至少一个向量寄存器的给定数据元素的数据传送操作检测到至少一个异常条件时,处理电路被配置为抑制至少一个用于处理所述至少一个异常条件的响应动作,并且存储元素标识信息,该元素标识信息标识所述至少一个向量寄存器中的哪个数据元素是所述给定数据元素。

(11)如任何前述条款所述的设备,其中在向量数据传送指令包括向量加载指令时,处理电路被配置为从数据存储中对应于连续地址块的所述存储位置将数据加载到至少一个向量寄存器的多个数据元素。

(12)如任何前述条款所述的设备,其中在向量数据传送指令包括向量存储指令时,处理电路被配置为将数据从至少一个向量寄存器的多个数据元素中存储至数据存储中对应于连续地址块的所述存储位置。

(13)一种数据处理方法,该方法包括:

接收向量数据传送指令,该向量数据传送指令指定基址寄存器和立即偏移值;以及

响应于向量数据传送指令:

确定连续地址块的起始地址,该起始地址具有一个值,该值等同于将存储在基址寄存器中的基址与立即偏移值和对应于所述连续地址块大小的乘数的乘积相加的结果;以及

在至少一个向量寄存器的多个数据元素与数据存储中对应于连续地址块的存储位置之间传送数据。

(14)一种设备,包括:

用于存储包括多个数据元素的向量操作数的多个装置;及

响应于指定基址寄存器和立即偏移值的向量数据传送指令,用于在用于存储向量操作数的至少一个装置的多个数据元素与数据存储中对应于连续地址块的存储位置之间传送数据的装置;

其中响应于向量数据传送指令,用于传送的装置被配置为利用一个值来确定所述连续地址块的起始地址,该值等同于将存储在基址寄存器中的基址与立即偏移值和对应于所述连续地址块大小的乘数的乘积相加的结果。

(15)一种计算机程序,用于控制计算机以提供对应于根据条款(1)至(12)中任一条款所述的设备的虚拟机执行环境。

(16)一种计算机实现的方法,用于基于源程序而生成指令,该指令用于由处理电路进行处理,该方法包括:

在源程序内检测包括多个迭代的源循环,源循环的每个迭代包括向量数据传送指令以用于在至少一个向量寄存器的多个数据元素与数据存储中对应于连续地址块的存储位置之间传送数据,该连续地址块具有被向量数据传送指令标识的起始地址和给定块大小,其中源循环的给定迭代的连续地址块与随后迭代的连续地址块连续;以及

响应于检测到源循环,生成针对经展开的循环的指令,该经展开的循环包括少于源循环的迭代,其中经展开的循环的每个迭代对应于源循环的至少两个迭代,并且每个迭代包括:

参考向量数据传送指令,指定基址寄存器以用于存储由源循环的所述至少两个迭代中选定迭代的向量数据传送指令标识的起始地址;以及

至少一个其他向量数据访问指令,指定所述基址寄存器和立即偏移值,该立即偏移值将存储在基址寄存器的起始地址与由源循环的所述至少两个迭代中剩余迭代的向量数据传送指令标识的起始地址之间的差异指定为给定块大小的倍数。

(17)一种数据处理设备,被配置为执行条款(16)的方法。

(18)如条款(17)所述的数据处理设备,其中该数据处理设备包括该处理电路,该处理电路被配置为执行根据该方法产生的指示。

(19)一种包括指令的计算机程序,该指令用于控制计算机以执行条款(16)的方法。

(20)一种存储介质,存储条款(19)的计算机程序。

(21)一种计算机实现的方法,用于基于源程序而生成指令,该指令用于由处理电路进行处理,该方法包括:

在源程序内检测包括多个迭代的源循环,每个迭代包括第一类型的向量加载指令以用于触发处理电路来执行加载操作,从而将数据从数据存储加载到至少一个向量寄存器的多个数据元素,其中第一类型的向量加载指令具有编码,该编码指示在由处理电路针对以预定序列对所述至少一个向量寄存器的第一有效数据执行的加载操作检测到异常条件时,处理电路将执行响应动作,并且在针对以所述预定序列对所述第一有效数据之外的有效数据执行的加载操作检测到异常条件时,处理电路将抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息;以及

响应于检测到源循环,生成针对经展开的循环的指令,该经展开的循环包括少于源循环的迭代,其中经展开的循环的每个迭代对应于源循环的至少两个迭代,并且每个迭代包括:

所述第一类型的向量加载指令;以及

至少一个第二类型的向量加载指令,该至少一个第二类型的向量加载指令具有编码,该编码指示在针对所述至少一个向量寄存器的任何有效数据元素执行的加载操作检测到异常条件时,处理电路将抑制所述响应动作并且存储标识被检测到异常条件的有效数据元素的元素标识信息。

(22)一种数据处理设备,被配置为执行条款(21)的方法。

(23)如条款(22)所述的数据处理设备,其中数据处理设备包括被配置为执行根据所述方法生成的指令的所述处理电路。

(24)一种包括指令的计算机程序,该指示用于控制计算机以执行条款(21)的方法。

(25)一种存储介质,存储条款(24)的计算机程序。

在本申请中,词语“被配置为…”用于表示装置的元件具有能够执行所定义的操作的配置。在该上下文中,“配置”表示硬件或软件的互连的布置或方式。例如,装置可以具有提供所定义的操作的专用硬件,或者可被编程为执行功能的处理器或其他处理设备。“被配置”并不意味着装置元件需要以任意方式被改变以提供所定义的操作。

尽管本文已经参考附图详细描述了本发明的说明性实施例,但将理解的是,本发明不限于这些精确的实施例,并且可以由本领域技术人员实现各种改变、添加、以及修改,而不脱离如所附权利要求限定的本发明的范围和精神。

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