单指令多数据处理器与相关方法与流程

文档序号:15666101发布日期:2018-10-16 17:05阅读:263来源:国知局
单指令多数据处理器与相关方法与流程

技术领域

本发明涉及单指令多数据指令,并且更具体而言涉及用于单指令多数据处理器的高效硬件指令。



背景技术:

数据格式被设计为启用各种不同数据集特性的高效处理和存储。处理这些格式的数据的算法是关键的。不幸的是,当前的处理器不是总能高效地对特定数据格式工作。

处理器设计者在历史上提供了对特定于应用的指令的最小直接支持。因此,软件开发者依靠增加现有处理器执行指令集的速度来提高特定算法的性能。

但是,典型处理单元的性能不以相同的速率增加。因此,软件开发者不能够同样多地依靠增加计算机能力来更快地处理特定的数据格式。

单指令多数据(“SIMD”)处理器同时对多个数据项执行相同的操作。通过对多个寄存器或子寄存器中的数据执行单条指令,SIMD处理器利用数据级并行化。因此,每条指令的吞吐量可以相应增加。SIMD处理器通常被用于图形和其它多媒体应用。相应地,可能难以使用SIMD体系架构来高效地处理特定的数据格式。

本节中所描述的方法是可以推行的方法,但不一定是先前已经构想或推行的方法。因此,除非另外指出,否则不应当由于仅仅它们被包含在本节中就假设在本节中描述的任何方法有资格作为现有技术。

术语和记号

为了解释,以下术语和惯例在本文中被用来描述本发明的实施例:

术语“字节”在本文描述连续存储的位的数量。虽然常见用法暗示八位,但是字节的尺寸可以从实现到实现有所变化。例如,字节可以指任何尺寸,包括但决不限于:八位、十六位、三十二位、六十四位,等等。

记号<XY>在本文描述位的向量,例如,<10>。空格可以在位之间添加,这仅仅为了增加阅读向量内容的能力,例如,<1111 0000 1111 0000>。

记号[J,K]在本文描述一组连续的值,其中J是第一个值并且K是第二个值,它们可以相等或者不同。

记号“0x”可以被用来表示十六进制数。例如,0x2C可以被用来代表数字四十四。在其中位表示可能难操纵的一些实施例中,十六进制表示可以被用来增加阅读和理解描述的能力。

术语“寄存器”是可以包括一个或多个更小子寄存器的寄存器或子寄存器。除非另外指定,否则寄存器可以是SIMD寄存器或者通常在标量处理器中使用的寄存器。

附图说明

在附图中:

图1示出了在实施例中的一组SIMD寄存器以及在执行固定宽度位解包指令的各个步骤SIMD寄存器的状态。

图2示出了在实施例中执行可变长度字节解包指令的一组SIMD寄存器。

图3示出了在实施例中执行Burst指令的一组SIMD寄存器。

图4示出了在实施例中执行OnesIdx指令的一组SIMD寄存器。

图5示出了在实施例中执行GatherB指令的一组SIMD寄存器和步骤。

图6示出了在实施例中执行BitVecCmpRes指令的一组SIMD寄存器。

图7是示出本发明实施例可以在其上实现的计算机系统的框图。

具体实施方式

在以下描述中,为了解释,阐述了各种具体细节,以便提供对本发明的透彻理解。但是,很显然,本发明没有这些具体细节也可以实践。在其它情况下,众所周知的结构和设备以框图形式示出,以避免不必要地模糊本发明。

一般概述

给出了利用SIMD体系架构处理特定数据格式的几条指令。具体而言,描述了在SIMD处理器上解包固定宽度位值、解包可变长度字节值、解压运行长度编码的位向量、找出位向量中设置为一的位的移位量、从位向量收集特定的位以及比较两个值向量的指令。

给出的许多指令对于对存储器中的特定数据格式执行操作可能是特别有用的。指令可以对存储器、寄存器或者立即操作数操作。此外,具有存储器操作数的指令可以对具有不同粒度的数据操作,诸如高速缓存行或页面尺寸的块。

SIMD指令

SIMD指令是在被处理时会使操作对多个不同的数据值,同时和/或并行地,执行多次的指令。为了说明更清楚的例子,假设四个整数值要被递增一。还假设SIMD处理器接收到单个SIMD递增一指令。响应于接收到这单个SIMD指令,SIMD处理器可以同时递增四个整数值当中每一个。

作为对比,标量指令是当被处理时会使操作执行一次的指令。多个标量指令可以在标量处理器、处理单元或处理核心中串行处理。为了说明清楚的例子,假设前面例子中的相同的四个值要在标量处理器上被递增一。标量处理器可以执行第一标量递增一指令,使第一个值递增一;然后,标量处理器可以执行第二标量递增一指令,使第二个值递增一,依此类推。因此,在这个例子中,标量处理器必须比前面例子中的SIMD处理器多执行三条递增一指令。此外,假设标量处理器与SIMD处理器执行SIMD递增一指令同样快地执行标量递增一指令。因为标量处理器串行执行标量指令,而SIMD处理器并行地对多个数据对象执行SIMD指令,所以标量处理器会花SIMD处理器四倍长的时间来处理所有四个值。

用于实现SIMD操作的一种方法是使用每个都能存储多个不同数据值的一个或多个寄存器。这种寄存器在本文被称为SIMD寄存器。为了说明清楚的例子,假设SIMD寄存器能够存储256位。因此,SIMD寄存器能够存储八个不同的32位值,每个值在32位的子寄存器中;四个不同的64位值,每个值在64位的子寄存器中;或者两个不同的128位值,每个值在128位的子寄存器中。此外或者作为替代,可以使用不是2的幂的尺寸的子寄存器。

SIMD操作在硬件中实现并且可以花费一个或多个机器循环来执行。例如,响应于接收到递增一指令,标量处理器可以在单个循环中递增加载到寄存器中的值。同样,响应于接收到递增一指令,SIMD处理器可以在单个循环中并行地递增加载到多个寄存器,或SIMD子寄存器,中的多个值。此外或者作为替代,一个或多个SIMD指令可以花费多于一个循环来执行。

既实现SIMD又实现非SIMD指令的计算机系统可以包括一个或多个SIMD寄存器和一个或多个非SIMD寄存器。此外或者作为替代,寄存器可以是用于执行SIMD指令的SIMD寄存器和用于执行非SIMD指令的非SIMD寄存器。此外或者作为替代,SIMD寄存器可以在与非SIMD寄存器驻留在其上的硬件元件不同的硬件元件(例如,不同的协处理器)上。

固定宽度位解包

SIMD指令,固定宽度位解包(“bunpk”),可以被用来将固定宽度位值解包成固定宽度字节。为了高效地使用一些SIMD指令,寄存器中的每个值可以存储在其自己的子寄存器中并且与其对齐。因此,通过将位向量中的每个位打包值拷贝到其自己的子寄存器中并与其对齐,这个指令可以被用作一些后续SIMD处理的使能器。

具体而言,执行这个指令将SIMD寄存器中最初被格式化为一系列连续位的值存储到单独的连续子寄存器中。此外,每个值可以被偏移并在该值存储在其中的子寄存器中对齐。例如,值三、一和七可以每个都被表示为三位,并且可以在位向量中打包,例如<110 100 111>(其中左边的位是最低有效位),存储在SIMD寄存器中。在对SIMD寄存器执行bunpk指令之后,每个值可以在其自己单独的子寄存器中存储并且对齐,表示为<1100 0000>、<1000 0000>和<1110 0000>。

