元素大小增加指令的制作方法

文档序号:14033597阅读:128来源:国知局
元素大小增加指令的制作方法

本技术涉及数据处理领域。更具体地,涉及对具有多个数据元素的矢量的处理。



背景技术:

一些数据处理装置可以支持如下矢量处理:其中可以对矢量的每个数据元素执行给定的处理运算,以产生结果矢量的相应数据元素。这允许利用单个指令来处理多个不同的数据值,以减小处理给定数量的数据值所需的程序指令的数量。矢量处理也可以被称为simd(单指令多数据)处理。



技术实现要素:

至少一些示例提供了一种装置,该装置包括:处理电路,用于响应于标识包括多个m位数据元素的至少第一输入矢量的元素大小增加指令,生成包括多个结果数据元素的结果矢量,其中结果数据元素包括至少一个n位数据元素,其中n>m;其中响应于第一形式的元素大小增加指令,处理电路被配置为使用第一输入矢量的第一子集的数据元素来生成结果矢量;响应于第二形式的元素大小增加指令,处理电路被配置为使用第一输入矢量的第二子集的数据元素来生成结果矢量;并且第一子集的数据元素在第一输入矢量中的位置与第二子集的数据元素在第一输入矢量中的位置是交错的。

至少一些实施例提供了一种装置,该装置包括:用于生成的装置,用于响应于标识包括多个m位数据元素的至少第一输入矢量的元素大小增加指令而生成包括多个结果数据元素的结果矢量,其中结果数据元素包括至少一个n位数据元素,其中n>m;其中响应于第一形式的所述元素大小增加指令,用于生成的装置被配置为使用第一输入矢量的第一子集的数据元素来生成结果矢量;响应于第二形式的元素大小增加指令,用于生成的装置被配置为使用第一输入矢量的第二子集的数据元素来生成结果矢量;并且第一子集的数据元素在第一输入矢量中的位置与第二子集的数据元素在第一输入矢量中的位置是交错的。

至少一些实施例提供了一种数据处理方法,该方法包括:用于响应于标识包括多个m位数据元素的至少第一输入矢量的元素大小增加指令,生成包括多个结果数据元素的结果矢量,其中结果数据元素包括至少一个n位数据元素,其中n>m;其中响应于第一形式的元素大小增加指令,使用第一输入矢量的第一子集的数据元素来生成结果矢量;响应于第二形式的元素大小增加指令,使用第一输入矢量的第二子集的数据元素来生成结果矢量;并且第一子集的数据元素在第一输入矢量中的位置与第二子集的数据元素在第一输入矢量中的位置是交错的。

至少一些示例提供了一种存储在计算机可读存储介质上的计算机程序,所述计算机程序在由数据处理装置执行时提供虚拟机,该虚拟机提供与上述装置相对应的指令执行环境。

附图说明

现在将通过仅作为示例的方式参考附图描述本发明的实施例,在附图中:

图1示意性示出支持矢量处理的数据处理装置的示例;

图2和图3a示出了第一和第二形式的元素大小增加指令;

图3b示出了第二形式的元素大小增加指令的替代实现方式;

图4示出在硬件中提供的用于处理矢量的各元素的并行处理通道的示例;

图5示出了第一和第二形式的元素大小增加指令被提供时可以避免的解封装(unpacking)操作的示例;

图6和7示出第一和第二形式的元素大小增加指令的另一示例;

图8和9示出第一和第二形式的元素大小增加指令的第三示例;

图10至13示出用于分别在各交错的数据元素子集上操作的第一、第二、第三和第四形式的元素大小增加指令的示例;

图14是示出处理元素大小增加指令的方法的流程图;

图15是示出响应于元素大小增加指令而在给定的矢量处理通道中处理数据元素的示例的流程图;

图16示出处理如下矢量的示例:该矢量的矢量长度不是n位结果数据元素大小的整数倍;

图17示出生成少于n位的至少一个结果数据元素的示例;以及

图18示出了虚拟机实现方式的示例。

具体实施方式

下面将讨论一些具体的示例。应当理解的是,本技术不限于这些具体的示例。

一些装置可以支持处理具有不同数据元素大小的矢量。因此,可以支持在至少包括多个m位数据元素的第一输入矢量上进行运算以生成包括多个结果数据元素的结果矢量的元素大小增加指令,其中结果数据元素包括至少一个n位数据元素,并且n>m。例如,元素大小增加指令可以简单地将具有一定数目的位的数据元素转换成更高精度的值,或者也可以对输入的m位数据元素执行特定处理运算(例如,乘法运算)以生成较大的n位的数据元素。由于结果矢量可具有比输入矢量更少的元素,所以输入的m位数据元素的子集可被用来产生结果的n位数据元素,并且可以不考虑输入矢量的其他m位数据元素。

一种用于选择输入矢量的哪些m位数据元素将被处理的方法可以用于提供单一形式的元素大小增加指令,该指令在元素大小增加指令的默认子集的m位数据元素上进行运算(例如,输入矢量的m位数据元素中的较低部分、或数据矢量的仅偶数编号的数据元素0、2、4...)。然而,为了处理不在元素大小增加指令所访问的默认位置的元素,有必要首先执行解封装(unpacking)操作,以将感兴趣的值移动到默认数据元素位置。这样的解封装操作可能需要(可能降低性能的)额外的指令以及(用于容纳解封装后的值的)额外的寄存器来执行。

