CN100498687C - 具有包括数据部分和相关计数器的条目的硬件堆栈 - Google Patents

具有包括数据部分和相关计数器的条目的硬件堆栈 Download PDF

Info

Publication number
CN100498687C
CN100498687C CNB2005101215637A CN200510121563A CN100498687C CN 100498687 C CN100498687 C CN 100498687C CN B2005101215637 A CNB2005101215637 A CN B2005101215637A CN 200510121563 A CN200510121563 A CN 200510121563A CN 100498687 C CN100498687 C CN 100498687C
Authority
CN
China
Prior art keywords
value
stack
data
counter
new value
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.)
Expired - Fee Related
Application number
CNB2005101215637A
Other languages
English (en)
Other versions
CN1804789A (zh
Inventor
M·德怀尔
H·蒋
T·皮亚扎
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.)
Intel Corp
Original Assignee
Intel Corp
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 Intel Corp filed Critical Intel Corp
Publication of CN1804789A publication Critical patent/CN1804789A/zh
Application granted granted Critical
Publication of CN100498687C publication Critical patent/CN100498687C/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/76Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data
    • G06F7/78Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor
    • G06F7/785Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor having a sequence of storage locations each being individually accessible for both enqueue and dequeue operations, e.g. using a RAM

Landscapes

  • Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Mathematical Physics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Communication Control (AREA)

Abstract

根据一些实施例,确定要推入具有n个条目的硬件堆栈的新值。该堆栈中的每个条目可以包括数据部分和相关联的计数器。如果所述新值等于与当前栈顶指针相关联的条目的数据部分,则使与该条目相关联的计数器递增。如果所述新值不等于与当前栈顶指针相关联的该条目的数据部分,则将所述新值存储在下一个条目的数据部分,并使当前栈顶指针递增。

Description