在实施例中,该指令可以取以下作为操作数:包含一系列固定宽度位值的寄存器或子寄存器;包含将存储解包值的子寄存器的寄存器;以及包含每个打包值的位宽度的寄存器。作为替代,包含每个打包值的位宽度的寄存器可以是立即值。此外,可以包括完成符,它指示解包值将存储在其中的每个子寄存器的尺寸。完成符是可以作为指令一部分的值。例如,完成符可以指定所使用的(一个或多个)SIMD子寄存器的尺寸。指令可以具有一个或多个完成符。在其中“sz”是完成符的一种实施例中,bunpk指令可以是以下形式:

bunpksz s2=s1,r1

作为使用以上形式的具体例子:

bunpk2 s2=s1,r1

假设存储在r1中的值是三,并且在执行该例后,连续存储在寄存器s1中的3位值可以被解包到s2中的2字节子寄存器中。对于这条指令,s2中的每个子寄存器可以是2个字节,因为这个例子中的完成符是“2”。例如,假设<110 100 111>存储在寄存器s1中。在执行这条指令后,存储在s2中的第一个子寄存器中的位将是<1100 0000 0000 0000>,存储在s2中的第二个子寄存器中的位将是<1000 0000 0000 0000>,并且存储在s2中的第三个子寄存器中的位将是<1110 0000 0000 0000>。

作为替代,第二个参数s1可以是代表打包位的立即值。例如,如果0x01CB是<110 100 111>的十六进制表示,则

bunpk2 s2=0x01CB,r1

可以在寄存器s2中产生与以上第一个例子相同的结果。

在其它实施例中,其它操作数和完成符可以指示解包值可以如何存储在每个子寄存器中。例如,操作数可以指示解包值在子寄存器中应当右对齐还是左对齐,或者数据在寄存器中的字节顺序。

示例过程

图1示出了实施例中在执行固定宽度位解包指令的各个步骤中处于特定状态的一组SIMD寄存器。虽然图1为了说明清楚的例子而示出了实施例,但是其它实施例可以略去、添加、重新排序或者修改所示出的任何结构或步骤。

SIMD寄存器110包括子寄存器112、子寄存器114和子寄存器116;但是在以下的例子中讨论子寄存器112。在子寄存器112中已经包括空间,仅仅为了使其更容易遵循特定的打包位值。寄存器110中的子寄存器可以是任何尺寸;但是,为了给出清楚的例子,并且为了接着以上的例子,寄存器110中的子寄存器是十六位宽。

SIMD寄存器120包括子寄存器122、子寄存器124和子寄存器126。在寄存器120的子寄存器中已经包括空间,仅仅为了使其更容易符合特定的打包位值。寄存器120中的子寄存器可以是任何尺寸;但是,为了给出清楚的例子,并且为了接着以上的例子,寄存器120中的子寄存器是十六位宽。

在步骤0中:子寄存器112被加载,以包含要被解包的打包位。注意,就像在以上的例子中,前三组位是分别代表值三、一和七的<110 100 111>。每个值<110>、<100>、<111>将被解包到寄存器120中对应的子寄存器中。

在步骤1中:执行混洗,以便将打包值拷贝到要解包的对应子寄存器中。例如,保持前三个值的子寄存器112的整个内容被拷贝并存储到子寄存器122、子寄存器124和子寄存器126中,这些是SIMD寄存器120中的子寄存器。SIMD寄存器120包括子寄存器122和子寄存器124。寄存器120中的子寄存器可以是任何尺寸;但是,为了给出清楚的例子,并且为了接着以上的例子,寄存器120中的子寄存器是十六位宽。

在步骤2中:执行偏移,以对准每个解包值与其各自的目标子寄存器。因此,子寄存器122完全不偏移,因为<110>已经与子寄存器122的起始对齐。子寄存器124移三位,使得<100>与子寄存器124的起始对齐。子寄存器126移六位,使得<111>与子寄存器126的起始对齐。在图1所示的实施例中,值左对齐。在其它实施例中,可以向右对齐。在还有其它实施例,对齐可以是寄存器中的字节对齐,但不能对齐到子寄存器的起始。

在步骤3中:对每个子寄存器应用掩码,以清空来自步骤1中的混洗的假象。例如,在子寄存器122中,最后十三位包含设定的位,这些是在步骤1中将整个子寄存器112拷贝到子寄存器122得到的假象。因此,对寄存器122应用掩码,从而清空子寄存器122中的最后十三位。子寄存器124和子寄存器126可以类似地被掩蔽。

因此,在步骤3结束时,并且如图1中所示,存储在寄存器110中的前三个固定宽度位值在寄存器120中被解包,使得每个值都被拷贝到自己的子寄存器中并且与其对齐。

串行处理

以下伪代码描述了在标量处理器上执行bunpk指令的实施例。虽然以下伪代码说明了实施例,但是其它实施例可以略去、添加、重新排序和/或修改以下描述的任何部分。

在以上的伪代码中,最低有效位是最右边的位,并且存储器向左增长。但是,在以下所写的描述中,最低有效位是最左边的位,并且存储器向右增长。如以上的伪代码中所示,串行处理可以被用来将固定宽度值位向量解包成固定宽度值字节向量。根据实施例,首先,对于每个值,可以检索值所跨的字节。其次,值未字节对齐的字节被偏移,使得代表值的位被偏移到最低有效位。第三,不代表值的所有位都被掩蔽或设为零。第四,如果值跨多于一个字节,则字节可以接合。

仅仅作为例子,假设五个值[A,B,C,D,E]存储在两个连续的八位寄存器b1和b2中,每个值是三位宽。作为记号,<aaa>将是值A的3位表示。因此,在这个例子中,b1包含<aaabbbcc>并且b2包含<cdddeee0>。因此,在实施例中,可以执行以下示例性过程。这个例子决不意味着限制。虽然这个例子讨论了根据实施例的特定步骤,但是,至少部分地基于雇主(employer)、可用候选以及所使用的特定方法,其它实施例可以略去、添加、重新排序和/或修改以下任何步骤。

在步骤1中:定义迭代循环,以便对位向量中的每个值迭代。例如,迭代循环被定义为使得迭代值,iter,在零开始并且迭代递增三,因为在这个例子中每个值是三位。

在步骤2中:确定低字节。低字节可以通过用字节向量中目标字节的宽度整除iter的当前值来确定。例如,在第三次迭代中,为了解包由寄存器b1中后两位以及寄存器b2中第一位表示的C,低字节可以通过用目的地字节的宽度,在这个例子中是八,整除iter的当前值,在这个例子中是六,来确定。因此,用于值C的低字节在这个例子中是零,因为用八整除六等于零。

在步骤3中:确定高字节。高字节可以通过求iter的当前值与打包值的宽度之和;并且用字节向量中目的地字节的宽度整除该和来确定。例如,在解包C的第三次迭代中,高字节可以通过将iter的当前值与位值的宽度求和,在这个例子中等于九;并且用目的地字节的宽度,在这个例子中是八,整除该和来确定。因此,在这个例子中高字节为一,因为八整除九等于一。

在步骤4中:如果低字节等于高字节,则整个值存储在单个字节中并且处理前进到步骤5。作为替代,如果低字节小于高字节,则值部分在低字节中表示并且部分在高字节中表示并且处理前进到步骤6。