另一种方法可以用于提供在输入矢量的较低部分中的元素上进行运算的一种形式的元素大小增加指令、以及在输入矢量的较高部分中的元素上进行运算的另一形式的元素大小增加指令。虽然这允许这些指令直接在原始的输入矢量的封装数据上进行运算,而无需解封装操作,但这在硬件中可能效率较低,因为它可能需要在处理电路中提供较长的交叉路径,该交叉路径用于将输入矢量的一端处的数据元素的位路由到结果矢量的另一端处的用于生成结果数据元素的处理通道。这种交叉布线可能难以在芯片上路由,并且对于其他矢量处理运算而言通常是不需要的,因此导致电路面积和功耗增大。

与此相反,本技术提供第一和第二形式的元素大小增加指令,其控制处理电路以分别使用第一输入矢量的相应的第一和第二子集的数据元素生成结果矢量,其中第一和第二子集的数据元素在第一输入矢量中的位置是是交错的。第一和第二形式的元素大小增加指令可以对应于相同类型的处理运算,但可以针对输入矢量的不同子集的数据元素。第一和第二形式的指令所针对的第一和第二子集的数据元素的交错使得处理电路在硬件中更高效的实施,因为它需要的交叉路径布线比上文所讨论的更少。而且,提供针对相应的交错的子集的(至少)两种不同形式的指令意味着不需要对数据元素进行解封装,因此能够改善性能并且更高效的利用寄存器。

一般而言,处理电路可以基于第一输入矢量的相应m位数据元素生成结果矢量的每个n位数据元素,其中第一输入矢量的相应m位数据元素是根据正由处理电路执行哪种形式的元素大小增加指令来选择的。

例如,结果矢量的每个n位数据元素可以对应于输入矢量的一组m位元素,其中该组中包括来自每个子集的一个m位数据元素。处理电路可以根据哪种形式的元素大小增加指令正在被执行而从该组中选择一个m位数据元素,并且使用所选择的m位数据元素生成相应的n位数据元素。该组m位数据元素在第一输入矢量中的位位置可以与相应的n位数据元素在结果矢量中的位位置相一致。用于生成每个n位数据元素的处理可以被限制于与第一输入矢量的n个位相对应的处理通道,并且因此不需要输入矢量的不同的n位部分之间的任何交联,从而使得处理电路在硬件方面更高效。

在一些情况下,结果矢量还可以取决于包括掩码值的掩码,其中掩码值用于指示至少第一输入矢量的哪些m位数据元素是有效的数据元素。这可以允许将某些数据元素标记为无效,并且与在有效的元素上执行的元素大小增加指令相关联的运算用于产生结果。

提供如上面所讨论的第一/第二形式的元素大小增加指令的另一个优点是,它允许这两种指令直接在与封装矢量相对应的掩码上进行运算。相反,如果仅支持单一的元素大小增加指令,则不仅需要如上面讨论的对矢量元素本身进行解封装,还需要以相应的方式操纵掩码以控制对解封装矢量的处理,这可能进一步加大解封装操作的开销。相反,上面描述的第一/第二形式的元素大小增加指令两者可以在相同掩码的掩码值的子集上进行运算。在一些情况下,第一个和第二形式的指令可以分别使用第一和第二子集的掩码值,其中第一和第二子集的掩码值在掩码中以与输入矢量的的交错的数据元素子集相对应方式交错。在其它实例中,第一和第二形式的指令两者可以使用相同子集的掩码值,无论使用什么形式的指令。

关于哪些元素属于第一子集的元素或第二子集的元素的分配在处理电路中可以被硬布线(即,响应于对正在被执行的指令的形式的指示,硬件访问适当子集的元素)。这可以独立于被用于给定指令的特定掩码值。掩码可能影响相关的子集内有哪些数据元素被考虑,但可能不影响给定元素是否被认为是第一子集或第二子集的部分。

在一些情况下,元素大小增加指令可以实现使每个元素的位数加倍,即n=2m。在这种情况下,第一子集的数据元素可以包括第一输入矢量的偶数编号的数据元素,而第二子集的数据元素可以包括第一输入矢量的奇数编号的数据元素。对于具有一个以上输入矢量的指令,可以从其它输入矢量中选择类似的数据元素子集。通过提供分别针对偶数编号和奇数编号的元素的两种形式的指令,由于上面给出的原因这允许更高效的硬件实现。

其中n=2m的其它形式的指令可以以不同的方式将元素分配给交错的第一子集和第二子集。对于其中矢量长度不是n的整数倍的指令,输入矢量的一些m位元素可能不被映射到结果的相应的n位元素,所以可被跳过并且可以不被认为是第一或第二子集的部分。第一和第二子集可以对应于与输入矢量的n位元素相对应的那些元素中的所有其他元素。如果一个m位元素被跳过,这会导致第一和第二子集分别包括奇数编号和偶数编号元素的混合物。

一些系统可支持将元素大小增大多于两倍。在这种情况下,可能存在针对另外子集的数据元素的多于两种形式的元素大小增加指令。例如,如果n=4m,则还可以提供第三和第四形式的指令以用于第一输入矢量的第三和第四子集的m位数据元素,其中第一、第二、第三和第四子集的数据元素是交错的。类似地,对于n=8m,第三到第八形式的指令可以用于第一输入矢量的第三至第八子集的数据元素,其中第一至第八子集是交错的。因此,第一和第二形式的元素大小增加指令只是多种形式的指令(其实施相同的数据处理运算但针对输入矢量的元素的不同子集)中的两种。