具有包括数据部分和相关计数器的条目的硬件堆栈
技术领域
本发明涉及一种硬件堆栈。
背景技术
信息可以被添加到被称为“堆栈”的存储区或数据缓冲器中或从中取出。在后进先出(LIFO)堆栈的情况中,值都是基于每个值添加(推入)到该堆栈中时的顺序来取出(弹出)的,最近推入的值是将要弹出的下一个值。这种类型的堆栈可以被认为是值的列表,其中较新的值将较旧的值向下推,并且值是从列表的顶部弹出的。
这种堆栈可以通过将每个值存储在随机存取存储器(RAM)单元和/或硬件寄存器中来实现。但是,当大量值需要存储到堆栈中时,所需RAM数量和/或硬件寄存器的数量可能是不实际的。
发明内容
本发明公开了一种将数据推入硬件堆栈和从硬件堆栈弹出数据的方法,包括:
确定要推入硬件堆栈的新值,所述硬件堆栈具有与当前栈顶指针相关联的第一条目,所述第一条目包括数据部分和相关联的计数器;
如果所述新值等于所述第一条目的数据部分,则使该第一条目相关联的计数器递增,以等于该新值已被重复的次数,其中所述当前栈顶指针是不递增的;
如果所述新值不等于与所述第一条目相关联的数据部分,则将所述新值存储在下一个条目的数据部分中,并使当前栈顶指针递增,其中所述新值是从一组n个可能的值中选出的,该数据部分为n位宽;以及
确定要推入该硬件堆栈的所述新值等于已经推入该硬件堆栈的先前值,如果所述新值等于除了存储在与所述当前栈顶指针相关联的数据部分值以外的、已推入该硬件堆栈的先前值,则该新值不能被推入该硬件堆栈。
本发明还公开了一种装置,其包括:具有n个数据寄存器的后进先出硬件堆栈,n是大于1的整数;n个计数器寄存器,每个计数器寄存器与所述数据寄存器之一相关联;以及栈顶指针寄存器。
本发明进而公开了一种产品,它包括存储了指令的存储介质,所述指令在由机器执行时执行下列步骤:确定要推入硬件堆栈的新值,所述硬件堆栈具有n个条目,n是大于1的整数,每个条目包括数据部分和相关联的计数器;如果所述新值和与栈顶指针相关联的条目的数据部分相同,则使与该条目相关联的计数器加1;以及如果所述新值不等于与栈顶指针相关联的所述数据部分,则将该值存储在下一个条目的数据部分中,并且使当前栈顶指针的计数器加1。
本发明另外还公开了一种系统,它包括:n通道的单指令多数据执行引擎,n是大于1的整数;后进先出硬件堆栈;以及图形存储单元,其中所述硬件堆栈又包括:n个数据寄存器;n个计数器寄存器,每个计数器寄存器与所述数据寄存器之一相关联;以及栈顶指针寄存器。
附图说明
图1是硬件堆栈的方框图。
图2是根据一些实施例的硬件堆栈的方框图。
图3是根据一些实施例将数据推入硬件堆栈的方法的流程图。
图4至6说明根据一些实施例数据正被推入硬件堆栈。
图7是根据一些实施例从硬件堆栈中弹出数据的方法的流程图。
图8至10说明根据一些实施例数据正从硬件堆栈中弹出。
图11是根据一些实施例的硬件堆栈的方框图。
图12是根据一些实施例将数据推入硬件堆栈的方法的流程图。
图13至14说明根据一些实施例数据正被推入硬件堆栈。
图15和16示出了处理系统。
图17至19示出了根据一些实施例正在执行嵌套的循环指令的SIMD执行引擎。
图20至24示出了根据一些实施例正在执行嵌套的条件指令的SIMD执行引擎。
图25是根据一些实施例的系统的方框图。
具体实施方式
图1是硬件堆栈100的方框图。具体地说,堆栈100包括可以支持e条数据条目的数据存储区域110(例如,一次可以将多至e个单独的值存储在堆栈100中)。堆栈100还包括栈顶指针(TOS)150,其指示存储最近被推入该堆栈的值的条目。
在图1所示堆栈100中,TOS指针150指示存储在条目2中的值“1110”是最近添加的。如果数据要从堆栈100中弹出,则会输出值“1110”并且会使TOS指针递减到1。如果要将新值添加到图1所示堆栈100中,该新值会存储在条目3中并且会使TOS指针150递增到3。
数据存储区域110可以例如通过使用一RAM单元和/或硬件寄存器来实现。当许多值需要存储到堆栈100中时,所需RAM数量和/或硬件寄存器数量可能是不实际的。
图2是根据一些实施例的硬件堆栈200的方框图。在本情况中,堆栈200是具有n个条目(n是大于1的整数)的LIFO缓冲器。堆栈200中的每个条目包括数据部分210和相关联的计数器220。计数器220指示数据部分210的值重复地推入所述堆栈的次数。堆栈200还包括TOS指针250。数据部分210、计数器220和/或TOS指针250中的任何一个都可以实现,例如可以用RAM单元或硬件寄存器来实现。现在将参照图3至10来描述根据一些实施例的堆栈200的操作。
图3是根据一些实施例将数据推入硬件堆栈的方法的流程图。例如,图3的方法可以结合图2所示的堆栈200使用。这里所述的流程图不一定暗示固定的操作顺序,实施例可以按照任何可行的顺序来进行。注意,本文所述的任何方法都可以通过硬件、软件(包括微码)、固件或这些方法的任意组合来执行。例如,存储介质可以在其中存储指令,所述指令在由机器执行时会导致根据本文所述实施例中的任何一个的执行。
在302中,确定要推入堆栈200的新值。如果该新值等于当前存储在TOS指针250所引用的条目的数据部分210中的值,则在306中使与该条目相关联的计数器220递增。
如果正被推入堆栈200的新值不等于当前存储在由TOS指针250引用的条目的数据部分210中的值,则在308中将该新值存储在所述堆栈的下一个条目中。而且,在310使TOS指针250递增。
还可以在312使与下一个条目相关联的计数器220(这里假设所有计数器220在初始化过程中都被设为0)递增。作为另外一种方法,计数器220也可以在312简单地设为1。此方法包括在本文所述的一些实施例中仅仅是为了说明清楚。通过在该点使计数器220递增(或使其设为1),存储在计数器220中的数字将等于数据部分210中的相关值被重复的次数。如果未执行312的步骤(并且仍然假设所有计数器在初始化过程中都被设为0),则存储在计数器220中的数字将等于数据部分210中的相关值被重复的次数减1。
当计数器220表示相关值被重复的次数时,堆栈200具有等于0的第一计数器表示堆栈200为空。当计数器220表示相关值被重复的次数减1的时候,可能会通过例如“堆栈空”寄存器位来发信号通知堆栈空。根据另一个实施例,可以将“-1”存储在第一计数器220中以指示该堆栈为空。
现在参照图4,它说明堆栈200具有在前两个条目中的值。具体地说,“1110”连续三次被推入堆栈200(如条目0的计数器220所示),然后“1010”被推入堆栈200中一次。应该注意,虽然对堆栈200进行了四次入栈操作(例如,“1110”三次和“1010”一次),也只使用了两个条目。此外,要将一个新值(“1010”)推入堆栈200。由于此新值等于当前存储在位于上述堆栈顶部的条目(条目1)中的值,因此与该条目相关联的计数器220如图5所示从1递增至2。在此情况下,所述新值是被推入堆栈200的最后一个值的“重复”。
在图5中,要将另一个新值(“0010”)推入堆栈200。由于此新值不等于当前存储在位于该堆栈栈顶的条目(条目1)中的值,因此将该值存储在下一条目(条目2)中,与该下一个条目相关联的计数器220从0递增至1,并且TOS指针250如图6所示从1递增到2。
图7是根据一些实施例使数据从硬件堆栈200中弹出的方法的流程图。在702中,取出由TOS指针250引用的存储在数据部分210中的值。随后在704中使与该条目相关联的计数器220递减。如果在706中该计数器220不等于0,则在708中保持TOS指针250的当前值。如果该计数器220不等于0,则使TOS指针250递减。例如,当存储在计数器220中的数字等于数据部分210中的相关值被重复的次数时,该方法可能是适当的。当存储在计数器220中的数字等于该相关值被重复的次数减1的时候,TOS指针250会在计数器220递减造成下溢时递减。
现在参照例如图8,它显示堆栈200当前在前三个条目中存储值。具体地说,“1111”被连续两次推入堆栈200中(如条目0的计数器220所示),“1010”被连续两次推入堆栈200,并且“0010”随后被推入堆栈200一次。此外,有值要从堆栈200中弹出。
为了完成弹出操作,将存储在由TOS指针250引用的条目的数据部分210中的值输出(“0010”)。此外,使与该条目相关联的计数器220从1递减到0。由于计数器220现在为0,因此如图9所示使TOS指针250从2递减到1。在本情况中,与该弹出操作相关联的条目已被“清空”。
在图9中,要进行另一次弹出操作。为此,将存储在由TOS指针250引用的条目的数据部分210中的值输出(“1010”)。此外,使与该条目相关联的计数器220从2递减到1。因为计数器220不为0,TOS指针250如图10所示未改变。在本情况中,与该弹出操作相关联的条目仍然未空。
例如,这种堆栈200可能在预计正存储在该堆栈中的值会被不断重复的时候有用。例如,设想这样一种实现,其中需要堆栈来存储一千个值,其中90%的值是最后存储的值的重复(第一千个值之后的任何值或“溢出”都可以存储在另一结构之中)。传统方法可能需要一千个硬件寄存器,而本文所述的一些实施例可以只使用两百个计数器即可实现(一百个用于数据部分而另一百个用作计数器)。
例如,这种堆栈200还可能在存储在堆栈200中的可能值的集合受限制时有用。例如,设想图11是根据一些实施例的硬件堆栈1100的方框图。在此情况中,堆栈1100具有n个条目(n是大于1的整数)。堆栈1100中的每个条目都包括n′位宽的数据部分1110(注意n′可以等于n或者可以为不同的值)和相关联的m位宽的计数器1120,该计数器1120代表数据部分1110的值连续被推入该堆栈的次数。堆栈1100还包括TOS指针1150。
此外,假设已知(i)可以推入堆栈1100的可能值的集合限制为n,并且(ii)正被推入堆栈1100的新值不能等于除最后存储的值之外的先前推入堆栈1100的先前值。例如,如果可能要推入堆栈1100的值的集合是{0000,0001,0010,0100,1000},则在如下序列:0100,1000,1000,1000,0010之后只允许将0000或0010推入堆栈1100(例如,因为0100和1000已经存储在该堆栈中)。注意,0010是被允许的,因为它等于最后被推入堆栈1100的值,在这种情形下,TOS指针1150决不会达到一个比n-1更大的值。也就是说,堆栈1100不会用光可以存储新值的条目。
注意,每个计数器1120被限制为存储m位的值。例如,一个4位的计数器仅能记录某个相关联的数据部分1110被重复了八次(如果执行与图3所示步骤312则为七次)。
图12是根据一些实施例将数据推入这种硬件堆栈的方法的流程图。在1202,确定要推入堆栈1100的新值。如果该新值不等于当前存储在由TOS指针1150引用的条目的数据部分110中的值,则在1206中将该新值存储在该堆栈的下一个条目中。而且在1208使TOS指针1150递增。注意,在本情况中,不执行对应于图3步骤312的操作。因此,存储在计数器1120中的数字将等于一个小于相关值被重复的次数的数字。
如果该新值确实等于当前存储在由TOS指针1150引用的条目的数据部分1110中的值,则在1212中判断与该条目相关联的计数器1120是否处于最大值(例如,在四位计数器的情况下判断是否为“1111”)。如果不是,则在1214简单地使计数器1120递增。如果计数器1120处于最大值,则执行参照步骤1206和1208所述的操作。
例如,设想图13是一个包括十个条目的堆栈1300,每个条目包括10位的数据部分1310和4位的计数器1320。堆栈1300还包括TOS指针1350。在本情况中,值“11100001111”连续四次被推入堆栈1300,接着,值“1010000111”连续八次被推入该堆栈。此外,要将另一个“1010000111”推入堆栈1300。
由于TOS的计数器1320的值为最大值,因此会在下一条目中重复“1010000111”并且使TOS指针1350如图14所示递增。也就是说,该新值被视为仿佛与最后被推入堆栈1300的值不同。这样,堆栈1300可以处理的重复序列超过计数器1320的大小以其它方式可以支持的重复序列。但是应该注意,由于单个值使用了两个(或更多个)条目,即使(i)可以推入堆栈1300的可能值的集合被限制为n,以及(ii)新值永不等于除了最后推入的值之外的先前推入堆栈1300的先前值,堆栈1300也有可能用光条目。
下面通过示例说明本文所述硬件堆栈可能有用的一些环境。注意,实施例可以结合任何其它类型的环境使用。
本文所述的一些实施例与“处理系统”相关联。如这里所用,短语“处理系统”可以是处理数据的任何设备。例如,处理系统可以与处理图形数据和/或其它类型的媒体信息的图形引擎相关联。处理系统的其它示例包括中央处理单元(CPU)和数字信号处理器(DSP)。
为了提高处理系统的性能,指令可以在单个指令周期内针对多个数据操作数同时执行。这种指令可以称为单指令多数据(SIMD)指令。例如,八通道的SIMD执行引擎可以同时执行针对8个32位数据操作数的指令,每个操作数都被映射到该SIMD执行引擎的唯一计算通道(例如,以便加速对三维几何图形的变换和/或再现)。
图15示出了包括SIMD执行引擎1510的一种类型的处理系统1500。在此情况中,执行引擎1510(从例如指令存储单元)接收一条指令连同四分量数据向量(例如,向量分量X、Y、Z和W,具有若干位的每个分量由SIMD执行引擎1510的对应通道0至3处理)。引擎1510随后可同时对该向量中的所有分量执行该指令。这种方法被称为“水平”,“通道并行”或者“结构阵列”实现。即使这里所述的一些实施例与四通道SIMD执行引擎1510相关联,注意,SIMD执行引擎可以具有大于1的任何数量的通道(例如,实施例可以与三十二通道执行引擎相关联)。
图16示出了包括SIMD执行引擎1610的另一种类型的处理系统1600。在此情况中,执行引擎1610接收一条指令连同数据的4个操作数,其中每个操作数与一不同的矢量向量相关联(例如,从向量0到3的4个X分量)。引擎1610随后可以在单个指令周期内对所有操作数同时执行该指令。这种方法称为“垂直”、“通道串行”或“阵列结构”实现。
根据一些实施例,SIMD指令可以是指示一组相关指令应该一直执行到例如某个具体次数或特定条件得到满足的“循环”指令。例如,考虑如下指令:
DO{
      sequence of instructions
}WHILE<condition>
这里,只要“条件为真(condition is true)”就会执行该指令序列。然而,当这种指令以SIMD模式被执行时,不同的通道可以产生不同的<condition>测试结果。例如,该条件可以被定义成只要Varl不为0就应该执行该指令序列(并且该指令序列可以适当地操作Varl)。在本情况中,varl可以对一个通道为0而对其它通道为非0。
图17示出了一个根据一些实施例的四通道SIMD执行引擎1700。引擎1700包括四位的循环掩码寄存器1730,其中每一位都与相应的计算通道相关联。例如,循环掩码寄存器1730可以包括在引擎1700中的硬件寄存器。引擎1700还可以包括四位宽的循环堆栈1710。根据本文所述的任何实施例,该循环堆栈1710的深度为四个条目并且每个条目包括相关联的循环堆栈计数器1720。该循环堆栈1710还包括循环堆栈计数器寄存器1740和循环栈顶指针1750。
例如,循环堆栈1710可以包括硬件寄存器系列、存储单元和/或硬件寄存器和存储单元的组合。虽然图17中示出的引擎1700、循环掩码寄存器1730和循环堆栈1710都是四通道宽的,但要注意,实现可以是其它数量的通道宽(例如,x通道宽的),并且每个计算通道能够处理一个y位的操作数。根据一些实施例,在计算通道、掩码通道以及循环堆栈通道之间存在1:1的对应。
引擎1700可以接收并同时执行针对(例如,与四个计算通道相关联的)四个不同数据通道的指令。注意,在一些情况下,可能需要比四个少的通道(例如,当有少于四个有效操作数的时候)。因此,可以用初始化向量来初始化循环掩码寄存器1730,所述初始化向量指示哪些通道具有有效操作数,哪些没有(例如,操作数i0到i17,为“1”表示相关联的通道已被启用)。循环掩码向量1730随后可用于避免非必要的处理(例如,可以只对在循环掩码寄存器1730中设为“1”的那些操作数执行指令)。根据另一个实施例,循环掩码寄存器1730简单地初始化为全“1”(例如,假设总是启用所有通道)。在一些情况下,循环掩码寄存器1730中的信息可以与其它寄存器中的信息相结合(例如,通过布尔“与”操作(Boolean AND operation))并且其结果可以存储在整个执行掩码寄存器中(其随后可用于避免不必要的或者不适当的处理)。
图18至20示出了根据一些实施例,在执行嵌套的DO指令的引擎1700。当引擎1700接收到一个循环指令(例如,一个DO指令)时,如图18所示,将循环掩码寄存器1730中的数据复制到循环堆栈1710的顶部,使与该条目相关联的循环堆栈计数器1720的值递增,并且更新TOS指针1750。此外,将循环信息存储在循环掩码寄存器1730中。该循环信息可最初可指示例如在第一次遇到该DO指令时四个通道中的哪一个是活动的(例如,操作数d0到d3,为“1”表示相关联的通道是活动的)。
随后根据循环掩码寄存器1730,对每个通道执行与该DO循环相关联的指令集。例如,如果循环掩码寄存器1730为“1110”,则会对与三个最高有效位操作数而非最低有效位操作数相关联的数据执行上述循环中的指令(例如,因为该通道当前没有被启用)。
当遇到与该DO指令相关联的WHILE语句时,针对活动通道评估条件,并且将结果存回循环掩码寄存器1730中(例如通过布尔“与”操作)。例如,如果在遇到该WHILE语句之前循环掩码寄存器1730为“1110”,则可以针对与三个最高有效位操作数相关联的数据评估条件。然后将该结果存储在循环掩码寄存器1730中。如果循环掩码寄存器1730中的至少一位仍然是“1”,则再次对所有循环掩码寄存器值为“1”的通道执行该循环指令集。例如,如果与该WHILE语句相关联的条件导致“110x”的结果(其中x没有被评估,因为该通道未波启用),则可以将“1100”存储在循环掩码寄存器1730中。当随后再次执行与该循环相关联的指令时,引擎1700将只对与两个最高有效位操作数相关联的数据这样做。在本情况中,可以避免循环的不必要和/或不适当的处理。应该注意,如果更新仅限于活动通道,则不需要布尔“与”操作。
SIMD引擎能够处理嵌套的循环指令(例如,当第二循环块被“嵌套”在第一循环块之内的时候)。例如,考虑如下指令集合:
DO{
    first subset of instructions
    DO{
         second subset of instructions
    }WHILE<second condition>
    third subset of instructions
}WHILE<first condition>
在本情况中,当第一个条件为真时,应该对适当的通道执行第一和第三个指令子集,而仅在第一和第二个条件均为真时才应该执行第二个指令子集。
图19示出了根据一些实施例的另一个嵌套循环指令(例如,第二DO语句)的执行。在此情况中,当前在循环掩码寄存器1730中的信息(d10到d13)被推入堆栈1710的“顶部”。结果,之前在堆栈1710顶部的信息(例如,初始化向量i0到i3)现在被下推一个条目。引擎1700还将第二循环信息存储到循环掩码寄存器1730中(d20到d23)。
注意,在将信息推入堆栈1710时,可以根据本文所述的任一实施例更新循环堆栈计数器1720和TOS指针1750。在图19所示示例中,d10到d13的值不等于i0到i3,因此使用了第二条目(并且TOS指针1750反映第二条目为栈顶)。此外,还应该注意,由于遇到了嵌套的循环,正推入堆栈1710的连续的值的位可以保持相同或者从“1”变为“0”,但是不能从“0”变为“1”。因此(i)可以推入堆栈1710的可能值的集合被限制到4,并且(ii)新值将不会等于除了最后推入的值之外的先前推入堆栈1710的先前值。因此,TOS指针1750决不需要指向第五个条目。也就是说,堆栈1710不会用光可以存储新值的条目(即便计数器1720之一可能溢出)。
还应注意,在遇到循环时可能产生大量的重复的值。因此,实施例可以支持许多数量的值的存储而无需使用不切实际数量的硬件寄存器或RAM。
与第二循环指令相关联的循环块随后可以如循环掩码寄存器1730中的信息所指示的那样被执行(例如,每次执行该第二块时循环掩码寄存器1730可以根据与第二循环的WHILE指令相关联的条件加以更新)。当第二循环的WHILE指令最终导致循环掩码寄存器1730中的每一位为“0”时,如图20所示,位于循环堆栈1710顶部的数据(例如,d10到d13)可以移回到循环掩码寄存器1730中,并且计数器1720和TOS指针1750可以在适当时更新。随后,可以根据循环掩码寄存器1730执行其它指令。当第一循环块完成时(图20中未示出),初始化向量将被传回循环掩码寄存器1730中,并且可以对与已启用的通道相关联的数据执行其它指令。
根据一些实施例,SIMD引擎可以执行“条件”指令。例如,考虑如下指令集:
IF<condition>
     first set of instructions