在步骤5中:从低字节将值解包。例如,如果将B从b1解包到结果寄存器Res,则b1的内容可以存储在Res中。因此,Res将是<aaabbbcc>。然后,Res可以左移iter,在这个例子中是三。因此,Res将是<bbbcc000>。然后,可以创建掩码,以便通过对数量,负一,右移尺寸B,在这个例子中是三,执行按位NOT来除去不代表B的位。因此,掩码将是<11100000>。最后,通过在Res与掩码之间执行按位AND,掩码可以应用到Res。因此,Res将等于<bbbcc000>。由于整个值在低字节中,因此控制返回去处理下一次迭代。

在步骤6中:值被解包。如果低字节和高字节是相同的字节,则可以仅从低字节中提取值。作为替代,在低字节、高字节当中以及之间的字节中代表值的位可以被提取并接合。

例如,在解包C的第三次迭代中,低字节b1加载到临时寄存器TmpLow中,在这个例子TmpLow被假设为与b1相同的尺寸。具体而言,TmpLow将包含<aaabbbcc>。TmpLow左移iter对Reg的宽度取模,在这个例子中Reg的宽度将是六位。因此,TmpLow将是<cc000000>。

TmpLow中被使用的位的长度,表示为TmpLowLength,是通过计算TmpLow的宽度与左移位数之差来计算的。因此,TmpLowLength等于八减六,等于二。

TmpHighLength是通过计算打包位的宽度,在这个例子中是三,与TmpLowLength之差来计算的。因此,在这个例子中,TmpHighLength等于三减二,等于一。

为了解包高字节中的位,高字节b2加载到临时寄存器TmpHigh中,在这个例子中,TmpHigh被假设为与b2相同的尺寸。具体而言,TmpHigh将包含<cdddeee0>。

掩码TmpHighMask是通过在寄存器中存储负一并且右移TmpHighMask TmpHighLength创建的。因此,TmpHighMask将是<10000000>。

通过执行TmpHigh与TmpHighMask间的按位AND,掩码应用到TmpHigh。因此,TmpHigh将是<c0000000>。

通过右移TmpHigh TmpLowLength,并且执行TmpLow与TmpHigh之间的按位OR,最终结果存储在结果寄存器Res中。由于在这种情况下TmpLowLength等于二,因此在右移TmpHighTmpLowLength之后,TmpHigh将是<00c00000>。因此,在执行按位OR之后,Res将是<cc000000>OR<00c0000>的产物,这是<ccc00000>。

可变长度字节解包

SIMD指令,可变长度字节解包(“vlbunpk”),可以被用来将可变长度字节值解包为固定宽度字节。为了高效地使用一些SIMD指令,寄存器中的每个值可以存储在固定宽度字节中。因此,通过将每个可变长度字节值存储为固定宽度字节值,这个指令可以被用作一些后续SIMD处理的使能器。

具体而言,执行这个指令将最初在SIMD寄存器中在一系列可变长度连续字节中打包的每个值存储到SIMD寄存器中的连续固定长度子寄存器中。例如,值1555343273、59107、44和15937781可以分别用四个字节、两个字节、一个字节和三个字节表示。例如,[0x5CB4A7A9,0xE6E3,0x2C,0xF330F5]可以在第一个SIMD寄存器中加载。在对第一个寄存器执行vlbunpk指令之后,每个值可以在连续固定宽度子寄存器中表示。例如,[0x5CB4A7A9,0x0000E6E3,0x000000002C,0x00F330F5],使得每个值存储在单独的连续SIMD子寄存器中。

由于原始打包表示中每个值的长度是可变的,因此另一个寄存器可以包含指示每个可变长度打包值的长度的一组对应值。继续上面的例子,单独的寄存器可以包含四个值,例如[4,2,1,3],这些是每个对应的可变长度值的字节长度。用于这个寄存器中每个值的长度可以被定义,或基于指令中包括的操作数或完成符。

为了确保每个打包的可变长度值可以在解包的固定宽度表示中表示,每个值利用与打包的可变长度值当中最大值相同的字节数表示。因此,如以上所示例的,在执行vlbunpk指令之后,值0x5CB4A7A9、0xE6E3、0x2C和0xF330F5可以每个利用四个字节来表示,例如0x5CB4A7A9、0x0000E6E3、0x000000002C和0x00F330F5。

在实施例中,指令可以取以下为操作数:解包的固定长度值将存储在其中的第一寄存器;包含可变长度字节值的第二寄存器;及具有代表在第二寄存器中用来代表每个打包的可变长度值的字节数的对应值的第三寄存器。此外,可以包括完成符,以定义结果解包的固定长度值的长度,以及在第三子寄存器中代表每个值所需的位数。例如:

vlbunpk4s2=s1,r1

在以上的示例指令中,s1中打包的可变长度连续存储值可以被解包为存储在s2中的固定宽度4字节表示,其中打包的可变长度连续存储值的对应长度值存储在r1中。例如,假设值[0x5CB4A7A9,0xE6E3,0x2C,0xF330F5]的打包的可变长度表示存储在寄存器s1中,并且对应的长度[4,2,1,3]存储在寄存器r1中。在执行这个指令后,每个值的4字节表示存储在寄存器s2中,使得s2中[0x5CB4A7A9,0x0000E6E3,0x000000002C,0x00F330F5]当中每个值存储在其自己的连续子寄存器中。在其它实施例中,其它操作数和完成符可以指示值在寄存器或存储器中如何被解包或存储。

示例处理

图2示出了在实施例中在执行可变长度字节解包指令的过程中的一组SIMD寄存器。虽然图2为了说明清楚的例子而示出了一种实施例,但是其它实施例可以略去、添加、重新排序和/或修改所示的任何结构。

在步骤0中:在为vlbunpk指令做准备的过程中,打包的可变长度值加载到寄存器210中,并且对应的长度加载到寄存器220中。例如,SIMD寄存器210包含四个打包的可变长度值[0x5CB4A7A9,0xE6E3,0x2C,0xF330F5]。

SIMD寄存器220包含用于寄存器210中所存储的每个值的对应长度。具体而言,寄存器220包括[4,2,1,3]。在实施例中,寄存器220中值的长度基于指令的完成符。例如,如果完成符被设为四,那么,就像在上面的例子中,两位可以被用来描述寄存器220中每个值的所有可能长度。例如,[4,2,1,3]可以被表示为[<11>,<10>,<00>,<01>]。

在步骤1中:指令是通过根据存储在寄存器220中的值将寄存器210中的可变长度字节值存储到寄存器230中来执行的。例如,寄存器230包括子寄存器232、子寄存器234、子寄存器236和子寄存器238。寄存器230中的子寄存器可以是任意尺寸;但是,为了给出清楚的例子,并且为了符合上面的例子,寄存器230中的子寄存器是四字节宽。寄存器210的前四个字节的拷贝(基于寄存器220中的前两位,<11>)存储在子寄存器232中。这个拷贝是完美尺寸匹配,并且不需要再做什么。因此,子寄存器232可以包含0x5CB4A7A9,这是0x5CB4A7A9的四字节表示。

寄存器210的下两个字节的拷贝(基于寄存器220中的下两位,<10>)被拷贝到子寄存器234。但是,当来自寄存器210的两个字节被拷贝到子寄存器234时,值127被零扩充,以适合目标子寄存器234。因此,子寄存器234可以包含0x0000E6E3。作为替代,值可以被符号扩充。在还有另一种备选方案中,字节仅仅被拷贝到子寄存器234的前两个字节;但是,子寄存器234可以之前已经被清空,从而没有来自存储在子寄存器234中的之前值的任何假象。