每个m位数据元素可具有相应的掩码值,该掩码值指示该m位数据元素是有效的还是无效的。对于结果矢量的各个n位数据元素,相应的m位数据元素是根据正被执行的指令的形式来选择的。当掩码值指示相应的m位数据元素有效时,处理电路可以基于施加到相应的m位数据元素的预定运算的结果(并且在一些情况下,还依赖于下文提到的另外的输入矢量的元素)来生成n位数据元素。在另一方面,当相应的m位数据元素被指示为无效时,可以利用与施加到相应的m位数据元素中的预定运算的结果无关的值来生成n位数据元素。

存在用于在无效的情况下生成n位数据元素的不同选项。n位数据元素可以被设置为固定值,例如零,或m位数据元素可以被直接映射到相应的n位值,而无需施加任何预定运算(除了精度变化),或与有效的m位数据元素相对应的n位数据元素可以被写入目的地寄存器,而与无效的m位数据元素相对应的其它n位数据元素采用先前被存储在目的地寄存器的相应部分的值。

在一些情况下,除了至少一个n位数据元素之外,结果矢量可以包括至少一个j位数据元素,其中j<n。在一些情况下,结果矢量的j位数据元素可以以类似的方式被处理到如之前讨论的无效处理通道。可替换地,处理电路可以利用与使用第一输入矢量的相应m位数据元素执行的预定处理运算的n位结果中的j位部分相对应的值来生成(一个或多个)j位数据元素。因此,可以以与生成n位数据元素相类似的方式生成更小的结果数据元素,但是减小到更窄的位宽度。对应于n位结果中的哪j个位被映射到结果矢量中的j位数据元素的不同选择,可提供不同版本的第一/第二/另外的元素大小增加指令。

一般而言,处理电路可以通过使用至少第一输入矢量的相应m位数据元素执行预定运算来生成给定的n位数据元素。对应于作为预定运算被施加的不同运算,可以提供多个不同版本的元素大小增加指令,其中每个版本至少具有如上文所讨论的第一形式和第二形式(还可能有其他形式)。

例如,该预定运算可能是转换运算,以将相应的m位数据元素所表示的值的精度从m位改变成n位。在这种情况下,第一输入矢量可能是唯一的输入矢量。不需要施加任何其他的数学或逻辑运算。针对其中掩码指示有效元素的那些通道,转换运算可以简单地将m位值转换成等同的n位值。

在其它示例中,预定运算的结果可以取决于第一输入矢量的相应的m位数据元素以及至少一个另外的输入矢量的相应的数据元素。例如,预定运算可以是被施加到两个、三个或更多个输入矢量的相应元素的算术运算(例如,加、减、乘或除、乘加、乘减)。该运算可以是定点或浮点运算。

在一些情况下,另外的输入矢量的数据元素可以是m位数据元素(即,与第一输入矢量的元素的大小相同的元素)。在这种情况下,被执行的这种形式的元素大小增加指令还确定该另外的输入矢量中的哪些元素被用于生成结果矢量。

对于其他类型的指令,另外的输入矢量可以具有与结果矢量的数据元素的大小相同的n位数据元素。例如,矢量加法指令可以将另外的输入矢量的n位数据元素加入到第一输入矢量的m位数据元素,以生成n位数据元素。通过允许较小的数据元素直接与较大的数据元素直接组合,避免了用于执行两个单独的指令以分别执行对数据元素大小的相加和转换的需要。

第一和第二形式的元素大小增加指令(如果提供的话,第三、第四或另外的形式的元素大小增加指令)可以以不同的方式来相互区分。在一些情况下,不同形式的元素大小增加指令可具有不同的操作数。可替代地,不同形式的元素大小增加指令可具有相同的操作数,并且元素大小增加指令可以包括指定正被执行的指令的形式的字段。

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

发布阶段电路25可以访问寄存器60,在寄存器60中可以存储运算所需的数据值。特别是用于矢量运算的源操作数可以被存储在矢量寄存器65内,并且用于标量运算的源操作数可以被存储在标量寄存器75中。此外,一个或多个断言(predicate)(掩码)可以被存储在断言寄存器70中,其在执行某些矢量运算时用作针对所处理的矢量操作数的数据元素的控制信息。一个或多个标量寄存器还可以被用于存储如下数据值:这些数据值被用于导出用于在某些矢量运算的执行期间使用的这种控制信息。

源操作数和任何相关联的控制信息可经由路径47被路由到发布阶段电路,以使得它们可以与标识要被执行来实现每个经解码的指令的(一个或多个)操作的控制信号一起被分派到适当的执行单元。在图1中示出的各种执行单元30、35、40、80被假定为用于对矢量操作数进行运算的矢量处理单元,但如果需要的话,可以提供单独的执行单元(未示出)来处理由装置支持的任何标量运算。

考虑到各种矢量运算,算术运算例如可以与所需的源操作数(和诸如断言之类的任何控制信息)一起被转发到算术逻辑单元(alu)30,以便对这些源操作数执行算术运算或逻辑运算,其结果值通常作为用于存储在矢量寄存器库65的指定寄存器中的目的地操作数输出。

除了alu30之外,可以提供其它执行单元35,例如,用于响应于经解码的浮点指令执行浮点运算的浮点单元(fpu),以及用于对矢量操作数执行特定置换运算的矢量置换单元80。此外,加载/存储单元(lsu)40用于执行加载操作,以便(通过数据缓存45和任何中间的另外级别的缓存,诸如2级缓存50)将来自存储器55的数据值加载到寄存器组60内的指定寄存器中,并且用于执行存储操作,以便将数据值从这些寄存器存储回存储器55。