ELSE
      second set of instructions
END IF
这里,当“condition(条件)”为真时将执行第一指令集,而当“condition”为“假”时将执行第二指令集。然而,当对多个数据通道同时执行这种指令时,不同的通道可以产生不同的结果。也就是说,在需要对其它通道执行第二指令集的同时需要对一些通道执行第一指令集。
图21示出了根据一些实施例的四通道的SIMD执行引擎2100。该引擎2100包括四位的条件掩码寄存器2130,其中每一位都与相应的计算通道相关联。例如,条件掩码寄存器2130可以包括在引擎2100中的硬件寄存器。该引擎2100还可以包括四位宽四条目深的条件堆栈2110、条件堆栈计数器寄存器2120以及TOS指针2150。例如,条件堆栈2110可以包括硬件寄存器系列、存储单元和/或硬件寄存器和存储单元的组合(例如,在十个条目深的堆栈的情况中,堆栈2110中的前四个条目可以是硬件寄存器,而其余六条存储在存储器中)。虽然图21中所示的引擎2100、条件掩码寄存器2130和条件堆栈2110与四个通道相关联,但是要注意,实现可以与其它数量的通道相关(例如,x通道的执行引擎),并且每个计算通道都能够处理y位的操作数。
像前面一样,条件掩码向量2130可以用初始化向量进行初始化,其中所述初始化向量指示哪些通道具有有效的操作数,哪些通道没有(例如,操作数i0到i3,为“1”表示相关通道当前被启用)。条件掩码向量2130随后可用于避免不必要的处理(例如,可以只针对条件掩码寄存器2130中设为“1”的那些操作数执行指令)。
如图22所示,当引擎2100收到条件指令时(例如,收到一条“IF”语句),将条件掩码寄存器2130中的数据复制到条件堆栈2110的顶部。条件堆栈计数器寄存器2120和条件堆栈栈顶指针2150也可以如本文所述那样予以更新(例如第一条目的计数器2120可以设为1)。此外,根据条件掩码寄存器中的信息针对四个操作数中的每一个执行指令。结果随后存储在条件掩码寄存器2130中,并且可用于避免针对与该IF语句相关联的语句的不必要的和/或不适当的处理。例如,如果与该IF语句相关联的条件导致结果“110x”(其中x没有被评估,因为相应通道未被启用),则可以将“1100”存储在条件掩码寄存器2130中。当随后执行与该IF语句相关联的其它指令时,引擎2100也将仅对与两个MSB(最高有效位)相关联的数据(而非与两个LSB(最低有效位)相关联的数据)这样做。
根据一些实施例,一条条件指令可以嵌套在与另一条条件指令相关联的指令集里。例如,考虑如下指令集:
IF<first condition>
     first set of instructions
     IF<second condition>
        second set of instructions
     END IF
     third set of instructions
