带进位的原子加法指令的制作方法

文档序号:11635144阅读:282来源:国知局
带进位的原子加法指令的制造方法与工艺

本公开涉及数据处理系统领域。



背景技术:

一些数据处理系统可以支持原子指令,该原子指令访问存储器中的数据值并且被执行时会使得执行该指令的结果与可以在指令的执行期间独占访问存储器中的数据值的指令相一致,例如,没有其他指令可以以重叠方式访问同一数据值来生成与在其执行期间已独占访问过该数据值的原子指令不一致的结果。原子指令用于尝试隔离对各个指令的执行,从而不存在不适当和/或不期望的与其他指令的执行的交互。



技术实现要素:

本公开的至少一些实施例提供了用于处理数据的装置,包括:处理电路,用于执行由程序指令指定的处理操作;以及指令解码器,用于解码带进位的原子加法指令以控制处理电路执行下述操作:以与在原子操作期间独占访问数据值相一致的方式,将对加数操作数值和存储在存储单元的数据值的加法作为原子操作来执行,从而生成存储在存储单元的结果值以及指示加法是否生成进位输出的进位值。

本公开的至少一些另外的实施例提供了用于处理数据的装置,包括:用于执行由程序指令指定的处理操作的处理装置;以及用于解码带进位的原子加法指令的指令解码装置,以控制处理装置以与在原子操作期间独占访问数据值相一致的方式,将对加数操作数值和存储在存储单元的数据值的加法作为原子操作来执行,从而生成存储在存储单元的结果值以及指示加法是否生成进位输出的进位值。

本公开的至少一些另外的实施例提供了一种处理数据的方法,包括:用处理电路执行由程序指令指定的处理操作;以及解码带进位的原子加法指令,以控制处理电路以与在原子操作期间独占访问数据值相一致的方式,将对加数操作数值和存储在存储单元的数据值的加法作为原子操作来执行,从而生成存储在存储单元的结果值以及指示加法是否生成进位输出的进位值。

附图说明

现在将仅通过示例的方式参考附图来描述示例实施例,其中:

图1示意性地示出了用于执行原子指令的数据处理系统;

图2示意性地示出了具有共享存储器的多处理器数据处理系统;

图3示意性地示出了两个线程的动作,每个线程执行对累加值的相应的不同有效位部分进行累加的带进位的原子加法指令序列;

图4示意性地示出了执行图3所示的带进位的原子加法指令的相对顺序;

图5a至5g示意性地示出了对生成本地和值的带进位的原子加法指令序列的执行,其中当数据值被返回到缓存存储器中时,该本地和值被累加到该数据值中。

图6是示意性地示出了在系统中对带进位的原子加法指令的使用的图,其中该系统包括作为合并树工作的用于累加到由根处理器保持的数据值的多个数据处理装置;以及

图7是示意性地示出在图6的合并树内的节点的操作的流程图。

具体实施方式

根据本公开的至少一些示例性实施例,提供了带进位的原子加法指令,其作为原子操作执行对加数操作数和存储在存储单元中的数据值的加法。从该带进位的原子加法指令生成进位值。从原子指令生成进位值是不常见的,因为这表示原子指令是通过该进位值与其他指令进行交互。这与原子指令是独立的这一正规哲学相悖。

存储单元可以具有各种不同的形式,例如,寄存器。存储单元可以是存储器映射的(例如,与存储器地址空间内的(一个或多个)存储器地址相关联)。在一些实施例中,存储单元可以是诸如sram、dram之类或类似的存储器。