图1所示的系统可以是有序处理系统,其中指令序列以程序顺序执行,或者可替换地该系统可以是无序系统,从而允许对各种指令被执行的顺序进行重新排序以寻求提高性能的目的。如本领域的技术人员将理解的,在无序系统中,可以提供额外的结构(图1中未明确示出),例如,寄存器重命名电路,用于将指令指定的架构寄存器映射到来自寄存器库45内的物理寄存器池(该池的物理寄存器通常大于架构寄存器的数量)的物理寄存器,从而使得移除某些危害,这有利于更多地使用无序处理。此外,通常可以提供重排序缓冲器以保持跟踪无序执行,并且允许有序地提交各种指令的执行结果。

在所描述的实施例中,图1的电路被布置成对存储在矢量寄存器65中的矢量操作数执行矢量运算,其中矢量操作数包括多个数据元素。对于对这样的矢量操作数执行的某些矢量运算(如算术运算),所需的运算也可以被并行(或迭代)地施加到矢量操作数内的各种数据元素。断言信息(也称为掩码)可以被用来标识矢量中的哪些数据元素是用于特定矢量运算的有效数据元素并因此是应该被施加运算的数据元素。

图2和图3a示出了可以由图1的数据处理装置支持的第一和第二形式的元素大小增加指令的示例。图2和图3a示出元素加长指令,该元素加长指令采用具有m位数据元素的两个输入矢量a、b,并生成具有n位数据元素输出矢量r,其中n=2m。输入矢量是从矢量寄存器60读取的,并且输出矢量被写回到矢量寄存器60。断言寄存器70提供控制输入矢量的哪些元素有效的掩码信息。要访问的断言寄存器可以从输入寄存器60的标识中暗示,或者可以在指令编码中明确地编码。

图2示出了第一形式的加长指令(第1类型的指令),该第一形式的加长指令在输入矢量a、b的第一子集的数据元素上操作,其中该第一子集包括在位置0、2、4、6中的偶数编号的数据元素。类似地,第1类型的指令使用对应于偶数编号的断言位p0、p2、p4、p6的断言(掩码)位子集。结果元素r0、r1、r2、r3是分别使用输入寄存器的通道0、2、4、6产生的。在每种情况下,如果相应的断言值pn为1,则结果元素被设置为在输入寄存器a、b的相应元素xn、yn上执行给定处理运算<op>的结果。运算<op>可以是任何算术、逻辑或移位运算,例如,可以是定点或浮点运算。在这个示例中,断言位p0、p2、p4都为1,所以元素r0-r2分别取值x0<op>y0、x2<op>y2和x4<op>y4。另一方面,如果针对给定通道的断言是0,则相应的结果数据元素独立于对相应输入元素的处理运算<op>的结果。例如,在此示例中,结果数据元素r3独立于x6<op>y6的结果(r3在断言p6为1时与x6<op>y6的结果相关)。在断言位为0的情况下,相应的结果数据元素r3可以被设置为固定值(例如,0),或者相应的输入元素x6或y6可以被直接映射到用于结果的等效n位值(而不是使用运算<op>进行处理),或输出寄存器的相应部分的先前值可以为元素r3保留。使用这些选项中的哪种选项可以针对给定实现方式被硬布线,或者可以基于控制寄存器中的配置信息进行选择以允许用户选择要使用的选项,或者可以基于在指令编码中编码的参数进行选择。对于图2所示的第1类型的指令,奇数编号的输入元素x1、x3、x5、x7、y1、y3、y5、y7和断言值p1、p3、p5、p7不影响结果,无论输入值或断言值是什么。

图3a示出了与图2的第一形式的运算<op>类型相同的运算<op>相对应的第二形式的加长指令,再次,它在具有m位数据元素的两个输入寄存器a、b和断言寄存器上操作,以产生具有n位数据元素的结果矢量,并仍是n=2m。然而,第二形式的加长指令作用于相应的输入寄存器中的位置1、3、5、7处的奇数编号的输入数据元素、以及断言寄存器p1、p3、p5、p7的相应奇数编号的断言位。例如,当断言位p1为1,结果元素r0是基于x1<op>y1的结果设置的。类似地,r1、r2、r3与施加到输入的通道3、5、7和断言寄存器的类似运算相对应。在这个示例中,因为断言值p5、p7都为0,因此结果元素r2、r3独立于施加到通道5和7中的元素的运算<op>的结果。

因此,图2和图3a中所示的第1类型和第2类型的指令对应于相同的运算,但针对在这些输入寄存器内交错的不同的第一和第二子集的数据元素。第一子集的数据元素包括元素0、2、4和6,并且第二子集包括元素1、3、5、7。这种方法具有如下文关于图4和5解释的几个优点。

图4示出了可以在用于实施图2和图3a所示的类型的指令的执行单元30、35、80中的一个执行单元中提供的某种硬件的示例。其中哪个执行单元30、35、80执行指令取决于被执行的运算的类型(例如,浮点运算可以由浮点单元35来执行,而定点算术运算可以由alu30来执行)。