END IF
在本情况中,当“first condition(第一条件)”为真时应该执行第一和第三指令集,而当“first condition”和“second condition(第二条件)”均为真时仅执行第二指令集。
图23示出了根据一些实施例,另一个嵌套的条件指令(例如第二IF语句)的执行。在此情况中,当前在条件掩码寄存器2130中的信息被推入堆栈2110顶部。结果,先前在堆栈2110顶部的信息(例如,初始化向量)被下推一个条目。但是要注意,在图23所示的示例中,r12到r13的值正好等于i0到i3的值,因此第一堆栈条目被重新使用并且相关联的计数器2120被从1递增到2(并且TOS指针1750反映第一条目仍然是栈顶)。
接着,同时根据如下二项评估多个数据通道:(i)当前在条件掩码寄存器2130中的信息(例如,r10到r13)和与第二条件指令(例如,“condition2”)相关联的条件。此评估结果随后存储到该条件掩码寄存器中(例如,r20到r23),并可由引擎2100用于按照条件掩码寄存器2130中的信息所示,对多个数据操作数执行与第二条件指令相关联的其它指令。
在将信息推入堆栈2110时,可以根据本文所述的任一实施例来更新条件堆栈计数器2120和TOS指针2150。而且应该注意,在遇到嵌套的条件指令时,被推入堆栈2110的连续值中的位可以保持不变或者从“1””变为“0”,但是不能从“0”变为“1”。因此(i)可以推入堆栈2110的可能值的集合被限制到4,并且(ii)新值将不会等于除了最后推入的值之外的、先前推入堆栈2110的先前值。因此,TOS指针2150决不会需要指向第五条目。也就是说,堆栈2110决不会用光可以存储新值的条目(虽然计数器2120可能溢出)。
如图24所示,当引擎2100收到一条指示,指示已到达与第二条件指令相关联的结束指令(如“ENDIF”语句)时,可以将条件堆栈2110栈顶的数据(例如r10到r13)移回条件掩码寄存器2130中。接着,可以根据条件掩码寄存器2110执行其它指令。如果遇到了另一条ENDIF语句(图24未示出),则将初始化向量传回到条件掩码寄存器2130中,并且可以对与启用的通道相关联的数据执行其它指令。
图25是根据一些实施例的系统2500的方框图。例如,系统2500可以与适于记录和/或显示数字电视信号的媒体处理器相关联。根据本文所述的任一实施例,系统2500包括图形引擎2510,其具有n操作数SIMD执行引擎2520。例如,根据本文所述的任一实施例,SIMD执行引擎2520可以具有n个数据寄存器、n个计数器寄存器(每个计数器寄存器与所述数据寄存器之一相关联)以及栈顶指针寄存器。该系统2500还可以包括用于存储SIMD指令的指令存储单元2530以及用于存储图形数据(例如与三维图像相关联的向量)的图形存储单元2540。指令存储单元2530和图形存储单元2540可以包括例如随机存取存储器(RAM)单元。
以下说明各种其它实施例。这些并不构成对所有可能实施例的限定,本领域技术人员将会理解许多其它的实施例也是可行的。此外,虽然为了清楚起见仅简要地对下列实施例进行了描述,但是本领域技术人员会明白,必要时如何对以上描述作任何改变,以便适应这些和其它实施例及应用。
而且,虽然描述了不同的实施例,但是要注意,可以实现各实施例的任意组合(例如,SIMD引擎可以同时支持循环和条件指令)。此外,虽然示例已使用“0”来表示通道未被启用,但是可以根据其它实施例,也可以代之以使用“1”来表示通道当前未被启用。类似地,可以理解,计数器和/或指针可以根据特定的实现方式进行递增或递减。
根据一些实施例,可以将多个值推入一个堆栈。例如,考虑如下算法:
  void push(int data,int count){
     if(data=TOS->data_bit_field){
        if(count+TOS->count<=MAX_COUNT){
           TOS->count+=count;
        }else{
              count=MAX_COUNT-TOS->count;
              TOS->count=MAX_COUNT;
              TOS++;
              TOS->data=data
              TOS->count=count;
        }
  }else{
      TOS++;
      TOS->data=data;
      TOS->count=count;
  }
}
在本情况中,将要推入的数据值与保持在由TOS指针指向的条目的数据部分的值进行比较。如果TOS数据和推入的数据按位完全相同,则使标识为TOS的条目中的计数值递增要推入数据拷贝的数量。如果两个数据值按位不同,则首先通过使TOS指针递增来选择一个新的TOS堆栈条目。然后将推入的数据存储在该新TOS条目中,并且将相关联的计数器设为正被推入的数据拷贝的数量。
类似地,可以采用一个操作从堆栈中弹出多个值:
  int pop(count){
          int retValue=TOS->data_bit_field;
          int residual=count;
          while(residual>0){
              if(residual>=TOS->count){
                      residual-=TOS->count;
                      TOS->count=0;
                      TOS-;
               }else{
                    TOS->count-=residual;
               }
          }
           return retValue;
}
在本情况中,调用者指定其想要在一个操作中执行的弹出次数。由TOS指针指向的条目的数据值被返回给该调用者。使TOS条目的相关计数字段递减调用者指定的弹出次数。在一些情况中,弹出计数可以超过保持在当前TOS计数字段中的值。在此情况中,该计数被应用到连续的堆栈条目上,直到耗尽为止。
本文所述的几个实施例仅用于说明目的。本领域技术人员会根据本说明书认识到,可以采用经过仅受权利要求限制的修改和改动的其它实施例来实施本发明。