尽管在各种不同情况下可用和有用,但在本公开的一些示例性实施例中可以使用带进位的原子加法指令,其中加数值和数据值具有共享范围的有效位,并且加数操作数值和数据值中的至少一个是全范围有效位大于并包括共享范围有效位的较大值的一部分。因此,可以通过将较大的数据值分解成分开操作的多个数据值来表示数据宽度大于在数据处理装置内本地支持和操纵的值。这些单个数据值和较大数据值的有效位可以是本身可编程的,并且由与所涉及的数据值相关联的元数据表示。在这样的布置中,通过带进位的原子加法指令生成的进位值允许支持原子指令行为,并允许通过进位值实现有效位宽度较大的数据值的不同部分之间的必要交互。在这样的布置中,可以以准许实现用于数据操纵的整体原子行为(其实际上被分离在多个带进位的原子加法指令上)的方式,来将由带进位的原子加法指令生成的进位值加到表示该较大数据值的下一最高有效部分的另外的带进位的原子加法指令的加数操作数。

可以以各种不同的方式提供进位值,例如显式返回操作数或通过进位输出标志。在一些实施例中,带进位的原子加法指令还可以具有进位输入操作数,该进位输入操作数在加数操作数被加到数据值之前被加到加数操作数。因此,在一些实施例中,原子指令可以具有进位输入值和进位输出值。

带进位的原子加法指令的一种形式的示例使用是在包括用于存储数据值的缓存存储器的装置内。如果数据值不存在于缓存存储器内,则带进位的原子加法指令的序列可以累加出该装置内的相应的加法操作数值的本地和值,随后在数据值在缓存存储器中可用时,将该本地和值加到数据值。因此,不需要延迟对带进位的原子加法指令中的至少一些的执行完成来等待数据值被获取到缓存存储器中。

在上述类型的系统的一些示例性实施例中,可以从在装置上执行的相应的程序线程形成带进位的原子加法指令的序列。在这样的系统内,将其加数操作数值累加到本地和值的给定的带进位的原子加法指令可以返回进位值,使得给定的带进位的原子加法指令可以被完成,并因此准许继续执行包括该给定的带进位的原子加法指令的给定程序线程内的另外的程序指令。

确保带进位的原子加法指令的序列的最终结果与执行该序列的预期外部看来的执行效果相匹配的一种方法是延迟返回该序列内的最后的带进位的原子加法指令的最终进位,直到数据值在缓存存储器内可用并且本地和值已被加到该数据值来生成最终进位值。

带进位的原子加法指令的另一示例使用是在如下所述的系统内:该系统合并多个这样的指令以生成本地和值,将输入值返回给除了输入指令之外的所有指令,生成随后由另外的处理装置执行的输出带进位的原子加法指令,其中从该另外的处理装置接收接收到的进位输出值并将其传回给针对尚未接收到其进位输出值的指令源。以这种方式,执行加法的工作量可以被分散并且将所生成的值较早地返回到指令源中的至少一些,从而准许这些指令源开始执行其他处理操作,而非等待根据别处执行的处理的延迟返回值。

在本公开的一些实施例中,接收到的进位输出值是由对给定的带进位的原子加法指令和一个或多个另外的带进位的原子加法指令进行合并的装置生成的针对输出带进位的原子加法指令的返回值。

给定输入和另外的输入带进位的原子加法指令可以形成序列的一部分,并且在这样的布置中,序列内最后的指令可以被保持并与接收到的从另外的处理装置返回的进位输出值相关联。

当装置是用于合并带进位的原子加法指令的合并树的一部分并由从跟处理装置分支的多个处理装置以及该根处理装置(存储原子加法要累加到的数据值)构成时,本公开的技术可以被有用地使用。

图1示意性地示出了包括寄存器文件4、算术/逻辑电路6、加载存储单元8、指令获取单元10、指令管线12、以及指令解码器14的数据处理装置2。在操作中,程序指令被指令提取单元10获取并被传送到指令管线12。当程序指令到达指令管线12内的解码阶段时,解码器14对这些程序指令进行解码以生成控制算术/逻辑电路6、加载/存储单元8、和寄存器文件4的控制信号,从而执行由程序指令指定的处理操作。这些处理操作可以包括由加载存储单元8对在诸如存储器之类的存储单元内的数据值执行的加载操作和存储操作。存储器可以是本地缓存存储器,或分层存储器系统内的较高级别。