如图4所示,执行单元30、35、80可以包括多个处理块100,用于执行相应通道的处理。每个通道可以对应于输出矢量的一个n位结果元素并且对应于每个输入矢量的一组两个m位数据元素,其中该组包括一个偶数编号的元素和一个奇数编号的元素(即来自第一形式和第二形式的指令分别针对的第一子集和第二子集中的每个子集的一个元素)。例如,用于通道0的处理电路100-0接收输入矢量的元素x0、y0、x1、y1和相应的断言位p0、p1。该处理电路100-0还接收指示正在执行哪种形式的指令的指令形式信号102,并且基于该指令信号形式选择元素x0、y0和断言位p0、或选择元素x1、y1和断言位p1,并利用它们生成该通道的结果值r0。类似地,用于其他三个通道1、2、3的电路100-1、100-2、100-3以相应的方式操作以生成其它结果元素r1、r2、r3。

需要注意,每个处理通道对应于被应用于输入寄存器的n个位的独立处理单元,其中这n个位在输入寄存器中的位位置与生成的相应的n位结果数据元素在输出寄存器中的位位置相一致。例如,输入寄存器a的元素x0、x1是输入寄存器a的最低n位,并且其恰好对应于输出寄存器中用于放置相应的结果数据元素r0的最低n位。这意味着不需要n位处理通道之间的任何交联。例如,当生成结果寄存器的下半部分中的结果数据元素时不需要考虑输入寄存器的上半部分中的位值。这是因为第一和第二形式的指令分别针对交错的数据元素子集。相反地,如果第一和第二形式的指令分别针对输入寄存器的上半部分和下半部分,则例如将需要将输入元素x4、y4链接到结果元素r0的交叉路径(其通常不被其他操作所需要),因此将增加硬件电路面积和功率消耗,并使其更难在硬件电路中路由所需的路径。通过提供如上所讨论的第一和第二形式的指令,可避免这种额外的硬件复杂性。

图5示出提供如图2和图3a所示的第一和第二形式的指令的另一优点。一种替代方法是只支持图2所示的类型的指令,其仅针对偶数编号的数据元素0、2、4、6。然而,如果程序员然后希望向奇数编号的元素1、3、5、7施加相同的运算,则在第二寄存器中执行的第1类型的指令之前,他们首先需要使用置换单元80执行解封装操作,如图5所示,以将那些奇数编号的元素1、3、5、7移动到第二寄存器中的偶数编号的位置0、2、4、6。如图5所示,解封装操作可能需要多达三个的额外的要被执行的指令,分别用于对两个输入寄存器中的每个输入寄存器以及断言寄存器进行解封装。这些额外的指令降低了性能,因为它们将延迟对元素大小增加指令的处理。此外,如图5所示,对输入寄存器进行解封装需要使用三个额外的寄存器p1、r2、r3(如果元素大小增加指令可以直接在原始寄存器p0、r0、r1中的封装数据上执行,则不需要这三个额外的寄存器p1、r2、r3)。寄存器空间可能是非常宝贵的,并且如果必须使用额外的寄存器进行解封装,则将减少可用于其他目的的寄存器的数量,这可能导致其它指令在等待寄存器变得可用时被延迟。此外,如图5所示,解封装操作之后,解封装后的寄存器r2、r3中的一半的数据元素是空的,所以与在封装矢量上直接执行指令相比,寄存器文件中的空间被浪费了。

相反地,通过使用分别在交错的数据元素子集上操作的、在图2和图3a中示出的第一和第二形式的指令,可避免图5所示的解封装操作,因为程序员可以根据感兴趣的元素是在输入矢量的奇数编号位置还是偶数编号位置简单地选择要使用第1类型的指令还是第2类型的指令。在实践中,程序员通常希望将相同的运算应用于输入矢量的所有数据元素,从而对要执行的每种形式的指令的一个实例而言是相同的。在这种情况下,另一益处是,断言寄存器中的相同的断言值可以被用于这两种形式的指令,因为每种形式的指令挑选断言寄存器的相关位。不需要如图5所示操纵断言值。

在图3a的示例中,对于第2类型的指令,考虑奇数编号的断言位p1、p3、p5、p7以确定输入寄存器的通道1、3、5、7是有效还是无效。因此,第2类型的指令使用与图2所示的第1类型的指令所用的第一子集p0、p2、p4、p6交错的第二子集的掩码值。

图3b示出了使用针对第2类型的指令的断言信息的替代方式。在这种情况下,在第2类型的指令仍然针对输入寄存器a、b的奇数编号的元素(x1、x3、x5、x7和y1、y3、y5、y7)时,第2类型的指令仍使用断言寄存器70的偶数编号的断言值p0、p2、p4、p6。因此在这种情况下,所使用断言值(掩码值)子集与用于第1类型的指令的断言值子集相同。在这种情况下,断言值p0、p2、p4、p6实际上可以被认为与相应的结果数据元素r0、r1、r2、r3相关联,以指示哪些通道是有效的哪些是无效的(其隐式地标识输入元素的相应通道1、3、5、7是有效还是无效)。如果针对给定通道r0、r1、r2、r3的断言p0、p2、p4、p6是1,则相应的结果数据元素是根据施加到相应奇数编号的输入数据元素1、3、5、7的运算<op>的结果来设置的,而如果断言是0,则相应的结果数据元素独立于此运算的结果。

