实现掩蔽向量指令的系统和方法
文献发布时间:2023-06-19 11:32:36
本申请要求于2018年9月18日提交的美国临时申请62/732,638的优先权,其全部内容通过引用合并于此。
技术领域
本公开涉及到计算机处理器,并且特别地,涉及支持包括掩蔽向量指令的向量指令的处理器。
背景技术
向量处理器(也被称为阵列处理器)是一种硬件处理装置(例如,中央处理单元(CPU)或图形处理单元(GPU)),其实现包含对数据元素的向量进行操作的向量指令的指令集架构(ISA)。向量是包含有序的标量数据元素的单向数组。作为比较,标量指令对单个数据元素进行操作。通过对包含多个数据元素的向量的操作,与支持在单个数据元素上操作的标量指令的标量处理器相比,向量处理器可以实现显著的性能提升。
附图说明
通过以下给出的详细描述和本公开的各个实施例的附图,将更充分地理解本公开。然而,这些附图不应被用于将本公开限制于特定实施例,而仅是为了解释和理解。
图1示出了根据本公开的实施方式的包括掩蔽向量指令的硬件处理器。
图2示出了根据本公开的实施方式的用于管理掩码寄存器的方法的流程图。
具体实施方式
硬件处理器的向量指令是在包含某种数据类型的不只一个元素的向量上执行操作的指令。输入和输出数据可以存储在与处理器相关联的一个或多个向量寄存器中。这些向量寄存器是设计用于保存向量的多个数据元素的存储单元。
示例性向量指令包括x86指令集体系架构(ISA)使用的流式单指令多数据扩展(SSE)指令。ISA的某些实现可以支持可变长度向量指令。可变长度向量指令包括寄存器标识符,其指定存储将要由指令处理的向量的元素数量的寄存器。可变长度向量指令中的寄存器被称为向量长度寄存器。
在某些应用领域(诸如图形着色器)中向量指令可能需要实现用于抑制在向量内的某些位置的元素的影响的机制(称为掩蔽)。掩蔽(masking)的发生可以基于某些条件语句(例如“IF”,“ELSE”和“END-IF”)的结果。在某些情况下,条件可以嵌套。相应地,掩蔽也可以嵌套。
在对图形处理单元(GPU)和通用计算图形处理单元(GPGPU)的编程中,通常要执行的应用代码可以包括由隐式FOR-ALL-ITEMS包围的直线式代码。数据项可以分别为图形模型的顶点、片段或工作项,这取决于应用目的。
应用代码可以容易地转换为向量操作的集合。每个向量操作都对多组输入执行特定的操作。向量操作也称为向量指令。
例如,适用于所有项的一行代码可以是:
FOR-ALL-ITEMS
z=x+y
此代码可以被转换为向量指令:
vadd_w$n,$vz,$vx,$vy
其中vadd_w是对32位字操作的无掩蔽向量加法指令,$n是包含项的数量的向量长度寄存器,$vx和$vy是包含x和y的值的输入向量寄存器,以及$vz是包含输出值z的目标向量寄存器。虽然有可能项的数量不能适配单个向量指令,但为了简要说明,假定最大向量长度是足够大的,以使得所有的操作可以被转换为单个向量指令。
vadd_w指令的语义对应于:
for(i=0;i<$n;i++)
$vz[i]=$vx[i]+$vy[i]
然而,如果循环内核中存在条件语句,则为了有效地将这些循环内核转换为向量操作,需要有能力针对满足条件的索引选择性地执行指定的操作。
条件向量操作的示例如下:
在以上示例中,仅当z等于0时,才将z的值设置为x+y。可以使用掩码寄存器来将该循环内核转换为向量操作。存储在掩码寄存器中的掩码位可表示条件(z是否等于0),其中掩码位可以基于所述条件为真还是假被设置,并且仅在条件为真的情况下执行相对于元素对应的操作。使用此功能,上面的循环内核将被转换为:
vcmp_eq $n,$m,$vz,$v0
vaddm_w $n,$vz,$vx,$vy,$m
其中vcmp_eq是向量比较指令,其检查z是否等于0的条件,并在掩码寄存器($m)中设置掩码位,vaddm_w是掩蔽向量加法指令,其仅当相应的掩码位=1时对元素执行加法操作,其中掩码位=0的元素保持不变;$n为向量长度寄存器,其中包含每个输入向量中数据元素的数量,并相应地包含掩码位的数量;$m为包含掩码位的向量掩码寄存器,其中值0表示条件为假(“False”)而值1表示条件为真(“True”);$vx、$vy和$vz是向量寄存器,分别包含x,y和z的值;$v0为所有元素都被设置为0的向量寄存器。
因此,基于由掩码寄存器中所提供的掩码值所指定的条件,可以执行掩蔽向量指令以对输入向量进行指定的操作。vaddm_w指令的语义可以被翻译为:
for(i=0;i<$n;i++)
if($m[i])
$vz[i]=$vx[i]+$vy[i]
在一些实施方式中,掩码可以抑制与被掩蔽的数据元素相关联的所有相关操作。除了防止目标寄存器的值被覆盖,对i*索引的掩蔽也可以抑制对诸如浮点状态寄存器之类的状态寄存器的任何改变,并防止触发任何异常。
在一些实施方式中,循环内核可以包括串联条件。串联条件的示例如下:
上面的源代码可以被转换成以下机器指令:
如上所示,该代码是在没有硬件堆栈的情况下实现的。在一些实施方式中,循环内核可以包括嵌套条件。嵌套条件的示例如下:
如在以上示例中所见,条件可以嵌套在多层中。掩码寄存器(例如,$m1-$m4)被称为生成掩码寄存器,因为这些掩码寄存器的值是基于源代码中的条件语句设定的。最终掩码寄存器(例如,$m0)可以用来存储(通过AND(&)操作)所组合的这些生成掩码寄存器的值。随着条件(“if”)语句的嵌套越来越深,掩码寄存器的数量和计算最终掩码的操作数量呈线性增加。使用相同的技术,掩码寄存器文件的读取端口数量和导出最终掩码所需的指令数量也会线性增加。因此,当前处理掩蔽向量指令的方法效率不高并且不能很好地扩展。
因此,当前的实施方式经常使用专用的硬件实现来支持嵌套的if语句。一个实施方式是维护掩码的两个堆栈,包括一个生成堆栈和一个最终堆栈:
·最初
o该生成堆栈是空的o最终堆栈包含一个条目,全1的掩码。
·遇到新的if时,
o与条件相对应的掩码被压入生成堆栈上
o掩码与在最终堆栈顶部的掩码使用AND运算符处理并且将结果压入最终堆栈
·当遇到else时
o最终堆栈被弹出
o最终堆栈的新顶部与在生成堆栈顶部的掩码的补码使用AND运算符进行操作,并且将结果压回至该累加堆栈。
·遇到endif时,两个堆栈都被弹出
·当掩蔽操作被使用时,使用最终堆栈顶部的掩码进行掩蔽。
该专用硬件堆栈实施方式存在若干缺陷:
·仅处理嵌套if;其他结构,例如串联的if可能需要在使用之前转换为嵌套的if形式,
·仅硬件堆栈顶部的掩码可用于进行掩蔽。这意味着不可能对使用不同掩码的操作进行重新排序。这可能导致次优的指令排序。
·专用硬件堆栈的实现比掩码寄存器更复杂。
为了克服当前处理掩蔽向量方法中的上述和其他缺陷,本公开的实施方式提供了处理器的体系架构和实现对向量操作进行掩蔽的方法。为此,实施方式提供了以下内容:
·掩码寄存器数组,
·根据掩码寄存器中的位进行掩蔽的向量操作,
·比较向量寄存器的值和设置掩码寄存器的向量操作,
·其本身根据掩码寄存器中的位进行掩蔽的向量比较操作,
·操纵被掩蔽的寄存器的指令,以及
·一种向存储器和自存储器传送被掩蔽的寄存器的方法。
对于向量寄存器操纵被掩蔽的寄存器的指令可以包括形式为VMOP$mt,$ma,$mb的指令,其中$mt中的每个位被设置为$mb和$ma的相应位的布尔组合。布尔组合可以至少包括AND操作(即,x&y)以及AND-complement(即,x¬ y),虽然其它组合也是有用的。这也有助于指定操作VMINV$mt,$ma,该操作将$mt的每一位设置为$ma相应位的按位补码。
以下是源代码及由编译器生成的其对应的处理器指令的示例。给出的源代码是:
假设所有项都适配在单个寄存器中,其中x、y、z在$vx、$vy、$vz中,$v0使用显式掩码保持全0,相应的处理器指令是:
如果用于进行掩蔽的掩码寄存器是固定的,例如为0,则可能需要掩码的变体以组合操作(即,以上的vand、vand_inv、vinv),其将它们的结果写入包括$m0和另一个的两个掩码寄存器。上面的代码可以重写为:
在一种实施方式中,被掩蔽的每一个向量指令都指定掩码寄存器以存储最终结果。
在另一实施方式中,一些或所有被掩蔽的向量指令可以使用特定的掩码寄存器。在这样的实施方式中,具有将两个掩码寄存器设置为相同值的掩码操纵操作是有益的。因此,VMOP2$mt1,$mt2,$ma,$mb将掩码寄存器$mt1和$mt2中的每个位设置与$ma和$mb的相应位的按位组合。同样地,VMINV$mt1,$mt2,$ma将$mt1和$mt2中的每个位设置为$ma中相应位的按位补码。
以下各部分描述了如何使用上述的掩蔽寄存器的方法仿真基于硬件堆栈的实施方式的功能。生成的代码将使用掩码寄存器来跟踪基于硬件堆栈的实施方式所使用的掩码。应该会在最终堆栈中的两个掩码和生成的掩码都被保存在掩码寄存器中。
可以通过软件组件(例如,编译器)和硬件组件(例如,掩码操纵指令)来实现本公开的实施方式。此外,处理器可以维护用于跟踪所生成的掩码的掩码寄存器的第一列表(对应为“生成掩码堆栈”)和用于跟踪最终掩码的掩码寄存器的第二列表(称为“最终掩码堆栈”)。由于编译器解析应用程序的源代码并将源代码转换为包括向量指令的处理器指令,因此编译器可以确定嵌套层数,并基于嵌套层数来维护生成掩码堆栈和最终掩码堆栈。堆栈中的每个元素均可单独标识为掩码寄存器。编译器应该能够识别用于计算最终掩码的掩码寄存器。
图1示出了根据本公开的实施方式的包括掩蔽向量指令的硬件处理器100。处理器100可以是中央处理单元(CPU)、CPU的处理核、图形处理单元(GPU)或任何合适类型的处理装置。如图1所示,处理器100可以包括向量指令执行流水线104、向量寄存器文件106、掩码寄存器文件108。处理器100可以包括实现掩蔽向量指令118和根据向量指令集体系架构102指定的其他指令的电路,其中掩蔽向量指令118可以包括可变长度向量指令和固定长度向量指令。可变长度向量指令包括长度寄存器的标识符,该长度寄存器指定向量元素上的操作数量。固定长度向量指令执行预定的固定数量的操作。向量指令执行流水线104可以包括指令获取阶段、指令解码和寄存器读取阶段、指令执行阶段以及指令回写阶段。向量指令执行流水线104的每一阶段可处理一个或一个以上向量指令的单独的微操作。这些指令基于时钟周期移动通过向量指令执行流水线104。
在一种实施方式中,处理器100可以支持编译器116、生成掩码堆栈110和最终掩码堆栈112。编译器116可以包括可执行代码,该可执行代码可以在被执行时将程序的源代码转换成处理器指令,例如由向量指令集102指定的掩蔽向量指令118。堆栈是线性数据结构,遵循特定的顺序来存储和访问该数据结构中的数据项。例如,在堆栈中的数据项可以是以先进先出(FIFO)的顺序或后进先出(LIFO)的顺序被访问。在一个实施方式中,可以使用通用寄存器或使用处理器100可访问的存储器来实现生成掩码堆栈110和最终掩码堆栈112。生成掩码堆栈110可以存储代表生成掩码寄存器的标识符的有序列表;最终掩码堆栈112可以存储最终掩码寄存器的有序列表。本公开的实施方式采用生成掩码堆栈110和最终掩码堆栈112来跟踪生成掩码寄存器和最终掩码寄存器。
处理装置可以执行编译器,该编译器读取程序的源代码,并确定条件语句(例如,IF,ELSE,END-IF)以及生成包括掩蔽向量指令118的处理器指令。处理装置可以进一步基于所识别的条件语句来更新生成掩码堆栈和最终掩码堆栈。图2示出了根据本公开的实施方式的用于管理掩码寄存器的方法200的流程图。方法200可以由处理装置执行,该处理装置可以包括硬件(例如,电路、专用逻辑)、计算机可读指令(例如,在通用计算机系统或专用机器上运行)或两者的组合。方法200及其每个单独的功能、例程、子例程或操作可以由执行该方法的计算机装置的一个或多个处理器执行。在某些实施方式中,方法200可以由单个处理线程执行。或者,方法200可以由两个或多个处理线程执行,每个线程执行该方法的一个或多个单独的功能、例程、子例程或操作。
为了简化说明,将本公开的方法描绘和描述为一系列动作。然而,根据本公开的动作可以以各种顺序和/或同时发生,并且具有本文未呈现和描述的其他动作。此外,可能不需要所有示出的动作来实现根据所公开的主题的方法。另外,本领域技术人员将理解并认识到,所述方法可替代地经由状态图或事件被表示为一系列相互关联的状态。另外,应当理解,在本说明书中公开的方法能够被存储在制品上,以便于将这样的方法传输和转移到计算装置。本文所使用的术语“制品”旨在涵盖可从任何计算机可读装置或存储介质访问的计算机程序。在一个实现中,如图1所示,方法200可以由处理器100执行,该处理器100执行编译器116和由编译器116生成的掩蔽向量指令。
编译器116可以接收和读取可能包含条件语句的应用程序的源代码。条件语句可以包括IF,ELSE和END-IF语句。此外,条件语句可以复合为嵌套条件语句。如图2所示,在202处,响应于在源代码中识别出IF语句,处理器100可以执行编译器116以生成第一掩蔽向量指令,该第一掩蔽向量指令在被执行时将表示与该IF语句相关联的掩码寄存器的标识符存储在生成掩码堆栈110的头部位置;并且响应于确定最终掩码寄存器之前已被设置,处理器100可以执行编译器116,以生成第二掩蔽向量指令,该第二掩蔽向量指令在被执行时,将表示掩码寄存器的标识符存储在最终掩码堆栈112的头部位置。在生成掩码堆栈110的头部位置和最终掩码堆栈112的头部位置存储标识符可以包括将已经存储在堆栈中的标识符向下压入一个位置。
响应于识别出ELSE语句,在204处,处理器110可以执行编译器116,以生成第三掩蔽向量指令,该第三掩蔽向量指令在被执行时,对由在生成掩码堆栈110的头部位置存储的标识符所标识的掩码寄存器中存储的值取反。
响应于识别出END-IF语句,在206处,处理器100可以执行编译器116,以生成第四掩蔽向量指令,该第四掩蔽向量指令在被执行时,移除在生成掩码堆栈110的头部位置存储的标识符,并移除在最终掩码堆栈112的头部位置存储的标识符。从生成掩码堆栈110和最终掩码堆栈112中移除标识符可以包括将已经存储在堆栈中的标识符向上移动一个位置。
响应于识别出IF、ELSE、END-IF语句组合的结论,在208处,处理器100可以执行编译器116,以生成第五掩蔽向量指令,该第五掩蔽向量指令在被执行时,通过执行生成掩码堆栈110的头部位置所标识的掩码寄存器和最终掩码堆栈112的头部位置所标识的掩码寄存器之间的AND操作来生成最终掩码。掩蔽向量指令可以对未被最终掩码所掩蔽的向量元素执行操作。
在210处,处理器100可以执行由编译器116生成的掩蔽向量指令。
下面的表1示出了由编译器管理生成掩码堆栈和最终掩码堆栈的示例。
表1
在一个实施方式中,掩码寄存器文件108可以包括八个掩码寄存器$m0-$m7,其中$m0保留用于掩码向量操作,而掩码寄存器$m1至$m7可用于编译器以用作生成掩码堆栈108中的标识符(例如,$m1至$m4)和最终掩码堆栈110中的标识符(例如,$m5至$m7)。因此,利用八个掩码寄存器,编译器116可以处理多达四嵌套层。对于深度超过四层的嵌套,编译器可以使用存储器来创建虚拟掩码寄存器,并在必要时恢复这些虚拟掩码寄存器。
编译器负责生成可用于管理如以上所述的生成掩码堆栈和最终掩码堆栈的指令。本公开的实施方式还提供了硬件支持,以支持管理掩码寄存器。硬件支持可以包括在向量指令集102中指定的某些掩蔽向量指令118。
在一个实施方式中,向量指令集102可以指定掩蔽向量比较指令(“VCMPM”)。该掩蔽向量比较指令(“VCMPM”)可以比较向量寄存器和建立目标掩码寄存器。
vcmpm_op $n,$mt,$vx,$vy
其中op是比较操作,例如等于、大于等。此指令可能具有以下语义:
for(i=0;i if(m0[i]) mt[i]=vx[i]op vy[i] 注意该指令本身被实现为掩蔽向量指令。该实施方式可以确保不触发意外的异常。所述异常可包括IEEE浮点无效异常,如果比较是浮点比较,其中两个参数中的任一个是无效时,可能发生IEEE浮点无效异常。 在一个实施方式中,向量指令集102可以指定向量集掩码指令(“VSETM”),该向量集掩码指令可以将两个掩码寄存器的AND结果写入两个目标向量掩码寄存器中,该两个目标向量掩码寄存器包括由向量掩码指令使用的第一目标掩码寄存器和用于保存该值以备将来使用的第二个目标掩码寄存器。 vsetm $n,$mt,$ma,$mb 其中vsetm可以对$ma和$mb的每个元素执行AND操作,并将结果写入$mt,并在默认情况下写入$m0。该指令的语义是: for(i=0;i mt[i]=ma[i]&mb[i] m0[i]=ma[i]&mb[i] 注意,执行vsetm可能会导致写入两个指定的目标寄存器$mt和$m0,因为$m0被隐式指定为第二个目标掩码寄存器,其用作所有掩蔽向量指令的执行掩码。 在另一实施方式中,向量指令集102可以指定向量反转掩码寄存器(“VINVM”),该向量反转掩码寄存器(“VINVM”)可以将一个掩码寄存器与另一掩码寄存器的反转的AND结果写入两个目标向量掩码寄存器,所述两个目标向量掩码寄存器包括由向量掩码指令使用的第一目标向量掩码寄存器与用于保存该值以供将来使用的第二个掩码寄存器。 vinvm$n,$mt,$ma,$mb 其中vinvm可以对$ma和!$mb的每个元素执行AND操作,并将结果写入$mt,并且在默认情况下写入$m0。该指令的语义是: for(i=0;i mt[i]=ma[i]&!mb[i] m0[i]=ma[i]&!mb[i] 注意,执行vinvm可能会导致写入两个指定的目标寄存器$mt和$m0,因为$m0被隐式指定为第二个目标掩码寄存器,其用作所有掩蔽向量指令的执行掩码。 在一个实施方式中,vsetm和vinvm可以组合成单个向量指令,该向量指令可以包括指示该指令是执行vsetm操作还是vinvm操作的标志。 附录A示出了用于支持编译器以管理掩码寄存器和相关联的生成掩码堆栈、最终掩码堆栈的这些向量指令的示例用法。 在一些实施方式中,向量的数据元素可以包括复合类型的数据项,而不是仅包括标量类型的数据项。例如,数据元素可以是ivec4类型,它是包含四个整数值的向量。ivec4类型的示例用法如下: ivec4x,y,z; FOR-ALL-ITEMS z=x+y 向量化这个的一种方法是将复合值视为由标量值组成,然后向量化标量等效值。该方法可以将复合值扩展为标量值,并且如上所述对标量数据元素执行掩蔽向量操作。另一实施方式可以包括直接对复合值进行操作的掩蔽向量指令。在该实施方式中,每个向量寄存器可用于保存ivec4数据元素的数组,而不是标量数据元素的数组。这意味着向量可以容纳整数标量值数量的4倍。向量指令的示例如下: vadd_w$n4,$vz,$vx,$vy 其中vadd_w是对32位字操作的向量加法指令,$n4是向量长度寄存器,$vx、$vy是包含ivec4x和y值的输入向量寄存器,并且$vz是将会包含ivec4z的值的目标向量寄存器。向量长度寄存器$n4可以存储与复合值中的标量数据元素的数量匹配的长度值。对于ivec4数据类型,$n4可以存储表示元素的值4。对于其他类型的复合数据值,$n4可以存储不同的值。因此,可以使用向量长度寄存器$n4来构造可变长度向量指令。 在某些情况下,向量指令可以对包括标量值和复合值两者的混合类型的数据元素进行操作。考虑以下示例,
一种解决方案是并行化使用两个不同的长度的操作,一个长度等于项的数量,一个长度为项的数量的长度的四倍。转换后的形式为 vadd_w $n4,$vz,$vx,$vy vadd_w $n,$vc,$va,$vb 这可以类似地应用于掩蔽向量指令执行。考虑如下标量操作用于计算对于ivec4操作的掩码的情况:
其中标量值b和c用作对ivec4值x和y进行掩蔽的条件。以下简单的转换顺序的实施方式并不正确: vcmp_eq $n,$m,$vz,$v0 vaddm_w $n4,$vz,$vx,$vy 这是不正确的,因为vcmp_eq的执行为每个项产生一个位,但是该位需要控制ivec4的vaddm_w中的4个位置。在一个实施方式中,可以通过将每个位复制4次来扩展掩码。下面的序列引入将掩码扩展4倍的指令。 vcmp_eq $n,$m,$vz,$v0 vexpm_4 $n,$m,$m vaddm_w $n4,$vz,$vx,$vy 指令vexpm_N$n,$ma,$mb可以将$mb扩展4倍,并将扩展后的值存储在$ma中。vexpm_4的语义如下: for(i=0;i<$n;i++) for(j=0;j $ma[N*i+j]=$mb[i] 在另一个实施方式中,可以通过长度寄存器来指定整数值N(即扩展因子),而不是在指令中对其进行编码。 在某些情况下,标量和向量操作可能都需要进行掩蔽,如以下示例所示:
尽管对于ivec4操作是正确的,但是对于标量整数操作,掩码寄存器的扩展可能不正确。可以通过在扩展掩码寄存器之前执行标量操作来解决此问题,如下所示: vcmp_eq $n,$m,$vz,$v0 vsubm_w $n,$vc,$va,$vb vexpm_4 $n,$m vaddm_w $n4,$vz,$vx,$vy 通过该排序,在使用正确的掩码扩展掩码之前进行减法。 本公开的实施方式可以将复合类型编码为指令的一部分,将复合值中的元素数量乘以存储在长度寄存器($n)中的值以指定向量的长度,通过复合类型的元素数量扩展每个掩码位。 一个实施方式可以在向量指令中使用后缀_xN来指示该指令对长度为N的复合体进行操作。因此,vadd_w_x4是4个元素复合体的加法,即ivec4。vadd_w_x2可以表示两元素复合体,即ivec2。该实施方式可以使用_x1来指示标量(即,将标量视为具有一个元素的复合体)。 通过在指令中显式编码复合类型,该示例
可以直接写成: vcmp_eq_x1 $n,$m,$vz,$v0 vaddm_w_x4 $n,$vz,$vx,$vy vsubm_w_x1 $n,$vc,$va,$vb 由此,不需要将长度乘以4(即$n4),也不需要添加指令来扩展掩码寄存器。 在某些情况下,在指令集架构中定义的向量的长度可能不足以容纳所有数据元素。例如,在GPU/GPGPU的上下文中,当可用项的数量超过向量长度时,可以将数据项分解为分离的组;每个组负责处理所有项的一个子集。可以选择组长度(即,由该组处理的项的数量)以匹配向量长度,以便最有效地利用可用硬件。 在使用具有编码的复合类型的向量对标量和复合类型值的混合进行操作的循环内核的情况下,有两个选项来选择组长度。可以选择组长度以使复合类型数据项适合向量长度。或者,可以选择组长度以使标量数据项适合向量长度。例如,假设向量长度为64,并且要操作的复合类型为ivec4类型。因此,每个复合值可以占据四个向量位置,并且标量值是整数(int类型)。如果根据复合值的数量选择组长度,则组长度为64/4=16。对于包含整数标量值的向量,仅使用该向量的16个元素,而浪费其他48个位置。但是,如果根据标量值的数量选择组长度,则包含复合类型数据项的向量可能不适合单个向量寄存器或操作。可以通过在不同的寄存器之间拆分复合数据值并使用N个操作进行计算来解决此问题,其中N是复合数据类型中数据项的数量。对于ivec4复合数据类型,以下是拆分示例: n=64 n_4=16 vaddm_w_x4 $n_4,$vz[0:15],$vx[0:15],$vy[0:15] vaddm_w_x4 $n_4,$vz[16:31],$vx[16:31],$vy[16:31] vaddm_w_x4 $n_4,$vz[32:47],$vx[32:47],$vy[32:47] vaddm_w_x4 $n_4,$vz[48:63],$vx[48:63],$vy[48:63] vsubm_w_x1 $n,$vc,$va,$vb 尽管这部分地解决了问题,但是执行掩码没有被适当地设置。例如,第二个vaddm_w_x4应该使用掩码的第16到31位。有两种方法解决此问题。 在一种实施方式中,可以通过对指令中的有效掩码位的位置进行编码来重新定位掩码的有效位。这可以是直接编码(即,指定指令将从M位开始),也可以是位置变化(即,指定指令将以M修改先前的开始)。另一个实施方式可以包括通过指定新值或通过指定变化值来重新定位有效掩码位的单独指令。可以通过选择位范围来设置新的掩码。为此,指令集体系架构的实施方式可以包括指令vselm$na,$ma,$mb,$nb。该指令的语义是 for(i=0;i<$na;i++) $ma[i]=$mb[i+$nb] 本公开的示例1为处理器,该处理器包括:包括长度寄存器的寄存器文件、包括多个向量寄存器的向量寄存器文件、包括多个掩码寄存器的掩码寄存器文件、以及通信地耦合到寄存器文件、向量文件和掩码寄存器文件的向量指令执行电路,以执行第一掩蔽向量指令,所述第一掩蔽向量指令包括表示长度寄存器的第一长度寄存器标识符、表示向量寄存器文件的第一向量寄存器的第一向量寄存器标识符、以及表示掩码寄存器文件的第一掩码寄存器的第一掩码寄存器标识符,其中长度寄存器将存储表示要应用于存储在第一向量寄存器中的数据元素上的操作的数量的长度值,第一掩码寄存器将存储多个掩码位,并且,多个掩码位中的第一掩码位确定相应的操作中的第一个是否产生效果。 示例2为处理器,该处理器包括:包括长度寄存器的寄存器文件、包括多个掩码寄存器的掩码寄存器文件、以及向量指令执行电路,该向量指令执行电路通信地耦合到寄存器文件和掩码寄存器文件,以执行掩蔽向量指令,该掩蔽向量指令包括表示长度寄存器的第一长度寄存器标识符、表示第一掩码寄存器的第一掩码寄存器标识符、和表示第二掩码寄存器的第二掩码寄存器标识符,其中长度寄存器将存储表示应用于第二掩码寄存器中的多个掩码位的操作的数量的长度值,以及其中向量指令执行电路将该数量的操作的结果存储在第一掩码向量寄存器中。 示例3为处理器,该处理器包括:包括多个掩码寄存器的掩码寄存器文件、以及向量指令执行电路,其通信地耦合到掩码寄存器文件,以执行掩蔽向量指令,所述掩蔽向量指令包括表示掩码寄存器文件的至少一个源掩码寄存器的至少一个源掩码寄存器标识符、表示掩码寄存器文件的至少两个目的掩码寄存器的至少两个目的掩码寄存器标识符、以及对运算符的引用,其中向量指令执行电路执行掩蔽向量指令,以对在至少一个源掩码寄存器中存储的至少一个源掩码应用该运算符以生成结果掩码,并将该结果掩码存储在至少两个目的掩码寄存器中的每一个中。 示例4为处理器,该处理器包括:包括多个掩码寄存器的掩码寄存器文件、以及向量指令执行电路,其通信地耦合至掩码寄存器文件,以执行掩蔽向量指令,所述掩蔽向量指令包括表示掩码寄存器文件的至少一个源掩码寄存器的至少一个源掩码寄存器标识符、表示掩码寄存器文件的目的地掩码寄存器的目的地掩码寄存器标识符,以及对运算符的引用,其中所述向量指令执行电路执行所述掩蔽向量指令,以对在至少一个源掩码寄存器中存储的至少一个源掩码应用该运算符以生成结果掩码,并将该结果掩码存储在目的掩码寄存器和掩码寄存器文件的预留掩码寄存器中,其中,预留掩码寄存器是在该掩蔽向量指令中未明确引用该预留掩码寄存器的情况下被调用的。 上面的描述旨在进行说明,而非进行限制。尽管已经参考特定的说明性示例和实施方式描述了本公开,但是将认识到,本公开不限于所描述的示例和实施方式。本公开的范围应参考所附权利要求书以及权利要求书所赋予的等效物的全部范围来确定。
- 实现掩蔽向量指令的系统和方法
- 基于向量指令的大整数乘法实现方法及装置