加载存储单元8和算术/逻辑单元6用于提供带进位的原子加法指令,其以原子方式(例如,以与在执行期间执行可独占访问该数据值的指令相一致的方式)将加数操作数值加到存储在指定存储器地址处的数据值。应理解的是,在本公开的情境中,对加法指令的引用还包括作为加法指令的修改形式的减法指令(例如,加二的补码)。因此,对加法指令的引用还被考虑为包括减法指令以及与加法和减法操作相对应的带进位的原子加法指令。

图2示意性地示出了数据处理系统16,其包括图1形式的多个处理器(即,处理器18、20、22、24),其中每一者具有相应的本地缓存存储器26、28、30、32。本地缓存存储器26、28、30、32缓存来自共享存储器34的数据值。一致性控制电路36用于执行一致性控制操作,以便管理可以由共享存储器34和相应的本地缓存存储器26、28、30、32存储的不同版本的数据值之间的数据一致性。处理器18、20、22、24包括用于执行数据处理操作的处理电路(例如,在图1的情境中,包括寄存器文件4、算术/逻辑电路6和加载/存储单元8)以及用于解码程序指令的指令解码器14。这些程序指令包括作为原子操作执行对加数操作数值和存储在存储器(例如,本地缓存存储器26、28、30、32或共享存储器34中的一个)中的数据值的加法的带进位的原子加法指令,以生成存储在存储器中的结果值以及指示所执行的加法是否产生进位输出的进位值。该进位值可以作为带进位的原子加法指令的返回值而被返回(或者在一些实施例中可以作为进位标志值而被返回)。带进位的原子加法指令还可以具有要加到加法操作数值的进位输入,该结果随后被加到存储在存储器中的数据值。因此,带进位的原子加法指令可以具有进位输入和进位输出。

图3和图4示意性地示出了对来自要累加到值acc的程序执行的两个不同线程的带进位的原子加法指令的使用。这个累加值(acc)的全范围有效位大于可由带进位的原子加法指令的单个操作数容纳的有效位范围。因此,给定带进位的原子加法指令的加法操作数值和数据值具有相关联的共享范围有效位,其对应于与多个操作数相关联的较大范围有效位的一部分。作为示例,可以从三个64位值acc1、acc2和acc3(从低到高有效位顺序)形成192位累加值。这些64位值中的每一个与对应于192位累加值的有效位的较大总范围内的有效位范围相对应。

如图3所示,第一个192位加数和第二个192位加数都可以累加到起始192位累加值。每个加数由三个64位值构成。这些在图3中表示为值avxy,其中x对应于线程标识符,并且y对应于指示哪个范围的有效位正由该加数值表示。

加数和累加值的各个部分的共享范围有效位以及全范围有效位可以由与这些实体中的每一者相关联的元数据来表示。可以设置该元数据,以便在较大的整体可能范围的有效位内表示有效位的值。元数据有效地将窗口指示到由图3所示的各个操作数和集合操作数提供的较大整体范围的有效位内。包括图3的各个操作数的集合较大值本身可以是最大范围有效位的一小部分,其可以通过适当使用元数据值来表示。

返回到图3的示例,将第一加数和第二加数加到累加值中是关联操作,即,第一加数值是否在第二加数值被加到累加值之前就被加到累加值无关紧要,反之亦然。此外,加法被执行时的顺序可以在不同共享范围的有效位之间变化。因此,在步骤s11中作为第一动作,对于有效位范围a,将第一加数av11的相关部分加到累加值acc1的相应共享有效位范围部分。作为步骤s21,生成来自这次加法的进位输出并将其加到该加数的下一较高有效位部分即操作数ac12中。在步骤sl1的加法之后,在步骤s31处将第二加数av21的相应的最低有效位部分加到累加值(其已通过加上第一加数的相关部分而被修改)。在步骤s41处生成来自第二次加法的进位输出值作为值c21,并将其加到操作数av22中。因此,关于第一加数、第二加数和累加值的最低有效部分,要在第二加数的加法之前执行第一加数部分的加法。第一加数部分的加法与(acc1+av11)相对应并生成进位输出值c11。在执行完该加法之后,第二加法将值av21加到累加值acc1,并生成进位输出值c21。