图6和7示出了第一和第二形式的元素大小增加指令的另一示例。此示例示出了加宽指令,针对该加宽指令的第一输入寄存器a具有m位数据元素,而第二输入寄存器b具有与结果矢量的大小(在本实施例中仍是n=2m)相同的n位数据元素。因此,第1类型和第2类型的指令使用第二输入寄存器b的相同的n位元素,但根据被执行的指令的类型来选择第一输入寄存器a的不同的偶数编号或奇数编号的元素。在其他方面,操作类似于图2和图3a/3b的示例。同样,所使用的特定的处理运算<op>可以是任何算术、逻辑或移位运算。

图8和9示出了其中可以利用第一和第二形式的指令实现转换指令的另一示例。此时没有第二输入寄存器,并且当给定通道有效时,在输入的相应元素上执行的预定运算是简单的转换运算,以将数据值的精度从m位改变成n位。例如,m位数据元素可以用最高有效端处的符号位填充,以生成n位数据元素(在是二的补码定点值的情况下),或者可以被转换为新的格式(在是浮点值的情况下)。同样,结果是基于输入的偶数编号的元素还是奇数编号的元素设置取决于正在执行的指令是第1类型或第2类型:对于第1类型,结果元素r0、r1、r2、r3分别对应于输入元素x0、x2、x4、x6,对于第2类型,结果元素r0、r1、r2、r3分别对应于输入元素x1、x3、x5、x7。

图7和9示出了与图3a中的示例相类似的示例,其中第2类型的指令使用奇数编号的断言位p1、p3、p5、p7来确定相应的通道是否有效。然而,也将有可能与图3b类似地实现这些,从而使得他们在分别使用奇数编号的输入元素1、3、5、7生成结果数据元素r0、r1、r2、r3时考虑偶数编号的断言位p0、p2、p4、p6。

而且,尽管未在附图中示出,但加长或加宽指令的其他示例可以作用于三个或更多个输入矢量。例如,乘法累加指令可以采用如下矢量作为输入:指定要被相乘的数据元素的两个矢量以及要与相乘的结果相加的数据元素的第三矢量。同样,这样的指令可以使用分别针对奇数编号和偶数编号的元素的第一和第二形式来实现。

上述示例对元素进行编号,从而使得矢量的最低有效数据元素是元素0。在其他示例中,最低有效元素可以被认为是元素1。虽然这将改变被认为是奇数编号或偶数编号的特定元素,但仍然存在针对奇数编号的元素的一种形式的指令和针对偶数编号的元素的另一种形式的指令。

上述示例示出了n=2m的情形。然而,其它指令可实现对元素大小的更大缩放,并且两种以上形式的指令可以被实施以从输入寄存器中选择用于形成结果元素的相应元素子集。例如,如图10至13所示,当n=4m时,可以提供四种形式的指令以用于选择输入数据元素的第一至第四子集,它们处于输入寄存器内的交错的位置。例如,如图10所示,第一形式的指令可以针对第一元素子集0、4,图11所示的第二形式的指令可以针对第二元素子集1、5,图12所示的第三形式的指令可以针对第三元素子集2、6,图13所示的第四形式的指令可以针对第四元素子集3、7。更一般地,第一子集将对应于其元素编号以4取模为0的那些元素,并且第二至第四子集对应于其元素编号以4取模分别为1、2和3的那些元素。同样,图10至13示出其中每种形式的指令使用不同的交错的掩码位子集(图10中是p0、p4,图11中是p1、p5,图12中是p2、p6,并且图13中是p3、p7)的示例,但同样,还可能将相同的掩码位用于每种形式的指令(例如,针对所有四种形式的指令,将掩码位p0用于结果元素r0,将掩码位p4用于结果元素r1)。其中相关掩码位是0的通道是独立于对相应数据处理元素的处理运算<op>的结果被设置的。

图10-13示出了针对其中输入矢量具有相同大小的元素的“加长”指令的示例,但类似地,图6-9中所示的“加宽”指令或转换指令也可以扩展成四种形式以实现对数据元素大小的4倍缩放。

类似地,其他倍数的精度增大可以利用其他形式的指令来实现。例如,要将精度增大8倍(n=8m),可以提供八种形式的指令,这八种形式的指令分别挑选出第一至第八元素子集,其中,所述第一至第八子集在输入矢量中的位置仍是在交错的位置。

在上面的示例中,输入矢量a包括8个m位数据元素,但是应该理解的是,该技术可以被应用于具有其他数目的元素(其他矢量长度)的矢量。

图14示出了用于处理元素大小增加指令的方法。在步骤200处,处理电路确定是否正在执行元素大小增加指令。如果不是,则以另外的方式处理该指令,然后处理返回到步骤200。当元素大小增加指令被执行时,在步骤202处,处理电路至少选择第一输入矢量的数据元素子集。根据当前执行的元素大小增加指令是哪种形式,从多个交错的数据元素子集中选择子集。对于图2、3a/3b和6-9的示例,这将是(针对第1类型的指令)对应于偶数编号的元素的第一子集或(针对第2类型的指令)对应于奇数编号的元素的第二子集。对于图10至13的示例,所选择的子集将是分别与元素编号以4取模为0、1、2或3的元素相对应的四个子集中的一个。在加长指令的情况下,以与针对第一输入矢量的方式相同的方式选择从第二输入矢量(或第三输入矢量,如果需要的话)选择的元素子集。对于加宽指令,第二输入矢量具有与结果相同大小的元素,并因此对于每种形式的指令,从第二输入矢量中选择相同的元素。对于转换指令,只有一个输入矢量。在步骤204处,处理电路使用所选择的输入数据元素子集和断言位子集(其可以基于指令的形式来选择,或者可以如上文所讨论的对所有形式而言都是相同的)来生成结果矢量。