Claims (14)

1.一种将数据推入硬件堆栈和从硬件堆栈弹出数据的方法,包括:
确定要推入硬件堆栈的新值,所述硬件堆栈具有与当前栈顶指针相关联的第一条目,所述第一条目包括数据部分和相关联的计数器;
如果所述新值等于所述第一条目的数据部分,则使该第一条目相关联的计数器递增,以等于该新值已被重复的次数,其中所述当前栈顶指针是不递增的;
如果所述新值不等于与所述第一条目相关联的数据部分,则将所述新值存储在下一个条目的数据部分中,并使当前栈顶指针递增,其中所述新值是从一组n个可能的值中选出的,该数据部分为n位宽;以及
确定要推入该硬件堆栈的所述新值等于已经推入该硬件堆栈的先前值,如果所述新值等于除了存储在与所述当前栈顶指针相关联的数据部分的值以外的、已推入该硬件堆栈的先前值,则该新值不能被推入该硬件堆栈。
2.如权利要求1所述的方法,其中,如果所述新值等于与当前栈顶指针相关联的数据部分,则使所述计数器加1。
3.如权利要求1所述的方法,其中,如果所述新值不等于与当前栈顶指针相关联的数据部分,则使当前栈顶指针加1。
4.如权利要求1所述的方法,其中,从具有n个可能值的集合中选择所述新值。
5.如权利要求4所述的方法,其中,所述数据部分是n位宽的。
6.如权利要求5所述的方法,其中,所述新值不能等于除存储在与当前栈顶指针相关联的数据部分中的值之外、先前推入所述硬件堆栈的先前值。
7.如权利要求6所述的方法,其中,在推入所述硬件堆栈的值中的位与最后被推入所述硬件堆栈的值相比,(i)从0变为1但是不能从1变为0;或者与最后被推入所述硬件堆栈的值相比,(ii)从1变为0但不是从0到1。
8.如权利要求1所述的方法,还包括:
确定要推入所述硬件堆栈的第二值;
确定该第二值等于与当前栈顶指针相关联的条目的数据部分;
确定与当前栈顶指针相关联的计数器等于最大值;以及
将所述第二值存储在下一个条目的数据部分中,使与下一个条目相关联的计数器递增或初始化,并且使当前栈顶指针递增。
9.如权利要求1所述的方法,还包括:
确定要从硬件堆栈中弹出的值;
取出存储在与当前栈顶指针相关联的数据部分中的值;以及
使与当前栈顶指针相关联的计数器递减。
10.如权利要求9所述的方法,还包括:
确定与当前栈顶指针相关联的计数器等于最小值;以及
使当前栈顶指针递减。
11.如权利要求1所述的方法,其中,所述硬件堆栈与n通道的单指令多数据执行引擎的循环堆栈相关联。
12.如权利要求11所述的方法,其中,所述新值与基于数据的多操作数的循环指令的评估相关联。
13.如权利要求1所述的方法,其中,所述硬件堆栈与n通道的单指令多数据执行引擎的条件堆栈相关联。
14.如权利要求13所述的方法,其中,所述新值与基于数据的多操作数的条件指令的评估相关联。
CNB2005101215637A 2004-12-15 2005-12-14 具有包括数据部分和相关计数器的条目的硬件堆栈 Expired - Fee Related CN100498687C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US11/012688 2004-12-15
US11/012,688 US7434028B2 (en) 2004-12-15 2004-12-15 Hardware stack having entries with a data portion and associated counter