关于操作数的有效位b部分,在所示出的示例中,将第一和第二加数的相关部分加到累加值acc2的对应有效部分的顺序与有效位部分a中的顺序相反。因此,在步骤s12处将av22加到累加值acc2。随后在步骤s22处从该加法中生成进位输出c22并将其加到操作数av23中。随后,在步骤s32处,将来自第一加数av12的操作数加到有效位部分b的累加值中。在步骤s42处生成来自该加法的进位输出c12并将其加到操作数av13中。因此,关于有效位部分b,将加数累加到累加值的顺序相对于有效位部分a相反。

最后,对于有效位部分c,在步骤s13处将来自第一加数的操作数av13加到累加值acc3的相应部分,并在步骤s23处生成进位输出c13。随后,在步骤s33处将操作数av23加到累加值acc3,并在步骤s43处生成进位输出c23。因此,将操作数加到累加值的顺序与有效位范围a中的顺序相同,而与有效位范围b中的顺序相反。

将图3中示出的到累加值的加法中的每一者作为由带进位的原子加法指令指定的带进位的原子加法操作来执行。每个有效位范围部分内的关联性起到以下效果:可以改变每个有效位范围部分内的加法的顺序,而不影响最终的结果。将来自每次加法的进位输出值提供给下一部分的加数操作数(形成总加数的一部分)并且在下一部分自身的加法被执行之前被加到该部分的加数操作数中。在可以在不同有效位范围部分中使用的顺序中的这种变化起到以下效果:在整个计算过程中,由累加操作数acc1、acc2和acc3(内存表示)表示的值可能不表示任何真实有意义的值,但是当所有带进位的原子加法指令都被执行结束时,存储在存储器内的总累加值(acc3:acc2:acc1)中的最终结果将是正确的,并且所有进位将被适当地反映。由于内存表示可能不会在任何时候都是有意义的,所以存在不能使用本技术的一些用例,但还有大量的在其中这个问题并不成问题而且本技术可以被有用使用的其他用例。

其他示例实施例可以使用不同位宽的加数和内存累加器,例如,64位加数到192位累加器。在这种情况下,当没有进位输出时,通常单个64位aaddc就足够了。当有一个进位时,则偶尔需要两个aaddc指令,而当有两个进位时,则罕见地需要三个aaddc指令。这些情况是图3的布置的特殊情况,在其中当未生成进位时支持“早退”。

图4示意性地示出了针对分别对应于图3的第一加数值和第二加数值的两个线程中的每一者对带进位的原子加法指令(aaddc)的执行。相对于时间线示出这些程序指令的执行。在图4的示例中,首先执行针对第一线程的最低有效部分的带进位的原子加法指令(即aadddc11)。之后是针对第二线程的最低有效位部分和中间有效位部分的带进位的原子加法指令,即aaddc21和aaddc22。此后,执行针对第一线程的中间有效部分和最高有效部分的带进位的原子加法指令,即aaddc12和aaddc13。最后,执行针对第二线程最高有效部分的带进位的原子加法指令(即,aaddc23)。在每个线程内,带进位的原子加法指令按其有效位顺序被执行,并具有根据需要在其间传播的进位信号。在线程之间,顺序是关联的,并且可以被改变以适应系统的要求。线程之间的关联行为允许指令调度中更大的自由度。