图15是更详细地示出了步骤202和204的处理的具体示例的流程图。图15使用以下表示法:

n=结果矢量r的每个数据元素的位数

m=第一输入矢量a的每个数据元素的位数

q=元素大小增加的比例因子(n=qm)

v=第一输入矢量a中的矢量元素的数目

第一输入矢量a包括分别具有m个位的、编号为a[0]至a[v-1]的v个数据元素。

结果矢量包括分别具有n个位的、编号为r[0]至r[v/q-1]的v/q个数据元素。

对于加宽指令,第二输入矢量b包括分别具有n个位的、编号为b[0]至b[v/q-1]的v/q个数据元素。

对于加长指令,第二输入矢量b包括分别具有m个位的、编号为b[0]至b[v-1]的v个数据元素。

图15示出了用于生成结果数据元素r[j]的单个处理通道。对于j在0和v/q-1之间的每个通道可以重复该方法。在一些系统中,处理电路可以具有用于并行处理每个通道的电路硬件。其他系统可以顺序地对每个通道执行处理,使得来自给定矢量的输入数据元素逐个通过单个硬件单元,该单个硬件单元通过多个循环生成每个相应通道的结果数据元素。其他系统可以使用这些方法的组合,其中可以并行处理两个或更多个通道(不是所有的通道),但是对全矢量的处理需要多次通过硬件。

图15中的k表示第一输入矢量中与结果数据元素r[j]相对应的m位数据元素(其是基于正在执行的指令的形式选择的)。

如图15所示,在步骤250中,使用当前的元素大小增加指令来确定正在实施的精度增加因子(即,确定q的值)。如果q=2(数据元素大小的两倍),则在步骤260确定执行哪种形式的指令。对于q=2,有两种形式的指令。如果当前指令具有第一种形式,则在步骤262中k=2j,如果当前指令具有第二种形式,则在步骤264中k=2j+1。另一方面,如果在步骤250中q=4,那么在步骤270确定当前正在执行的指令的形式。如果指令具有第一种形式,则k=4j(步骤272)。如果指令具有第二种形式,则k=4j+1(步骤274)。如果指令具有第三种形式,则k=4j+2(步骤276)。如果指令具有第四种形式,则k=4j+3(步骤278)。

需要注意的是,步骤262-264共同定义一组两个m位数据元素a[2j]和a[2j+1],其中该组两个m位数据元素在输入矢量a中的位位置与结果数据元素r[j]在结果矢量中的位位置相一致。类似地,步骤272-278定义一组四个m位数据元素a[4j]、a[4j+1]、a[4j+2]、a[4j+3],其中该组四个m位数据元素在输入矢量a中的位位置与结果数据元素r[j]在结果矢量r中的位位置相一致。这意味着对于生成的任何给定的结果数据元素r[j],相应的输入数据元素a[k]总是具有与结果数据元素的一部分的位位置重叠的位位置,而与指令的形式无关。这意味着在上面讨论的硬件设计中可以避免长交叉路径。此外,请注意,针对每个通道重复图15的方法(即,针对0到v/q-1之间的每个j值)将使得每种形式的指令选择相应的交错的数据元素子集。

尽管在图15中未示出,但是如果q高于4(例如8或16),则该指令的其他形式将挑选出更多的元素子集。一般情况下,对于值为2的幂次方的q,可以有q种形式的指令,由第p种形式的指令挑选的元素子集是其元素数量满足k=qj+p的元素,其中j仍在0和v/q-1之间。

在步骤250到278建立起哪个输入数据元素a[k]对应于结果数据元素r[j]之后,在步骤280检查该输入元素的断言位p[k]。如果p[k]是0,则在步骤282,结果数据元素r[j]是利用独立于使用输入元素a[k]执行预定运算<op>的结果的值来确定的。如上所述,r[j]可以被设置为预定值(例如0),输入元素a[k]可以被直接映射至r[j]的n位值,或r[j]可以保留先前存储在输出寄存器的相应部分的相同的值。在所有这三种情况下,r[j]独立于运算<op>的结果(尽管应该注意,在第二种情况下,r[j]仍然可以依赖于输入元素a[k])。

如果断言位p[k]是1,则在步骤284,检查将被执行的运算的类型(这可以根据指令操作数来确定)。如果该指令是转换指令,则在步骤286,结果数据元素r[j]被设定为对输入元素a[k]的数值的更高精度表示。如果该指令是加宽指令,则在步骤288,r[j]被设置为等于对第一输入矢量a的元素a[k]和第二输入矢量b的元素b[j]执行预定运算<op>的结果。在另一方面,如果该指令是加长指令,则在步骤292,r[j]被设置为等于对输入矢量a的元素a[k]和输入矢量b的元素b[k]执行运算<op>的结果。

图15示出了具体的示例,但应当认识到,其他指令可以以不同的方式来实现。例如,在步骤280中,不是选择与被用来生成结果元素r[j]的输入元素a[k]相对应的断言位p[k](其根据要执行的指令的形式而变化),而是如上文讨论的图3b的示例,针对所有形式的指令选择相同的断言位p[j]。此外,对于某些运算(例如乘加),在步骤288、290中该运算可使用来自矢量a、b、c的三个矢量元素来执行。来自矢量b和c的矢量元素可以是n位元素b[j]、c[j]或m位元素b[k]、c[k]。