同样,寄存器210的下两个字节的拷贝(基于寄存器220中的下两位,<10>)被拷贝到子寄存器236,零扩充。而且同样,寄存器210的下三个字节的拷贝(基于寄存器220中的下两位,<01>)被拷贝到子寄存器238。因此,子寄存器236和子寄存器238可以包含[0x000000002C,0x00F330F5]。

因此,在执行该指令之后,寄存器230可以在连续子寄存器232至238中包含解包的固定长度值[0x5CB4A7A9,0x0000E6E3,0x000000002C,0x00F330F5]。

串行处理

利用以上章节中定义的操作数和完成符,以下伪代码描述了在标量处理器上执行vlbunpk指令的实施例。虽然以下伪代码说明了实施例,但是其它实施例可以略去、添加、重新排序和/或修改以下所述的任何部分。

仅仅作为例子,为了更详细地解释以上的伪代码,给出以下描述。所使用的值和步骤仅仅是为了说明清楚的例子,而决不是要限制。

为了示例,假设s1包括可变长度值[A,B,C,D]。此外,假设s1中每个值的长度利用两位表示存储在r1中,例如,代表[4,2,1,3]的[<11>,<01>,<00>,<01>]。

在通过for循环的第一次迭代的起始开始:首先,通过掩蔽除前两位之外的所有位,从r1检索第一个打包值A的长度。其次,利用到s1中的偏移量,在第一次迭代中设为零,从s1中提取值A,并且从r1检索两位置,<11>,并映射成四。第三,s1的前四个字节被提取并且以四字节的块存储在s2中,如由set_szbyte_simd函数中的完成符sz表示的。

第一次迭代通过准备下一次迭代而结束。具体而言,到s1中的偏移量递增被提取的字节数。因此,该偏移量被更新为四,因为在第一次迭代中检索出四个字节。此外,r1中代表s1中第一个值的长度的两位被移出。因此,对应于s1中第二个值的下两位值位于r1的前面,以便在下一次迭代中使用。

再次在通过for循环的第二次迭代的起始开始:首先,通过掩蔽除前两位之外的所有位,从r1检索第二个打包值B的长度。其次,利用到s1中的偏移量,在第二次迭代中设置为四,从s1中提取值B,并且从r1检索两位置,<01>,并映射成二。第三,s1的下两个字节被提取并且以四字节存储在s2中,如由set_szbyte_simd函数中的完成符sz表示的。

第二次迭代通过准备下一次迭代而结束。具体而言,到s1中的偏移量递增被提取的字节数。因此,该偏移量被更新为六,因为在第二次迭代中又检索出两个字节。此外,r1中代表s1中第二个值的长度的两位被移出。因此,对应于s1中第三个值的下两位值位于r1的前面,以便在下一次迭代中使用。

第三和第四次迭代与以上在前两次迭代中所描述的类似地进行。在所有四次迭代之后,值A、B、C、D被解包并且以固定长度四字节格式[A,B,C,D]存储在s2中。

BURST

SIMD指令,burst,可以被用来解压运行长度编码(“RLE”)压缩位向量。RLE压缩的位向量是具有对应运行向量的位向量,使得位向量当中每一位在运行向量中具有对应的运行值。运行向量中的每个运行值指示位向量中的对应位应当扩充多少位。例如,如果压缩的位向量<10>具有对应的运行向量[2,6],则解压后的位向量可以是<11000000>。

这个指令可能是复杂的,因为,依赖于运行值,写到结果寄存器或存储器中对于单条指令可能太大。因此,burst指令的执行还可以更新指令的操作数,以反映当前状态,使得burst指令的后续执行将在前一次执行停止时恢复。

存储器形式

在实施例中,burst指令可以采取以下形式,并且可以在每次指令被执行时对特定数量的字节操作:

burst[r1]=r2,r3,r4

在以上的实施例中,r1是到存储器中的指针,指示结果解压的位向量应当被存储的字节;r4是被r1指向的字节中的偏移量,结果解压的位向量应当存储在该偏移量。此外,r2是到存储器中的指针,指示压缩的位向量被存储的字节。还有,r3是到存储器中的指针,指示运行向量可以存储的字节。

以下过程可以在每次以上包含的burst指令被执行时发生:

在步骤1中:来自压缩的位向量的X个位被加载,并且来自对应运行向量的X个字节被加载。例如,r2包含存储器中压缩位向量的地址,并且r3可以包含存储器中对应运行向量的地址。因此,位向量的前两个字节(十六位)可以加载到第一寄存器中并且运行向量的前十六个字节加载到第二寄存器中。为了说明清楚的例子,假设<1010 1010 1010 1010>被加载到第一寄存器中;并且[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]被加载到第二寄存器中。

在步骤2中:加载的位向量基于加载的对应运行向量被解压。例如,第一寄存器中压缩的位向量基于第二寄存器中加载的对应运行向量被解压。结果产生的解压的位向量可以存储在第三寄存器中。因此,第三寄存器可以包含解压的位向量,<11 000 11 000 11 000 11 000 11 000 11 000 11 000 11 000>。

在步骤3中:解压的位向量存储在存储器中。例如,在第三寄存器中加载的值在字节r1的地址存储在存储器中,偏移了r4中的值。

在步骤4中:操作数被更新,使得burst指令的后续执行将是“自动地”:1)加载压缩位向量中接下来连续存储的位;2)加载运行向量中接下来连续存储的对应运行值;及3)与在步骤3中所存储的结果连续地存储结果。词“自动地”在这里意味着在后续burst指令被执行之前操作数不需要被更新。因此,继续当前的例子:1)r2递增二,以指向存储器中压缩的位向量中接下来连续的位;2)r3递增十六,以指向存储器中运行向量中接下来连续的对应运行值;及3)r1递增五,以指向存储器中接下来结果产生的解压位向量应当被存储的接下来的连续位置;但是,r4保持不变,因为四十(五个字节中的位数)对八取模为零。

因此,burst指令的操作数将反映当前状态,使得burst指令的后续执行将在前一执行停止的地方恢复。

寄存器形式

在实施例中,burst指令可以采取以下形式,并且可以在每次指令被执行时处理至多特定数量的字节:

burst[r1]=r2,s1,r4

在以上实施例中,r1是到存储器中的指针,指示结果解压的位向量应当被存储在其的字节;r4是r1指向的字节中的偏移量,结果解压的位向量应当存储在该偏移量。此外,r2是包含压缩的位向量的寄存器。而且,s1是保持对应运行向量的运行值的SIMD寄存器。

以下处理可以在以上包含的burst指令每次被执行时发生。但是,以这种形式,不是总能保证burst指令将完成对存储在r2中的位向量的解压。因此,以下处理可以采取与以上处理不同的步骤,以便在前一执行停止的地方恢复:

在步骤1中:加载的位向量基于加载的对应运行向量被解压。为了说明清楚的例子,假设<1010 1010 1010 1010>被加载到r2中;并且[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]被加载到s1中。但是,为了解释,假设结果寄存器是四字节宽。因此,当r2中的压缩的位向量基于s1中加载的对应运行向量被解压时,部分解压的位向量可能存储在结果寄存器中。在这个例子中,完整解压的位向量不能存储在结果寄存器中,因为在这个例子中结果寄存器是四字节宽,而整个解压的位向量是五字节宽。因此,结果寄存器可以包含部分解压的位向量,<11 000 11 000 11 000 11 000 11 000 11 000 11>。