图5a至5g示意性地示出了在具有用于存储来自共享存储器34的数据缓存行的缓存存储器38的系统的情境中使用带进位的原子加法指令。输入队列40包括分别来自程序线程a、b、c和d的带进位的原子加法指令(aaddc)。处理电路42用于在被加的数据值不存在于高速缓存38内时通过使用本地累加器46累加出本地和值44来执行这些aaddc指令。等待其返回操作数的指令停驻在停驻操作队列48内。当指令已被执行并且具有其所有返回操作数时,则将其发送到输出队列50。

图5a示出了线程a的加数值0x01被加,初始本地和值44为0x00(“0x”表示十六进制数)的情形。来自共享存储器34的数据值不存在于高速缓存36中。

图5b示出了对来自线程b的第二个带进位的原子加法指令aaddc-0x10的执行,其中线程b具有加数操作数值0x10并被累加到本地和44。线程a的aaddc指令停驻在停驻操作队列48。

图5c示出了线程a的指示未发生进位的返回进位值被返回的下一循环。同时,线程c的加数操作数值0xf0被加到本地和值440x11,以生成更新的本地和值。

图5d示出了线程d加法操作数值0x04被加到本地和值0x01中以生成更新的本地和值0x04。将图5c的先前加法所生成的进位作为如图所示的与线程b相关联的返回进位输出值来发送。因此,线程b与进位输出值相关联,而该进位输出值实际上是由相对于线程c执行的加法生成的。

图5e示出了在执行完线程d的最后的带进位的原子加法指令之后,将其加到本地和值44中以生成结果0x05的情形。同时,与线程c相关联并与线程d的加数操作数值的加法相对应的返回进位输出值被传出,随后为零。留下线程d进行停驻操作。

应理解的是,线程a、b、c和d的带进位的原子加法指令中的每一者已相对于本地和值被执行,但还未按预期相对于存储在共享存储器34中的数据值被执行。图5f示出了如何将数据值0xfc从共享存储器34返回到缓存存储器38,随后将本地和值0x05加到其上,以便从线程d生成针对最后停驻操作的返回进位输出值。在图5g的示例中,存储到数据值(当前保存在高速缓存38中)的最终结果是具有最终进位输出值为1的数据值0x01。

线程d是线程序列中的最后一个线程,并且延迟对返回进位输出值的返回,直到执行完与数据值的最后一次加法。其他线程a、b、c在执行与数据值的最后一次加法之前就返回提供给它们的返回进位输出值,并且因此这些线程可以被释放来执行比等待数据值返回到高速缓存38更早的进一步处理操作。因此,加法操作数在本地和值44内被累加,并返回除了最后一个指令之外的所有指令的返回进位输出值。当数据值变为可用的时,则将本地和值加到该数据值上,并且可以生成最终的返回进位输出值并针对线程d的指令将其返回。

图6示意性地示出了在另一情境中对带进位的原子加法指令的使用。这个情境是具有2:1扇入的合并树,用于执行带进位的原子加法指令。图6的合并树内的合并节点中的每一者表示从分层结构中较高级别的处理装置接收多个带进位的原子加法指令的处理装置(如图6所示)。层级中的最高级别处是处理装置p10至p17,其各自输出带进位的原子加法指令。下一级别是合并处理器p20至p23。下一级别是合并处理器p30和p31。最后,在合并处理器之间是处理器p40。保存要进行累加(相加)的数据值52的处理装置是处理器proot。在图6的层级中最高级别和图6的层级中的根之间的节点处的合并处理器各自接收带进位的原子加法指令并生成一个要传递到分层结构内的下一个较低级别的输出带进位的原子加法指令,即2:1扇入。当节点已根据其接收到的带进位的原子加法指令的加数操作数形成本地和值时,则将返回进位输出操作数从每个合并节点返回到从其接收带进位的原子加法指令的第一指令源。带进位的原子加法指令中的第二个未被提供其返回进位输出值,并且其被保持,直到该节点接收到关于其生成的输出带进位的原子加法指令的返回进位输出值。图6中示出的扇入是2:1,但应理解的是,若需要也可以支持更高级别的扇入。