在一些示例中,不同形式的指令可以由不同的操作数区分,例如:

addlong1r4,r1,r2

addlong2r4,r1,r2

可替代地,不同形式的指令可以具有相同的操作数,但包括用于指定指令的形式的字段:

addlongr4,r1,r2,1

addlongr4,r1,r2,2

以上示例示出了vl/n为整数的情况,其中vl是输入矢量和结果矢量的矢量长度(总的位数)。然而,一些系统可以支持对不是n的整数倍的矢量长度的处理。

图16示出了可以如何处理这样的运算的一些示例。当vl/n不是整数时,除了一个或多个n位数据元素之外,结果矢量可以包括至少一个较小的j位数据元素。例如,图16示出了如下示例,其中j=m、vl=5m并且n=2m,因此当可以使用输入矢量的相应的m位元素(该相应的m位元素是根据所执行指令的是第1类型还是第2类型来选择的)来生成2个n位元素时,输入矢量中有一个“备用”的m位元素,针对该备用的m位元素,在结果矢量中没有足够的空间用于将该元素扩展到n位结果元素中。根据n和vl的相对大小,有时可能存在不止一个备用元素。

如图16的a)、b)和c)所示,存在用于选择输入矢量中哪些元素是备用元素的不同方法,其中备用元素不被映射到相应的n位元素。在这种示例中,矢量长度使得仅存在一个备用元素,但是对于较长的矢量可以有两个或更多的备用元素,这取决于vl、m和n的值。图16的阴影部分示出了每种情况下的备用元素。

在图16中的示例a)中,备用元素是从输入矢量的最高有效端选择的。在示例b)中,备用元素从输入矢量的最低有效端选择的。在示例c)中,备用元素是在矢量内的任意位置选择的。一些版本的指令可以假设备用元素应该总是被默认在矢量的最低或最高有效端。其它版本可以允许指定备用元素的位置,例如在指令编码的字段中。

以与上文所讨论的技术类似的方式处理剩余的(非备用)元素,其中输入元素的子集是根据执行的指令的类型来选择的,并且被扩展以产生结果的相应n位数据元素。第一和第二子集可以对应于交替的非备用元素。根据(一个或多个)备用元素的位置,第一和第二子集可能不是恰好对应于输入矢量的奇数编号和偶数编号编号的元素。例如,在图16的示例c中,第一子集包括元素a0、a3,而第二子集包括元素a1、a4。然而,第一和第二子集在输入矢量内是交错的。

对于备用元素,他们实际上可以被当作无效元素进行处理。例如,备用元素可以在存储结果矢量的目的地寄存器内保持不被触碰(在目的地寄存器的该部分中保留先前的值),或输入的未被使用的元素可以直接复制到结果矢量的相应元素。

用于备用元素的另一选择是对备用m位元素执行相同的运算,如同生成了相应的m位元素,但然后将中间的n位结果的j位部分写入结果矢量的相应的j位元素。图17示出了这样的一个示例。在这个示例中,vl=48位、m=8位、n=32位、j=16位。由于n/m=4,因此存在如图10-13所示的四种形式的元素大小增加指令。图17示出了用于选择输入矢量的第二子集的元素a1、a5的第2类型指令的示例。结果值的最低元素a'1是以通常的方式基于第二子集的相应元素a1生成的。对于结果的最高16位元素,输入矢量的相应的8位元素a5被处理以产生32位的中间结果a'5,然后选择中间结果的16个位并将其写入到结果矢量的16位元素a”5中。每种类型的指令的不同变体可以被提供来用于选择n位中间结果的不同的j位部分以供写入结果矢量,例如,在该示例中,变体a可以选择较低的16位而变体b可以选择较高的16位。对于第1类型的指令时,将根据输入元素a4而不是a5来生成结果的16位元素。对于第3类型和第4类型的指令,由于输入矢量没有(通常从第三/第四子集选择的)相应元素a6、a7,结果矢量的较高元素可以被视为无效通道并且以上文针对无效通道所讨论的任意方式来生成。

为了简明起见,图16和17示出了其中仅存在一个输入矢量(例如,用于改变输入数据元素的精度或格式的指令)的示例。然而,将理解的是,可以针对使用不止一个输入矢量的算术/逻辑指令采用类似的方法,其中输入矢量的矢量长度不是n的整数倍。

图18示出了可使用的虚拟机实现方式。虽然前面描述的实施例从装置和方法的方面实现本发明以操作支持所涉及的技术的特定处理硬件,但还有可能提供硬件设备的所谓的虚拟机实现方式。这些虚拟机实现方式在运行支持虚拟机程序510的主机运算系统520的主机处理器530上运行。通常,需要强大的处理器来提供以合理的速度执行的虚拟机实现方式,但这种方法可能在某些情况下是合理的,例如,当出于兼容或再利用的原因希望运行来自另一处理器的代码时。虚拟机程序510提供至应用程序500的应用程序接口,与应用程序接口相同,应用程序500将由实际硬件(由虚拟机程序510建模的设备)提供。因此,包括对上述存储器访问的控制的程序指令可以在应用程序500内通过使用虚拟机程序510来执行以建立其与虚拟机硬件的交互。

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

虽然本文参照附图详细描述了本发明的说明性实施例,但是应当理解,本发明不限于那些精确的实施例,并且本领域的技术人员在不脱离如所附权利要求所限定的本发明的范围和精神的情况下,可以对其进行各种改变和修改。

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