在步骤2中:部分解压的位向量被存储在存储器中。例如,在s1中加载的值存储在存储器中字节r1的地址,偏移了r4中的值。

在步骤3中:操作数被更新,使得burst指令的后续执行将是“自动地”:1)基于s1中对应的运行向量恢复解压r2中的位向量;及2)与在步骤2中所存储的结果连续地存储结果。词“自动地”在这里意味着在后续burst指令被执行以恢复当前加载的压缩位向量的处理之前操作数不需要被更新。因此,继续当前的例子:1)[0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,3]被存储在s1中,以反映没有被完全解压的压缩位;及2)r1递增四,以指向存储器中接下来结果产生的解压位向量应当被存储的接下来的连续位置;但是,r4保持不变,因为三十二对八取模为零。

因此,burst指令的操作数将反映当前状态,使得burst指令的后续执行将在前一执行停止的地方恢复。

硬件图

图3示出了实施例中为了执行burst指令而在寄存器中使用的一组寄存器。虽然图3为了说明清楚的例子而示出了一种实施例,但是其它实施例可以略去、添加、重新排序或者修改所示出的任何结构。

寄存器310与寄存器r2对应并且在步骤1中包含包括一个或多个位的压缩位向量。具体而言,寄存器310包含压缩的位向量<1010 1010 1010 1010>。

SIMD寄存器320对应于SIMD寄存器s1并且包含存储在s1中的运行向量。SIMD寄存器320包括一系列子寄存器,使得在步骤1中每个子寄存器存储运行向量中的运行值。具体而言,寄存器320包括:子寄存器322,包含第一运行值,二;子寄存器324,包含第二运行值,三;子寄存器326,包含第三运行值,二;及子寄存器328,包含第四运行值,三。如所指示的,寄存器320包含图3中未示出的更多子寄存器。

寄存器330对应于结果寄存器并且包含在步骤1结束时部分解压的位向量。具体而言,寄存器330包含解压的位向量<1100 0110 0011 0001 1000 1100 0110 0011>的前四个字节。

在执行burst指令之后,寄存器330可以包含解压的位向量。作为替代,解压的位向量可以存储,或部分存储,在存储器390中。

存储器390可以是位于处理器上的片上高速缓存。作为替代,存储器390可以是片下高速缓存,或者主存储器。存储器390可以存储如以上步骤2中所述存储在寄存器330中的完全或部分解压的位向量。

串行处理

以下伪代码描述了在标量处理器上执行burst指令的实施例,类似地利用在以上章节中定义的操作数和完成符作为变量。虽然以下伪代码说明了实施例,但是其它实施例可以略去、添加、重新排序或者修改以下所述的任何部分。

一索引

SIMD指令,onesidx,可以被用来返回位向量中每个被设为一的位的索引。例如,如果操作数包含位向量<1000 0100 0111 0000>,则在onesidx成功执行后,SIMD寄存器可以在每个子寄存器中包含每个被设为一的位的索引,例如[0,5,9,10,11]。

这个指令可以是复杂的,因为,依赖于被设为一的位的个数,写到结果寄存器中对于单条指令可能太大。因此,onesidx指令的执行还可以更新指令的操作数,以反映当前状态,使得onesidx指令的后续执行将在前一执行停止时恢复。

寄存器形式

在实施例中,onesidx指令可以采取以下形式,并且可以在每次指令被执行时找出至多特定数量的索引:

onesidxsz.btype s1=r1,r2,r3

在以上的实施例中,寄存器r1可以是存储器中开始搜索位向量的字节地址,并且r2可以是字节r1指向的偏移量,以开始搜索。SIMD寄存器s1可以包括一系列子寄存器,每个子寄存器可以存储索引值。s1中每个子寄存器的字节尺寸可以由sz完成符定义。寄存器r3可以包含在执行过程中找到的索引的数目。btype完成符可以是关于要搜索的字节数的上限。例如,“cache”可以指示在字节r1指向的位置开始的整个高速缓存行应当被搜索。类似地,“page”可以指示在字节r1指向的位置开始的整个页面应当被搜索。例如,onesidx1.cache s1=r1,r2,r3可以指示处理器:1)在存储器中搜索从存储器中r1所寻址的、偏移存储在r1中的值的字节开始一直到高速缓存行末尾的位;2)在位于s1中的一字节子寄存器中存储每个被设为一的位的索引;及3)在r3中存储找到的索引的个数。在其它实施例中,完成符btype可以是指示要搜索的字节数的数字。

在这种实施例中,如果s1填满或者位向量中的位都被搜索,则onesidx指令的执行可以终止。因此,不是总能保证onesidx指令将完成存储器中位向量的搜索。因此,以下处理可以在以上onesidx指令每次可以被执行的时候发生:

在步骤1中:位向量从存储器加载到第一寄存器中。为了说明清楚的例子,基于存储在r1中的存储器地址,假设<1000 0100 0111 0000>被加载到第一寄存器中。

在步骤2中:加载的位向量被搜索,在存储在r2中的偏移量开始;发现的索引的数目被存储在SIMD寄存器中;并且发现的索引数被更新。为了解释,假设r2被设为零,SIMD寄存器,s1,是四字节长并且每个子寄存器是一个字节。当第一寄存器中的位向量被搜索时,每个被设为一的位的索引存储在s1中的子寄存器中,直到s1填满。此外,存储在s1中的每个索引递增r3中的值。由于s1不是总宽到足以保持所有索引值,因此,当[0,5,9,10]存储在s1中时,步骤2终止,并且值四存储在r3中。

在步骤3中:操作数r1和r2被更新,使得onesidx指令的后续执行“自动”恢复给存储器中的位向量加索引。在这里,“自动地”意味着在后续burst指令被执行以恢复对存储器中所存储的位向量的处理之前操作数不需要被更新。因此,继续该例,r1递增二,以便指向在其搜索终止的字节。此外,r2被设为三,以指示搜索应当恢复的第四位。

因此,onesidx指令的操作数将反映当前状态,使得得onesidx指令的后续执行将在前一执行停止的地方恢复。

在实施例中,操作数可以指示s1中所存储的索引应当存储在存储器中什么地方。此外,操作数可以在步骤3中被更新,使得在后续执行当中索引值被连续地自动存储。

在另一实施例中,位向量可以驻留在r1中。因此,存储在r2中的值可以指示搜索应当在r1中哪一位开始。此外,在步骤3结束时,r2可以被更新,使得onesidx指令的后续执行将在前一执行停止的地方恢复。

硬件图

图4示出了实施例中执行onesidx指令的一组SIMD寄存器。虽然图4为了说明清楚的例子而示出了一种实施例,但是其它实施例可以略去、添加、重新排序或者修改所示出的任何结构。

SIMD寄存器410可以包含包括从存储器加载的一个或多个位的位向量。为了符合以上的例子,寄存器410包括位向量<1000 0100 0111 0000>。如所指示的,寄存器410可以包含更多位,但是那些位在这个例子中未说明。