Publications (2)

Publication Number Publication Date
CN1804789A CN1804789A (zh) 2006-07-19
CN100498687C true CN100498687C (zh) 2009-06-10

Family

ID=36390163

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2005101215637A Expired - Fee Related CN100498687C (zh) 2004-12-15 2005-12-14 具有包括数据部分和相关计数器的条目的硬件堆栈

Country Status (7)

Country Link
US (1) US7434028B2 (zh)
EP (1) EP1839126B1 (zh)
JP (1) JP4917045B2 (zh)
CN (1) CN100498687C (zh)
AT (1) ATE477532T1 (zh)
DE (1) DE602005022938D1 (zh)
WO (1) WO2006066188A2 (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8271959B2 (en) * 2008-04-27 2012-09-18 International Business Machines Corporation Detecting irregular performing code within computer programs
EP2328074A1 (en) * 2009-11-27 2011-06-01 STMicroelectronics S.r.l. Queue management
US8555259B2 (en) * 2009-12-04 2013-10-08 International Business Machines Corporation Verifying function performance based on predefined count ranges
GB2518912B (en) * 2014-01-17 2015-08-26 Imagination Tech Ltd Stack pointer value prediction
US20160179520A1 (en) * 2014-12-23 2016-06-23 Intel Corporation Method and apparatus for variably expanding between mask and vector registers

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4677546A (en) * 1984-08-17 1987-06-30 Signetics Guarded regions for controlling memory access

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2177526B (en) * 1985-06-24 1990-02-14 Pixar Selective operation of processing elements in a single instruction, multiple data stream (simd)computer system
GB2178573B (en) 1985-07-10 1989-01-05 Nat Res Dev A data stack for data processors
JPH02112025A (ja) * 1988-10-21 1990-04-24 Hitachi Ltd 情報処理装置
US4988998A (en) * 1989-09-05 1991-01-29 Storage Technology Corporation Data compression system for successively applying at least two data compression methods to an input data stream
JPH07295812A (ja) * 1994-04-27 1995-11-10 Mitsubishi Electric Corp 条件分岐制御方法および装置
US6028962A (en) * 1996-05-10 2000-02-22 Apple Computer, Inc. System and method for variable encoding based on image content
US5862376A (en) 1996-06-24 1999-01-19 Sun Microsystems, Inc. System and method for space and time efficient object locking
US5916305A (en) * 1996-11-05 1999-06-29 Shomiti Systems, Inc. Pattern recognition in data communications using predictive parsers
US6128654A (en) 1997-02-14 2000-10-03 Advanced Micro Devices, Inc. Method and apparatus for transmitting multiple copies by replicating data identifiers
US5903769A (en) * 1997-03-31 1999-05-11 Sun Microsystems, Inc. Conditional vector processing
US6079008A (en) 1998-04-03 2000-06-20 Patton Electronics Co. Multiple thread multiple data predictive coded parallel processing system and method
US6112288A (en) * 1998-05-19 2000-08-29 Paracel, Inc. Dynamic configurable system of parallel modules comprising chain of chips comprising parallel pipeline chain of processors with master controller feeding command and data

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4677546A (en) * 1984-08-17 1987-06-30 Signetics Guarded regions for controlling memory access

Also Published As

Publication number Publication date
ATE477532T1 (de) 2010-08-15
US7434028B2 (en) 2008-10-07
US20060155924A1 (en) 2006-07-13
DE602005022938D1 (de) 2010-09-23
WO2006066188A3 (en) 2006-10-05
JP2008524721A (ja) 2008-07-10
CN1804789A (zh) 2006-07-19
WO2006066188A2 (en) 2006-06-22
EP1839126B1 (en) 2010-08-11
JP4917045B2 (ja) 2012-04-18
EP1839126A2 (en) 2007-10-03

Similar Documents

Publication Publication Date Title
CN101048731B (zh) 用于单指令、多数据执行引擎的循环指令
CN100470465C (zh) 用于单指令、多数据执行引擎的条件指令
US8028015B2 (en) Method and system for large number multiplication
US5367687A (en) Method and apparatus for optimizing cost-based heuristic instruction scheduling
US5793661A (en) Method and apparatus for performing multiply and accumulate operations on packed data
JP3602542B2 (ja) スーパースカラマイクロプロセッサにおける分岐予測正確度向上のための装置および方法
CN100498687C (zh) 具有包括数据部分和相关计数器的条目的硬件堆栈
US20100306300A1 (en) Sparse Matrix Padding
US20180032342A1 (en) Loop vectorization methods and apparatus
JP3188467B2 (ja) 最小値・最大値検索装置
CN101297279A (zh) 改善的流水线数字信号处理器
EP2584460A1 (en) Vector processing system comprising a replicating subsystem and method
US7149767B2 (en) Method and system for determining quotient digits for decimal division in a superscaler processor
US6732133B2 (en) Montgomery multiplier with dual independent channels
US6374343B1 (en) Array indexing with sequential address generator for a multi-dimensional array having fixed address indices
JP2022074442A (ja) 演算装置および演算方法
US7281122B2 (en) Method and apparatus for nested control flow of instructions using context information and instructions having extra bits
EP1251425A2 (en) Very long instruction word information processing device and system
US8924654B1 (en) Multistreamed processor vector packing method and apparatus
Smidla et al. Stable vector operation implementations, using Intels SIMD architecture
CN116997887A (zh) 用于矩阵乘法运算的矩阵的近似的数据压缩器
CN118245110A (zh) 面向稀疏矩阵向量乘计算的软硬件协同设计方法和框架
JP2021174558A (ja) Int9量子化のためのシステム及び方法
EP1197874A1 (en) Signal processor and product-sum operating device for use therein with rounding function
JP3115428B2 (ja) パイプライン制御方法

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
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20090610

Termination date: 20171214