图6的合并树内的每个合并节点都接收给定的输入带进位的原子加法指令(针对其的返回将被延迟)和一个或多个另外的输入带进位的原子加法指令。该节点执行对给定的输入带进位的原子加法指令的给定的加数操作数值和一个或多个另外的输入带进位的原子加法指令的一个或多个另外的输入加数操作数值的本地加法,以生成本地和值和一个或多个本地进位输出值。将这些一个或多个本地进位输出值作为相应的返回值发送到一个或多个另外的指令的一个或多个另外的指令源。该节点生成将本地和值指定为其加数操作数值的输出带进位的原子加法指令,并将其传递到图6的合并树中的下一个较低级别。随后该节点等待,直到其接收到关于该输出带进位的原子加法指令的被接收的进位输出值,并且当接收到该值时,将其作为返回值发送到正等待其返回进位输出值的给定指令源。

在合并树中的根级别处,节点proot接收以原子方式对所存储的数据值52执行并生成返回值的单个带进位的原子加法指令。根节点proot接收的带进位的原子加法指令的加数操作数值是层级中的节点p10到p17的所有加数操作数的总和。已返回关于在本地和值的形成过程中生成的进位的进位输出值。

如图6所示,节点p20到p23各自执行它们的本地求和以及合并操作,并针对它们的两个指令源之一生成相应的返回进位输出值。这些返回进位输出值在图6中被编号为1、2、3、4。此时尚未生成这些节点的剩余返回进位输出值,并且树中较高级别的相关线程被保持,等待那些返回值的返回。

在层级中的下一个较低级别处,节点p30和p31各自从以上级别接收两个带进位的原子加法指令,并再次执行本地求和运算,其中该本地求和运算生成一个返回进位输出值(示出为返回进位输出值5、6),并且存在被保持的其他进位输出值。

返回值5被发送到节点p21,随后可以用于生成从节点p21发送到节点p12的返回值7。在节点p23处接收的返回值6用作从节点p23发送到节点p16的返回值8。

图6的合并树中的最终合并级别对应于节点p40。它从节点p30和p31接收带进位的原子加法指令。节点p40执行对接收到的带进位的原子加法指令中的每一者的加数操作数的本地加法,并生成传回到节点p31的返回进位输出值9。随后,返回进位输出值9可以经由节点p31和节点p22传播,以作为返回进位输出值11被发送给节点p14。

最终合并节点p40生成被发送给路由节点proot的输出带进位的原子加法指令,在proot中将其加到数据值52并生成返回到节点p40的返回进位输出值12。返回值12经由节点p30和p20传播以作为进位15到达节点p10。

在整个操作中,将看到原始源节点p10至p17中的每一者最终接收到返回进位输出值。早期的返回进位输出值由这些指令源(节点)的有效部分接收,这允许它们在最后一次加法在根节点proot处被执行之前继续进行其他处理。

图7是示意性地示出图6(即具有2:1扇入)的一个合并节点的操作的流程图。在步骤54处,处理等待直到接收到第一个带进位的原子加法指令。随后在步骤56处,处理等待直到接收到第二个带进位的原子加法指令。步骤58执行本地加法并生成本地进位。步骤60将本地进位返回到第二指令源。随后步骤62将指定在步骤58处计算的本地和的输出带进位的原子加法指令发送到在合并树层级中较低的下一个处理器。步骤64等待直到在节点处接收到返回进位输出值。当接收到返回进位值时,随后步骤66将该返回进位输出值转发到第一指令源。

尽管本文已参照附图详细描述了说明性实施例,但应理解的是,权利要求不限于这些精确的实施例,并且本领域技术人员可以在其中实现各种改变、添加和修改,而不背离所附权利要求的范围和精神。例如,可以对独立权利要求的特征和从属权利要求的特征进行各种组合。

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