SIMD寄存器420对应于以上例子中的s1并且可以是一系列子寄存器,使得存储在每个子寄存器中的值可以是寄存器410中被设为一的位的偏移量。具体而言,寄存器420包括子寄存器422、子寄存器424、子寄存器426和子寄存器428,这些分别是用于寄存器410中被设为一的前四位的偏移量。为了符合以上的例子,在执行onesidx指令之后,寄存器420可以包含偏移量值[0,5,9,10],基于寄存器410中被设为一的一个或多个位。具体而言,值0、5、9和10分别存储在子寄存器422、子寄存器424、子寄存器426和子寄存器428中。

存储器490可以是位于SIMD处理器上的片上高速缓存。作为替代,存储器490可以是片下高速缓存,或者主存储器。存储器490可以包含加载到寄存器410中的位向量,如以上步骤1中所描述的。

标量处理

以下伪代码描述了在标量处理器上执行onesidx指令的实施例,类似地利用在以上章节中定义的操作数和完成符作为变量。虽然以下伪代码说明了实施例,但是其它实施例可以略去、添加、重新排序或者修改以下所述的任何部分。

GATHERB

SIMD指令,gatherb,可以被用来读取存储在按索引向量加索引的位向量中的位值。结果可以以许多不同格式存储。例如,结果可以是位掩码,其中每一位代表在位向量中读取的对应位的值,否则就是零。作为替代,结果可以是一系列子寄存器,其中每个子寄存器指示所读取的对应位的值。

在一种实施例中,gatherb指令可以包括三个操作数。第一个操作数可以包含输入位向量。第二个操作数可以包含索引向量。而且,第三个操作数可以包含在执行gatherb指令之后的结果。

寄存器掩码形式

在实施例中,在执行gatherb指令之后,描述所读取的位的值的位掩码可以被存储。此外,gatherb指令可以采取以下形式:

gatherbsz r2=s1,r1

具体而言,在以上实施例中,r1可以是存储位向量的寄存器。寄存器s1可以是SIMD寄存器,它可以包含索引向量,使得s1中的每个子寄存器可以包含索引值。完成符sz可以指示s1中每个子寄存器的尺寸。结果位掩码存储在r2中。

例如,假设位向量<0101 1100 1110 0001>在r1中加载;索引向量[1,5,10,13]在s1中加载,并且s1中每个子寄存器的尺寸是一个字节;并且位掩码<0000 0000 0000 0000>在r2中加载。在执行gatherb1 r2=s1,r1之后,在加索引的位置,位向量中位的值被拷贝到r2中对应的位中。因此,r2可以包含位掩码<0100 0100 0010 0000>。在实施例中,作为初始步骤,当执行gatherb指令时,r2可以被清空,使得r2中来自之前存储的位的假象在将加索引的位的拷贝存储在r2中之前被清空。

寄存器形式

在实施例中,在执行gatherb指令之后,由索引向量加索引的、存储在位向量中的位值可以在对应于索引向量中每个索引值的一系列子寄存器中符号扩充地存储。此外,gatherb指令可以采取以下形式:

gatherb.cmb s2=s1,r1

具体而言,在以上实施例中,r1可以是存储位向量的寄存器。寄存器s1可以是SIMD寄存器,它可以包含索引向量,使得s1中的每个子寄存器可以包含索引值。寄存器s2可以是SIMD寄存器,这可以包含一系列子寄存器,每个子寄存器对应于s1中的子寄存器。完成符cmb可以指定s1和s2当中子寄存器的长度。因此,完成符cmb可以包含两个数值,指示s1的尺寸的第一数值和指示s2的尺寸的第二数值。

在一种实施例中,smb完成符中的数值可以是“b”、“w”或“d”,使得“b”可以指示为一的字节尺寸,“w”可以指示为二的字节尺寸,并且“d”可以指示为四的字节尺寸。其它数值或格式可以在其它实施例中使用。例如,gatherbwd s2=s1,r1可以指示s1中的子寄存器每个是两个字节并且s2中的子寄存器每个是四个字节。

为了说明清楚的例子,假设位向量<0101 1100 1110 0001>在r1中加载;索引向量[1,5,10,13]在s1中加载。在执行gatherbbb r2=s1,r1之后,处于加索引位置的位的值被拷贝到s2中,符号扩充。因此,s2可以包含[<1111 1111>,<1111 1111>,<1111 1111>,<0000 0000>],使得每个位向量都存储在r2中连续的1字节子寄存器中。

硬件图

图5示出了实施例中gatherb指令的寄存器形式的一组寄存器。虽然图5为了说明清楚的例子而示出了一种实施例,但是其它实施例可以略去、添加、重新排序或者修改所示出的任何结构或步骤。

寄存器510与寄存器r1对应并且包含存储在r1中的位向量。因此,在这个例子中,寄存器510包含位向量<0101 1100 1110 0001>。

SIMD寄存器520对应于SIMD寄存器s1并且包含存储在s1中的索引向量。SIMD寄存器520包括一系列子寄存器,每个一字节宽,如由完成符所指示的,使得每个子寄存器在索引向量中存储索引值。具体而言,寄存器520包括:包含第一索引值,一,的子寄存器522;包含第二索引值,五,的子寄存器524;包含第三索引值,十,的子寄存器526;以及包含第四索引值,十三,的子寄存器528。如所指示的,寄存器520可以包含未在图5中示出的更多子寄存器。

SIMD寄存器540对应于SIMD寄存器s2并且包含存储在s2中的值。SIMD寄存器540包括一系列子寄存器,每个一字节宽,如由完成符所指示的,使得在gatherb指令被执行之后,每个子寄存器在被寄存器520中的相应索引值加索引的寄存器510中存储符号扩充的位值。具体而言,基于子寄存器522中对应的索引值,子寄存器542包含寄存器510中第二位的符号扩充的值,<1111 1111>。基于子寄存器544中对应的索引值,子寄存器544包含寄存器510中第六位的符号扩充的值,<1111 1111>。基于子寄存器546中对应的索引值,子寄存器546包含寄存器510中第十一位的符号扩充的值,<1111 1111>。基于子寄存器548中对应的索引值,子寄存器548包含寄存器510中第十四位的符号扩充的值,<0000 0000>。如所指示的,寄存器540可以包括图5中未示出的更多子寄存器。

备选SIMD实现

作为替代,可以使用以下SIMD实现。以下方法可以取以下作为输入:1)代码的向量,及2)单个SET,其中SET可以是利用连续值打包的位向量。例如,对于5位代码的位向量,每个代码可以代表SET中的一位。因此,在例子中,SET可以包含2^5=32位。

具体而言,基于SIMD寄存器的尺寸,以及代码的位宽度,可以执行第一种方法,算法A,或者可以执行第二种方法,算法B:

1.对于N位宽的SIMD寄存器,其中N可以是128、256或更多;

2.确定代码的长度具有K位,例如5位代码;

3.如果2^K<=N,则可以使用算法A,否则使用算法B。

算法A:

1.将集合S(尺寸为2^K)复制到SIMD寄存器中的2^K个分区,对其可以使用thesplat操作。假定个数为P(即,在寄存器中使用P个分区)。因此,如果K=5位并且N=256,则P=256/32=8。

2.加载P个K位代码并且将代码存储在SIMD寄存器中,使得代码在各自的分区中正确对齐。

3.使用可变偏移来偏移每个复制的集合K位代码,以获得目标在小端序位置的位。

4.MOVEMASK,以获得目标指向位掩码的位,然后拷贝到位向量。

算法B:

1.将代码加载到SIMD寄存器中,类似于以上的步骤(2)。

2.用八去除每个分区,以获得字节偏移,其中位位于SET中。

3.执行GATHER指令,以便从SET中读取字节,这个操作并行地读取每个字节。

4.执行步骤(1)中值的MOD操作,以获得位偏移量,即,字节中目标位we想位于的位位置。

5.利用(4)和(3)执行可变偏移,以便将位偏移到低端位置。以及

6.MOVEMASK,以便取得从步骤(3)计算的256位寄存器中八个1位值并且拷贝到位向量。

以下是利用之前描述的两种算法的两个例子:

1)在256位SIMD寄存器中跨32位分区Splat目录,其中splat将一组位拷贝到每个子寄存器中。由于SET是32位宽,因此SET的八个拷贝存储在SIMD寄存器中。2)在SIMD寄存器中加载八个5位代码,使得每个代码在256位寄存器中的32位边界上对齐,并且执行:a)SIMD LOAD;b)SHUFFLE,以获得32位分区中的代码;c)可变右移,以向右偏移每个代码,使得每个代码在32位分区的低端对齐;及d)AND,掩蔽掉每个分区中的高位,使得仅仅留下代码。3)接下来,关于来自步骤(2)的索引寄存器,利用来自步骤(1)的SET寄存器应用可变偏移。加索引的位存储在每个32位分区的低端位位置中。4)MOVEMASK,以取得256位寄存器中从步骤(3)计算的八个1位值并且拷贝到位向量。

作为替代,对于更高的位宽度,例如,可以比SIMD子寄存器的尺寸宽的10位目录代码或更多,可以执行以下方法:1)将代码加载到SIMD寄存器中,类似于以上的步骤(2)。2)用八去除每个分区,以获得位要在SET中定位的字节偏移量。3)执行GATHER指令,以便从SET读取字节,这个操作并行地读取每个字节。4)执行步骤(1)中的值的MOD操作,以获得位偏移量,即,字节中目标位we想位于的位位置。5)利用(4)和(3)执行可变偏移,以便将位偏移到低端位置。而且,6)MOVEMASK,以取得256位寄存器中从步骤(3)计算的八个1位值并且拷贝到位向量。

位向量比较结果

SIMD指令,BitVecCmpRes,可以被用来比较存储在两个SIMD寄存器中的两个值向量。具体而言,第一SIMD寄存器中的每个子寄存器与第二SIMD寄存器中的对应子寄存器进行比较。输出可以是存储在结果寄存器中的空间高效位向量。

此外,在实施例中,可以包括指示结果寄存器中结果位向量应当存储的偏移量的偏移量。具有偏移量可以允许几个BitVecCmpRes执行的结果保存在相同的位向量中。

在实施例中,BitVecCmpRes指令可以采取以下形式:

BitVecCmpResSZ r1=s1,s2,r2

具体而言,在以上实施例中,寄存器s1可以是包含第一值向量的SIMD寄存器,其中第一值向量中的值存储在s1中的一系列子寄存器中。寄存器s2可以是包含第二值向量的SIMD寄存器,其中第二值向量中的值存储在s2中的一系列子寄存器中。s1中的每个子寄存器在s2中具有对应的子寄存器,并且反之亦然。完成符SZ可以指示s1和s2中的每个子寄存器的尺寸。寄存器r1可以是包含结果位向量的寄存器,其中位向量中的每一位对应于s1和s2中的对应子寄存器。此外,如果s1和s2中的对应子寄存器中的值匹配,则位向量中的每一位被设为一,否则设为零。寄存器r2可以包含结果位向量应当从其开始在r1中存储的偏移量。

为了说明清楚的例子,假设s1中的位向量包含[98,62,21,16]并且s2中的值向量包含[62,62,21,46]。另外假设在r2中加载的值为零。在执行BitVecCmpRes1 r1=s1,s2,r2之后,结果位向量<0110>可以存储在r1中。

另外,假设s1、s2和r2中的值被更新,使得s1包含[14,24,12,58],s2包含[22,76,48,58],并且r2包含值四。在第二次执行BitVecCmpRes1 r1=s1,s2,r2之后,r1可以包含位向量<0110 0001>。存储在r1中的位向量的前四位不由于第二次执行而被破坏(clobbered),因为来自第二次执行的结果位偏移了四。

硬件图

图6示出了实施例中结合BitVecCmpRes指令使用的一组寄存器。虽然图6为了说明清楚的例子而示出了一种实施例,但是其它实施例可以略去、添加、重新排序或者修改所示出的任何结构或步骤。

SIMD寄存器610对应于SIMD寄存器s1并且包含在第一次执行BitVecCmpRes指令之前s1中所存储的值向量。SIMD寄存器610包括一系列子寄存器,每个子寄存器是一字节,如由完成符所指示的,使得每个子寄存器存储第一值向量中的一个值。具体而言,寄存器610包括:包含第一个值,九十八,的子寄存器612;包含第二个值,六十二,的子寄存器614;包含第三个值,二十一,的子寄存器616;以及包含第四个值,十六,的子寄存器618。如所指示的,寄存器610可以包含图6中未示出的更多子寄存器。

SIMD寄存器620对应于SIMD寄存器s2并且包含在第一次执行BitVecCmpRes指令之前s2中所存储的值向量。SIMD寄存器620包括一系列子寄存器,每个子寄存器是一字节,如由完成符所指示的,使得每个子寄存器存储第二值向量中的一个值。具体而言,寄存器620包括:包含第一个值,六十二,的子寄存器622;包含第二个值,六十二,的子寄存器624;包含第三个值,二十一,的子寄存器626;以及包含第四个值,四十六,的子寄存器628。如所指示的,寄存器620可以包含图6中未示出的更多子寄存器。

寄存器630与寄存器r1对应并且包含存储在r1中的位向量。因此,在这个例子中,在第一次执行结束时,寄存器610包含位向量<0110>,如以上所讨论的。

寄存器640与寄存器r2对应并且包含存储在r2中的值。因此,在这个例子中,在BitVecCmpRes指令第一次执行之前,寄存器640包含值零,如以上所讨论的。

各种其它操作

在备选实施例中,完成符还可以指定在对应子寄存器之间进行的比较的类型。例如:

BitVecCmpResSZ.gt r1=s1,s2,r2

在以上例子中,操作数和SZ完成符可以与以上讨论的类似地被使用。但是,在这个例子中,如果s1中对应子寄存器中的值大于s2,则位向量中的每一位被设为一,否则设为零。同样,任何比较运算符都可以使用,例如,小于(“lt”)、小于等于(“tle”)、大于等于(“gte”)、等于(“eq”)、不等于(“neq”),等等。

变体

在以上所说明的一些实施例中,每个子寄存器可以是四、八或十六位宽。其它实施例可以包括其它宽度,包括但决不限于四位、八位、三十二位、六十四位。

在许多例子中,子寄存器可以是一字节。但是,子寄存器可以大于或小于一字节。此外,缺省宽度、操作数或完成符可以被用来定义用于特定指令的子寄存器的宽度。

在以上说明和讨论的一些实施例中,最低有效位在寄存器或存储器的左侧说明,符号位在右侧说明,并且位或字节向特定的一侧填充或偏移。但是,以上包括的例子不是要作为限制。以上所讨论的指令可以在与所说明不同的许多各种硬件配置上实现。

虽然以上所述的方法可以集中在SIMD体系架构,但是这些方法也可以在标量或其它非SIMD处理器上实现。所述方法还可以作为应用编程接口的一部分被包括。此外,所述方法可以实现为内在的,可以是编译器认可并利用汇编或机器代码的特定块代替的函数。还有,一条或多条指令可以存储在一个或多个非暂态计算机可读介质上,当其被一个或多个处理器执行时,可以使本文所述的一个或多个方法得以执行。

在许多例子中,SIMD寄存器包括四个子寄存器。这决不是要进行限制。SIMD寄存器可以包括更多或更少子寄存器,所有这些都可以具有变化的宽度。

在实施例中,存储器随着地址增加而增长。在另一种实施例中,存储器随着地址减小而增长。因此,任何指令也都可以包括指示存储器朝哪个方向增长的完成符或操作数。

硬件概述

根据一种实施例,本文所述的技术是由一个或多个专用计算设备实现的。专用计算设备可以为执行所述技术而硬连线,或者可以包括持久性编程为执行所述技术的诸如一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA)的数字电子设备,或者可以包括按照固件、内存、其它储存器或者其组合中的程序指令编程为执行所述技术的一个或多个通用硬件处理器。这种专用计算设备还可以结合具有实现所述技术的定制编程的定制硬连线逻辑、ASIC或FPGA。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者为了实现所述技术而结合硬连线和/或程序逻辑的任何其它设备。

例如,图7是示出本发明实施例可以在其上实现的计算机系统700的框图。计算机系统700包括用于传送信息的总线702或者其它通信机制,以及与总线702耦合的、用于处理信息的硬件处理器704。硬件处理器704可以是例如通用微处理器。

计算机系统700还包括耦合到总线702用于存储信息和要由处理器704执行的指令的主存储器,诸如随机存取存储器(RAM)或者其它动态存储设备。主存储器706还可以用于在要由处理器704执行的指令的执行过程中存储临时变量或其它中间信息。当存储在处理器704可访问的存储介质中时,这种指令使计算机系统700成为定制成执行指令中所规定的操作的专用机器。

计算机系统700还包括耦合到总线702的、用于存储用于处理器704的静态信息和指令的只读存储器(ROM)708或者其它静态存储设备。存储设备710,诸如磁盘或光盘,被提供并耦合到总线702,用于存储信息和指令。

计算机系统700可以经由总线702耦合到显示器712,诸如阴极射线管(CRT),用于向计算机用户显示信息。包括字母数字和其它键的输入设备714耦合到总线702,用于向处理器704传送信息和命令选择。另一种类型的用户输入设备是光标控制716,诸如鼠标、轨迹球,或者光标方向键,用于向处理器704传送方向信息和命令选择并且用于控制显示器712上的光标运动。这种输入设备通常具有两个轴中的两个自由度,第一个轴(例如,x)和第二个轴(例如,y),这允许设备在平面中规定位置。

计算机系统700可以利用定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑实现本文所述的技术,这些与计算机系统结合,使计算机系统700或者编程计算机系统700成为专用机器。根据一种实施例,响应于处理器704执行主存储器706中所包含的一条或多条指令的一个或多个序列,本文所述的技术由计算机系统700执行。这种指令可以从另一个存储介质,诸如存储设备710,读到主存储器706中。主存储器706中所包含的指令序列的执行使处理器704执行本文所述的步骤。在备选实施例中,硬连线的电路系统可以代替软件指令或者与之结合使用。

如在本文中所使用的,术语“存储介质”指存储使机器以特殊方式操作的数据和/或指令的任何介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括,例如,光盘或磁盘,诸如存储设备710。易失性介质包括动态存储器,诸如主存储器706。存储介质的常见形式包括,例如,软盘、柔性盘、硬盘、固态驱动器、磁带、或者任何其它磁性数据存储介质,CD-ROM、任何其它光学数据存储介质,任何具有孔模式的物理介质,RAM、PROM及EPROM、FLASH-EPROM、NVRAM,任何其它存储器芯片或磁带盒。

存储介质与传输介质不同但是可以与其结合使用。传输介质参与在存储介质之间传输信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线702的电线。传输介质还可以采取声波或光波的形式,诸如在无线电波和红外线数据通信过程中生成的那些波。

各种形式的介质可以在把一个或多个指令的一个或多个序列携带到处理器704以供执行的时候涉入其中。例如,指令可以最初在磁盘或远端计算机的固态驱动器上携带。远端计算机可以把指令加载到其动态存储器中并且利用调制解调器经电话线发送指令。计算机系统700本地的调制解调器可以在电话线上接收数据并且使用红外线发送器把数据转换成红外线信号。红外线探测器可以接收在红外线信号中携带的数据并且合适的电路系统可以把数据放到总线702上。总线702把数据携带到主存储器706,处理器704从其检索并执行指令。在被处理器704执行之前或之后,主存储器706接收到的指令可以可选地存储在存储设备710上。

计算机系统700还包括耦合到总线702的通信接口718。通信接口718提供耦合到网络链路720的双向数据通信,其中网络链路720连接到本地网络722。例如,通信接口718可以是综合业务数字网络(ISDN)卡、电缆调制解调器、卫星调制解调器,或者向对应类型的电话线路提供数据通信连接的调制解调器。作为另一个例子,通信接口718可以是向兼容的LAN提供数据通信连接的局域网(LAN)卡。无线链路也可以实现。在任何这种实现中,通信接口718发送并接收携带代表各种类型信息的数字数据流的电、电磁或光信号。

网络链路720通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路720可以通过本地网络722向主机计算机724或者向由因特网服务提供商(ISP)726运营的数据设备提供连接。ISP 726又通过全球范围的分组数据通信网络,现在通常称为“因特网”728,提供数据通信服务。本地网络722和因特网728都使用携带数字数据流的电、电磁或光信号。通过各种网络的信号和网络链路720上并且通过通信接口718的信号是传输介质的示例形式,其中通信接口把数字数据携带到计算机系统700并且从其携带数字数据。

计算机系统700可以通过(一个或多个)网络、网络链路720和通信接口718发送消息和接收数据,包括程序代码。在因特网例子中,服务器730可以通过因特网728、ISP 726、本地网络722和通信接口718发送所请求的用于应用程序的代码。

所接收到的代码可以由处理器704在接收到的时候执行,和/或存储在存储设备710或其它非易失性储存器中,用于以后执行。

在以上说明书中,已经参考众多具体细节描述了本发明的实施例,对于不同的实现,这些细节会有所变化。因此,说明书和附图要在说明性而不是约束性的意义上考虑。本发明范围的唯一和排它指示,以及本申请人预期要作为本发明范围的内容,是以权利要求发布的具体形式从本申请发布的权利要求集合的字面和等效范围,包括任何后续的修正。

对相关申请的交叉引用;权益保护

本申请依据35U.S.C.§119(e)要求于2013年3月15日提交的临时申请No.61801207的权益。该申请作为后续申请依据35U.S.C.§120要求于2013年9月10日提交的非临时申请序列No.14023064的优先权。这个申请作为后续申请依据35U.S.C.§120要求于2013年9月10日提交的非临时申请序列No.14023249的优先权。这个申请作为后续申请依据35U.S.C.§120要求于2013年9月10日提交的非临时申请序列No.14023265的优先权。这些文献当中每一个的全部内容都通过引用被结合于此,就像在本文完全阐述一样。

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