使用原子序列支持宽操作的方法和装置制造方法

文档序号:6629233阅读:204来源:国知局
使用原子序列支持宽操作的方法和装置制造方法
【专利摘要】本发明的实施例涉及使用原子序列支持宽操作的方法和装置。通过扩充被设计为启动原子序列的加载操作并且扩充典型地终止原子序列的条件存储操作来达成宽原子序列的实现。扩充的加载操作被设计为除了启动原子序列之外还分配内存缓冲区。条件存储操作被扩充以对于存储在其中的任何数据检查所分配的内存缓冲区。如果在内存缓冲区中检测到一个或多个数据字,则条件存储操作将所检测到的数据字(多个)和被提供作为操作数的另一个字存储在内存位置的串接中。所达成的宽原子序列使得硬件系统能够支持宽内存操作和通常的宽操作。
【专利说明】使用原子序列支持宽操作的方法和装置

【背景技术】
[0001]在硬件系统中,原子序列使得能够不中断地执行指令序列。因此,原子序列提供了用于在确保与指令序列相关联的内存空间不被任何其他指令或操作进行访问或修改的同时执行指令序列的框架。


【发明内容】

[0002]原子序列提供了用于不中断地执行指令序列的工具。通过扩充被设计为启动原子序列的加载操作并且扩充终止原子序列的条件存储操作,在硬件系统中达成宽原子序列的实现。所达成的宽原子序列使得硬件系统能够支持宽内存操作和通常的宽操作。
[0003]根据至少一个示例实施例,用于在处理器中实现宽原子序列的方法和相应装置包括通过执行被设计为启动原子序列并且分配内存缓冲区的操作、或指令来启动原子序列。然后通过执行条件存储操作将一个或多个数据字存储在一个或多个连续的、或非连续的内存位置的串接中。条件存储操作被设计为对于存储在其中的任何数据自动地检查内存缓冲区。条件存储操作基于检查内存缓冲区的结果来存储一个或多个数据字。
[0004]根据宽原子序列的至少一个示例实施例,被设计为启动原子序列的操作在被执行时例如基于被提供作为操作数的相应的内存位置或地址来加载数据字。此外,在原子序列内执行至少一个常规加载操作,导致至少一个另一数据字被加载。还可以通过在原子序列内执行一个或多个常规存储操作来将数据存储在所分配的内存缓冲区中。因此,在执行条件存储操作时,将存储在内存缓冲区中的数据和被提供作为与条件存储操作的操作数的数据字存储在两个或多个连续的或非连续的内存位置的串接中,两个或多个内存位置的串接、以及存储在其中数据和数据字具有比与处理器相关联的数据字宽度更大的累积的宽度。存储在内存缓冲区中的数据可以表示基础操作的一个或多个第一实例的一个或多个输出,并且被提供作为与条件存储操作的操作数的数据字可以表示基础操作的第二实例的输出。在此情形下,存储在两个或多个内存位置的串接中的数据和数据字表示对应于基础操作的宽基础操作的输出。在原子序列内执行基础操作的一个或多个第一实例和基础操作的第二实例。
[0005]根据至少另一实例实施例,被设计为启动原子序列的操作、指令将承载静态值的存储寄存器作为目的寄存器。因此,被设计为启动原子序列的指令在被执行时实际上并不加载数据。通过在原子序列内执行一个或多个常规存储操作将数据存储在所分配的内存缓冲区中。通过条件存储操作检测存储在所分配的内存缓冲区中的数据。检测到要被存储在内存缓冲区的一个或多个第一数据字和被提供作为与条件存储操作的操作数的第二数据字被存储在两个或多个连续的或非连续的内存位置的串接中,一个或多个第一数据字和第二数据字具有比与处理器相关联的数据字宽度更大的累积的宽度。检测到要被存储在内存缓冲区的一个或多个第一数据字可以表示基础操作的一个或多个第一实例的一个或多个输出,并且第二数据字可以表示基础操作的第二实例的输出。因此,所存储在两个或多个内存位置的串接中的一个或多个第一数据字和第二数据字表示对应于基础操作的宽基础操作的输出。基础操作的一个或多个第一实例和基础操作的第二实例在启动原子序列之间被执行。
[0006]根据至少一个示例实施例,被设计为启动原子序列的操作和在原子序列内执行的任何常规加载操作(多个)对驻留在单个内存行内的内存位置进行操作。此外,在原子序列内执行的任何常规存储操作(多个)、以及扩充的条件存储操作对驻留在单个内存行内的内存位置进行操作。

【专利附图】

【附图说明】
[0007]前述内容将从如由附图所图示的本发明的示例实施例的以下更多具体描述中变得清楚,附图中同样的附图标记贯穿不同视图而指代相同的部分。附图未必按比例,而是将重点放在图示本发明的实施例。
[0008]图1是根据至少一个示例实施例的硬件系统100的框图,图示了内存缓冲区与条件存储操作和被设计为启动原子操作的扩充的加载操作的连结;
[0009]图2是根据至少一个示例实施例的图示使得处理器设备能够支持宽内存操作的方法的流程图;以及
[0010]图3是根据至少一个示例实施例的图示使得处理器设备能够支持宽内存操作的方法的流程图。

【具体实施方式】
[0011]以下是本发明的示例实施例的描述。
[0012]在一些微处理器中,寄存器、地址总线和数据总线具有固定的宽度,例如,32位或64位。因此,任何内存访问操作、逻辑操作、或者任何其他操作通常受到固定宽度的限制。也就是说,由微处理器支持的所有的内存地址、整数和数据字具有等于相同固定宽度的大小或宽度。对于给定微处理器的寄存器、地址总线、和数据总线的固定宽度在下文中被称为对于相同微处理器的数据字宽度。一些其他的微处理器还可以支持比相应的数据字宽更宽的内存操作。例如,一些64位处理器可以支持128位的内存操作,但是它们不支持256位的内存操作。即,这样的处理器可以支持有限的宽内存操作,例如,具有宽度等于相应数据字宽度的两倍的内存操作,但是不支持更宽的内存操作。
[0013]对于给定微处理器的数据字宽度对于可以由相同微处理器和与微处理器相关联的任何计算机体系结构来执行的原子内存操作存在限制。
[0014]根据至少一个示例实施例,采用原子序列以使得处理器能够支持宽内存访问、以及其他操作。换句话说,原子序列的至少一个实现方式提供一种框架,其使得给定处理器能够支持比与相同处理器相关联的数据字宽度更宽的内存访问、以及其他操作。例如,通过使用现有的64位指令并且扩充所支持的原子序列的能力,可以使得支持64位计算的处理器能够处理128位或256位原子内存操作
[0015]原子序列使得能够定义指令或操作的不可中断序列。换句话说,一旦原子序列被启动,则所有相应的指令都在任何其它指令可以被允许执行之前被执行。因此,原子序列提供了用于在确保与指令序列相关联的内存空间不被任何其他指令或操作进行访问或修改的同时执行指令序列的框架。
[0016]下面的指令序列表示使用MIPS64指令集的一个原子序列。
[0017]Label:
[0018]LLD$5,0($6)
[0019]DADDIU$5, $5, I
[0020]SCD$5, 0 ($6)
[0021]BEQ$5, $0, Label
[0022]NOP
[0023]上面所示的原子序列是用来原子地对内存地址加一的指令序列的示例。内存地址有64位宽度。假定内存地址被初始地存储在寄存器$6中。加载链接双字(LLD;LoadLinked Doubleword)指令是在MIPS64指令集中的加载指令,被设计为在被执行时启动一个原子序列。LLD指令还将64位内存位置从寄存器$6加载到寄存器$5中。双字加立即无符号(DADDIU ;Doubleword Add Immediate Unsigned)指令将I加到现在存储在寄存器$5中的内存地址。
[0024]存储条件双字(SO) ;Store Condit1nal Doubleword)指令是条件存储指令,其通常指示原子序列的最后的指令并且被设计为存储数据字。在上面的示例中,SCD或者利用寄存器$5的内容来更新寄存器$6中的64位内存地址,并且将I存放在寄存器$5中,指示成功的存储,或者仅将O存放在寄存器$5中,指示存储失败。平等分支(BEQ;Branch onEQual)指令是一个分支指令,其检查SCD是否被成功地执行,例如,成功的存储,并且在检测到SCD指令失败的情况下导致原子序列被重复。具体而言,BEQ将寄存器$5的内容与零进行比较。注意寄存器$0总是读作零。如果寄存器$5的内容等于零,例如,SCD未能存储数据字,则BEQ将执行引导至“Label”(标签),因此,导致原子序列再次由LLD指令启动。如果寄存器$5的内容不等于零,例如,SCD成功存储数据字,则分支未被采用,并且执行继续前进至跟着原子序列的任何指令。在上面给出的示例MIPS64代码的末尾所示的无操作(NOP ;No Operat1n)指令什么也不做。
[0025]虽然诸如LLD和S⑶的指令特定于MIPS64体系结构,但是等效操作存在于、或者可能存在于其它处理器体系结构中。本领域技术人员应当理解本文所给出的实施例不限于MIPS64体系结构,而是相反可适用于其它体系结构。在下文中,启动原子序列的指令,例如,MIPS64下的LLD指令,但不一定限定于MIPS64体系结构,被称为被设计为启动原子序列的操作或指令。根据至少一个示例实施例,这样的指令可以是或可以不是加载操作。另外,用于条件地存储数据的指令,例如,MIPS64下的S⑶指令,但不一定限定于MIPS64体系结构,被称为条件存储操作、或指令。常规加载操作在本文指的是这样的加载操作,例如MIPS64体系结构下的加载双字(LD ;Load Doubleword)操作的等同物,其只是加载数据字。常规存储操作在本文指的是这样的存储操作,例如,MIPS64体系结构下的存储双字(SD ;StoreDoubIeword)操作的等同物,其只是存储数据字。
[0026]根据至少一个示例实施例,被设计为启动原子序列的操作的硬件实现被扩充以除了启动原子序列之外还分配内存缓冲区、或“写缓冲区”。换句话说,执行被设计为启动原子序列的扩充操作包括启动原子序列并且分配内存缓冲区。此外,条件存储操作的硬件实现被扩充以进一步地对于存储在其中的任何数据检查所分配的内存缓冲区。如果在内存缓冲区中检测到任何数据,则检测到的数据和一个数据字被存储在两个或多个连续或不连续的内存位置的串接中;否则,该数据字被存储在内存位置中。在给定的处理器体系结构中,通过扩充条件存储操作和被设计为启动原子序列的加载操作,具有经扩充的操作的原子序列使得处理器能够支持宽内存操作。本领域技术人员应当理解,在给定的处理器体系结构中,取代扩充现有操作,被设计为启动原子序列并且分配内存缓冲区的操作可以被实现为该体系结构下的新的指令。类似地,被设计为检查所分配的内存缓冲区的条件存储操作可以被实现为给定的硬件体系结构下的新的指令。
[0027]图1是根据至少一个示例实施例的硬件系统100的框图,图示了内存缓冲区与被设计为启动原子序列的操作和条件存储操作的连结。硬件系统100包括处理单元110和内存组件120。在执行被设计为启动原子序列的扩充的加载操作时,处理单元110启动原子序列并且分配内存缓冲区115。例如,在可从Cavium公司获得的OCTEON处理器中,内存缓冲区115可以被分配在写缓冲区内。然而,本领域技术人员应当理解在其他处理器中、内存缓冲区115可以以类似的方式或者不同地进行分配,例如在一级(LI)数据高速缓冲存储器内。
[0028]根据一个示例实施方式,启动原子序列包括设置“锁标记”,指示原子序列是活动的、或者正被执行。被设计为启动原子序列的加载操作通常开始新的原子序列,即使存在先前启动的另一活动的原子序列。开始新的原子序列破坏任何之前的活动的原子序列。根据至少一个方面,分配内存缓冲区115包括每当被设计为启动原子序列的加载操作被执行时,对内存缓冲区115进行清除。
[0029]根据至少一个示例实施方式,内存缓冲区115包括η个缓冲区条目,例如,117-1-117-η,其中η是整数。每个缓冲区条目的大小等于与硬件系统100相关联的数据字宽度(即W)。例如,如果与硬件系统100相关联的数据字宽度W等于64位,那么每个内存缓冲区条目,例如,117-1、117-2、……、或117-η,为64位宽。每行的内存缓冲区115可以对应于单个内存缓冲区条目。也就是说,每行的内存缓冲区115具有等于W的宽度。可替换地,每行的内存缓冲区115可以具有等于数据字宽度W的二倍、三倍或m倍的宽度,其中m是整数。根据又一实施方式,每行的内存缓冲区115可以是未必是W的倍数的大小。
[0030]诸如MIPS64下的S⑶的条件存储操作通常将数据字存储在内存位置中并且终止原子序列。保持有数据字的寄存器112通常被提供作为与条件存储操作的输入操作数。根据至少一个示例实施例,扩充的条件存储操作对于存储在其中的任何数据检查内存缓冲区。如果检测到一个或多个数据字要被存储在内存缓冲区115中,则条件存储操作将一个或多个检测到的数据字和例如来自寄存器112中的数据字的另外一个数据字存储在两个或多个内存位置的串接中,例如,121a-121d。两个或多个内存位置的串接可以是连续的或不连续的。然而,如果没有检测到数据要被存储在内存缓冲区115中,则条件存储操作只是将被提供作为与条件存储操作的操作数的数据字、例如来自寄存器112中的数据字存储在指定的内存位置,例如,121d,并且终止原子序列。
[0031]当相应的条件存储操作执行时,原子序列结束。例如,如果在条件存储操作发出时“锁标记”仍被保持,则被提供作为与条件存储操作的操作数的数据字、和在内存缓冲区115中发现的任何数据(如果有的话)被成功地写入到内存。然而,如果在条件存储操作发出时“锁标记”是关闭的、或者被清除,则该数据字和内存缓冲区115中的任何数据未能被存储在内存中。例如MIPS64下的SCD的条件存储操作例如基于“锁标记”值返回原子序列的成功/失败指示。根据一个示例实施方式,一个或多个数据字可以通过常规存储操作在原子序列内被存储在内存缓冲区115中。当原子序列成功时,内存缓冲区115中的一个或多个数据字和被提供作为用于条件存储操作的操作数的数据字(例如,在寄存器112中提供的)一起被写入到内存中。根据至少一个示例实施方式,内存缓冲区115中的一个或多个数据字、和被提供作为用于条件存储操作的操作数的数据字(例如,来自寄存器112)被存储在两个或多个连续内存位置的串接中。可替换地,内存缓冲区115中的一个或多个数据字、和被提供作为用于条件存储操作的操作数的数据字(例如,来自寄存器112)可以根据不同的方案被存储在内存中,例如,两个或多个不连续的内存位置。
[0032]在典型的原子序列中,在原子序列内不采用常规加载或常规存储操作。根据至少一个示例实施方式,在具有被设计为启动原子序列的扩充的或新的操作、以及扩充的或新的条件存储操作的原子序中,常规加载操作(多个)或常规存储操作(多个)可能被在原子序列内所采用。
[0033]图2是根据至少一个示例实施例的图示使得处理器设备能够支持宽内存操作的方法200的流程图。在框210,通过执行被设计为启动原子序列的加载操作而启动原子序列。除了启动原子序列外,被设计为启动原子序列的加载操作还加载基于指示寄存器或内存位置的相应操作数的数据字。根据至少一个示例实施例,被设计为启动原子序列的加载操作还被设计为在执行时分配内存缓冲区115。例如,内存缓冲区115可以被分配在与处理单元110相关联的高速缓存存储器中。分配内存缓冲区115包括每当启动原子序列时清除内存缓冲区115内的任何内容。
[0034]在启动的原子序列内,执行一个或多个常规加载操作和/或一个或多个常规存储操作(图2未示出)。例如,使用启动的原子序列内的常规加载操作来加载一个或多个数据字。在框240,可以使用启动的原子序列内的常规存储操作来将一个或多个数据字存储在所分配的内存缓冲区115中。例如,在所分配的内存缓冲区115中存储的一个或多个数据字可以表示在框220中执行的基础操作的一个或多个第一实例的一个或多个结果。基础操作包括逻辑操作,例如,OR(或)、XOR(异或)、AND(与)等、算术运输或处理单元110所支持的任何其他操作。在将一个或多个数据字存储在所分配的内存缓冲区115中时,可以使用一个或多个数据字的每个地址内的多个最低有效位(LS)来确定内存缓冲区内的用于存储该一个或多个数据字的一个或多个位置。例如,如果内存缓冲区115具有用来存储总共128个字节的容量,则一个或多个数据字的每个地址的最低的七个有效位可以被用来指示字节以被写到内存缓冲区115中。可替换地,如果内存缓冲区115具有用来存储总共256个字节的容量,则一个或多个数据字的每个地址中的最低的八个有效位可以被用来指示字节以被写到内存缓冲区115中。本领域技术人员应当理解可以采用不同的方法以便指派所分配的内存缓冲区内的位置以在其中存储数据字。
[0035]在框250,通过执行扩充的条件存储操作来终止原子序列。扩充的条件存储操作将与数据字相关联的寄存器(例如,112)或内存地址的指示作为操作数并且被配置为将相应的数据字存储在所指定的内存位置,例如,内存位置还被提供在扩充的条件存储操作的第二操作数中。数据字例如可以表示在框230中执行的基础操作的第二实例的输出。扩充的条件存储操作被配置为对于存储在其中的任何数据,检查所分配的内存缓冲区115、或者所分配的内存缓冲区115的指定的部分。例如,如果在原子序列内执行一个或多个常规存储操作,例如,如由框240所指示,则一个或多个相应的数据字已经被存储在所分配的内存缓冲区115中。
[0036]图2中的框220和230是可选的。换句话说,基础操作的实例可以在或可以不在原子序列内执行。此外,框240中的存储操作可以被或可以不被执行。
[0037]当检测到存储在内存缓冲区115内的一个或多个数据字时,将所检测到的一个或多个数据字和具有被提供作为与条件存储操作的操作数的相应地址的数据字存储在两个或多个内存位置中,例如,121a-121d。如果在所分配的存缓冲区115内没有检测到数据,则仅将具有被提供作为与扩充的条件存储操作的操作数的相应地址的数据字存储在指定的内存位置。在扩充的条件存储操作成功执行时,原子序列被终止。
[0038]如果由原子序列中的任何操作、包括启动原子序列的加载操作和/或常规加载操作(多个)所访问的字节中的任何字节具有与在启动原子序列的加载操作发出时不同的值,则原子序列失败,例如没有数据字(多个)被写入内存中。当另一内核写高速缓冲存储器行时、或者写访问K位自然对齐的字的原子序列时,硬件系统100还可以使原子序列失败。K位自然对齐的字指的是宽字,其宽度等于K,并且被原子序列所访问以执行宽原子内存操作。例如,在64位体系结构中,K可以是128、526等。术语自然对齐指示K位的字处于单个内存行内。根据至少一个示例实施例,K位的字被取样,并且副本被保持。当条件存储操作被执行时,将内存中的K位的字与所保持的副本进行比较以确定另一内核处理器是否修改了内存中的该K位的字。
[0039]如果原子序列中的包括启动原子序列的加载操作和/或常规加载操作(多个)的加载操作、以及例如任何常规存储操作和条件存储操作的存储操作看来已经在内存中原子地执行,则原子序列成功。根据至少一个示例实施方式,包括将数据存储在透写(write-through)LI数据高速缓冲存储器中的任何常规存储操作的原子序列在条件存储操作在原子序列结束处成功或失败时,使来自数据高速缓冲存储器的相应高速缓冲存储器块无效。
[0040]下面的指令序列表示一个原子序列,其使用MIPS64指令集,用于在支持64位计算的硬件系统中实现128被XOR操作。
[0041]//假定$1包含形成自然对齐的128位字的两个64位字中的第一
[0042]//64位字的地址
[0043]//假定$2、$3包含要与两个64位数据的组合相XOR的两个64位
[0044]// 字的数值 $4〈_$ 1&0x7F
[0045]//0x7F:第一字的地址的七个最低有效位,指示内存缓冲区内的
[0046]// 位置
[0047]Il内存缓冲区内具有等于128字节的总大小
[0048]AGAIN:
[0049]LLD$5,0($1)
[0050]LD$6,8($1)
[0051]X0R$7, $2, $5
[0052]X0R$8, $3,$6
[0053]SD$7, CONSTANT ($4)
[0054]SCD$8,8($1)
[0055]BEQ$8, AGAIN
[0056]NOP
[0057]//$5, $6 包含“取来”(fetch)值
[0058]首先,扩充的LLD指令启动原子序列,分配内存缓冲区115,并且将具有寄存器$1中的地址的第一 64位字加载到寄存器$5中。常规加载指令(LD)接着将第二 64位字加载到寄存器$6中。如果第一字的地址是A,则第二字的地址是A+8。第一 64位字和第二 64位字一起形成128位的自然对齐的字。也就是说,两个64位字被定位在相同的内存行内的两个连续的内存位置。对于寄存器$2和寄存器$5中的内容执行第一 64位XOR操作,并且相应的第一 64位结果被放入寄存器$7中。对于寄存器$3和寄存器$6中的内容执行第二64位XOR操作,并且相应的第二 64位结果被放入寄存器$8中。然后使用常规存储指令SD将寄存器$7中的结果存储在所分配的内存缓冲区115中。在将第一结果存储在所分配的内存缓冲区115中时,CONSTANT+($4)的值指示内存缓冲区115内的第一结果将被存储在其中的缓冲区条目的地址。参数CONSTANT是常数。寄存器$4中的数值对应于第一 64位字的内存地址的七个最低有效(LS)位,S卩,$4〈-$l&0x7F。本领域技术人员应当理解内存缓冲区115内的地址可以被不同地定义。
[0059]处理单元110在LLD发出的时刻原子地取样整个128位的自然对齐的字,即两个64位字的组合。然后,如果(a)原子序列中的任何LD或LLD指令得到与该取样不一致的结果,或者(b)被加载的任何字节的内存值在序列被分解时不同于该取样,则处理单元110使终止S⑶失败。
[0060]当终止S⑶指令成功时,被提供作为与终止S⑶指令的第一操作数的第二结果,例如,$8,被写入由S⑶指令的第二操作数、例如8($1)所指示的内存地址A+8。而且,使用常规存储指令SD被存储在内存缓冲区115中的第一结果被写入内存地址A,例如,($1)。寄存器$4中的值表示地址偏移,向例如处理单元110的硬件指示存储在所分配的内存缓冲区115中的数据要被写入到内存中的内存地址A,例如A或($1)。换句话说,它确定在被提供作为与SCD指令的操作数的内存地址、例如8+$1与当SCD被执行时内存缓冲区中的数据字要被存储在其中的内存位置之间的内存偏移。换句话说,如果当执行条件存储操作时,多个字要被存储在内存中,则地址偏移指示内存中的与该多个字相关联的地址值之间的偏移。
[0061]令X是表示使用LLD和LD指令加载的第一和第二 64位字的组合的128位字,令Y是表示寄存器$2和$3中的内容的组合的128位。通过S⑶存储在内存地址A和A+8中的第一结果和第二结果的组合是表示与相应的操作数X和Y的128位XOR操作的结果的128位字。因此,以上所示的使用MIPS64指令集的原子序列是使用64位计算硬件的、基于扩充的LLD和SCD指令的128位XOR操作的示例实施方式。本领域技术人员应当理解可以使用除了 XOR的另一个基础操作。可替换地,可以采用具有扩充的LLD和SCD指令但不具有基础操作的不同的原子序列来实现宽内存操作,比如读和写操作。而且,本领域技术人员还应当理解可以使用与MIPS64不同的指令集来实现其他体系结构内的宽操作。
[0062]具有被设计为启动原子序列的扩充的加载操作以及扩充的条件存储操作的原子序列在下文中被称作宽原子操作。
[0063]图3是根据至少一个另外的示例实施例的图示使得处理器设备能够支持宽内存操作的方法的流程图。在框330,通过执行被设计为在执行时启动原子序列并且分配内存缓冲区115的操作、或指令来启动原子序列。在此情形下,被设计为启动原子序列的操作将承载例如零的静态值的存储寄存器,例如,$0,作为目的地。换句话说,被设计为启动原子序列的扩充的操作主要功能是启动原子序列并且分配内存缓冲区115,而不加载数据字。在框340,可以使用一个或多个常规存储操作将一个或多个第一数据字存储在所分配的内存缓冲区115中。一个或多个数据字可以表示在启动原子序列之前所执行的基础操作的一个或多个第一实例的一个或多个结果,如框310所示。
[0064]在框350,执行扩充的条件存储操作。该条件存储操作可以被扩充或者定义为给定体系结构下的新的指令。该条件存储操作将与数据字相关联的寄存器(例如,112)或内存地址的指示作为操作数并且被配置为将该数据字存储在所指定的内存位置,例如,内存位置还被提供在该条件存储操作的第二操作数中。数据字例如可以表示在启动原子序列之间执行的基础操作的第二实例的输出,如框320所示。条件存储操作被配置为对于存储在其中的任何数据,检查所分配的内存缓冲区115、或者所分配的内存缓冲区115的指定的部分。例如,如果在原子序列内执行一个或多个常规存储操作,例如,如由框330所指示的,则一个或多个相应的数据字已经被存储在所分配的内存缓冲区115中。
[0065]当检测到存储在内存缓冲区115内的一个或多个数据字时,将所检测到的一个或多个数据字和具有被提供作为与条件存储操作的操作数的相应地址的数据字存储在两个或多个内存位置中,例如,121a-121d。如果如框310和320所示的、在启动宽原子序列之前执行基础操作的实例,则通过条件存储操作存储在内存中的数据字的组合表示相应的宽基础操作的结果。在框310和320中指示的基础操作的实例是可选的。宽原子序列表示例如宽的读和宽的写操作的宽内存操作的实施方式。在存储在内存缓冲区中检测到的一个或多个数据字、和具有被提供作为与条件存储操作的操作数的相应地址的数据字时,使用地址偏移来指示数据字要被存储在内存中的内存位置之间的偏移。
[0066]如果在所分配的内存缓冲区内没有检测到数据,则仅具有被提供作为与条件存储操作的操作数的相应地址的数据字被存储在所指定的内存位置。在条件存储操作成功执行时,原子序列终止。如果宽原子序列在终止以前被中断,则条件存储操作失败,即不能将一个或多个数据字存储在一个或多个内存位置的串接中。参考图3所描述的宽原子序列可以被看作是被配置为将例如与处理单元110相关联的数据字宽度更宽的宽字写入内存120的宽的写原子序列。
[0067]在使用原子序列内的常规存储操作将数据存储在所分配的内存缓冲区中时,还可以采用参考图2所描述的、用于定义内存缓冲区115中的缓冲区的地址的相同的方案以实现图3中所描述的宽原子序列。也就是说,使用要被存储在内存缓冲区115中的地址的多个LS位、例如七个LS位来指示以被写入内存缓冲区的字节。而且,当条件存储操作成功时,处理单元110将内存缓冲区115中的数据字和被提供作为条件存储操作的操作数的数据字一起写入到内存位置的串接中。内存位置的串接由被提供作为与条件存储操作的第二操作数的内存地址和地址偏移来定义。
[0068]下面的指令序列表示如在图3中所描述的用于使用MIPS64指令集来在支持64位计算的硬件系统中实现128位的内存操作的一个宽原子序列。
[0069]//假定$1包含(自然对齐的)128位地址的部分以存储128位字
[0070]//$2<-$l&0x7F
[0071]//0x7F:因为内存缓冲区是128字节
[0072]AGAIN:
[0073]$3<-X
[0074]$4<-y
[0075]LLD$0,0($1)
[0076]SD$3, CONSTANT ($2)
[0077]SCD$4,8($1)
[0078]BEQ$3, AGAIN
[0079]NOP
[0080]在上面的示例中,扩充的LLD启动宽的原子序列并且分配内存缓冲区115,但是不加载数据字,因为它的目的地是寄存器$0。要被存储或者写入在内存中的128位字是分别由寄存器$3和$4所保持的1和7的组合。SD指令将X存储在所分配的内存缓冲区中。在执行扩充的S⑶时,X被存储在由寄存器$ I指示的内存地址B,而y被存储在内存地址B+8。存储在内存地址B和B+8中的X和y的组合形成128位的字。因此,在上面的示例中所示出的宽原子序列使得硬件系统100能够支持宽内存操作,例如宽的内存写。
[0081]下面的指令序列表示如在图3中所描述的、用于使用MIPS64指令集来在支持64位计算的硬件系统中实现256位的内存操作的一个宽原子序列。
[0082]//假定$1包含(自然对齐的)256位地址的部分以存储256位字
[0083]//$2<-$l&0x7F
[0084]//0x7F:因为内存缓冲区是128字节
[0085]AGAIN:
[0086]$3<-X
[0087]$4<-y
[0088]$5<-w
[0089]$6<-z
[0090]LLD$0,0($1)
[0091]SD$3, CONSTANT($2)
[0092]SD$4, C0NSTANT+8 ($2)
[0093]SD$5, CONSTANT+16 ($2)
[0094]SCD$6,24($1)
[0095]BEQ$3, AGAIN
[0096]NOP
[0097]图3的流程图中所描述的宽原子序列与图2中所描述的宽原子序列的不同之处在于框330中的操作将一贯地保持静态值、例如寄存器$0的寄存器作为目的地,并且因此,当启动原子序列时,在原子序列的结束处进行比较,不加载数据字并且不对任何数据进行取样。而且,虽然图2中描述的宽原子序列包括至少一个常规加载操作或常规存储操作,但图3描述的宽原子序列包括至少一个常规存储操作但不包括常规加载操作。此外,在图2的宽原子序列中,在宽原子序列内执行基础操作。然而,在图3的宽原子序列中,基础操作在启动宽的原子序列之前被执行。
[0098]虽然参考本发明的示例实施例对其进行了示出和描述,但是本领域技术人员将理解在不脱离所附权利要求所包括的发明的范围的前提下,可以在其中进行形式和细节中的各种变化。
【权利要求】
1.一种方法,包括: 由处理器通过执行被设计为启动原子序列并且分配内存缓冲区的操作来启动所述原子序列;以及 通过执行条件存储操作将一个或多个数据字存储在一个或多个内存位置的串接中,所述条件存储操作被设计为对于存储在所述内存缓冲区中的任何数据自动地检查所述内存缓冲区,并且基于检查所述内存缓冲区的结果来存储所述一个或多个数据字。
2.根据权利要求1所述的方法,其中被设计为启动原子序列的所述操作是被设计为启动所述原子序列的加载操作,并且执行被设计为启动所述原子序列的所述加载操作包括加载数据字。
3.根据权利要求2所述的方法,还包括通过执行至少一个常规加载操作来加载至少一个数据字。
4.根据权利要求2所述的方法,还包括: 通过在所述原子序列内执行一个或多个常规存储操作来将数据存储在所分配的所述内存缓冲区中,其中通过执行条件存储操作来存储一个或多个数据字包括: 将第二数据字以及与存储在所述内存缓冲区中的数据相关联的一个或多个第一数据字存储在两个或多个内存位置的串接中,所述一个或多个第一数据字和所述第二数据字具有比与所述处理器相关联的数据字宽度更大的累积的宽度。
5.根据权利要求4所述的方法,其中与存储在所述内存缓冲区中的数据相关联的所述一个或多个第一数据字表示基础操作的一个或多个第一实例的一个或多个输出,并且所述第二数据字表示所述基础操作的第二实例的输出,存储在所述两个或多个内存位置的所述串接中的所述一个或多个第一数据字和所述第二数据字表示对应于所述基础操作的宽操作的输出。
6.根据权利要求5所述的方法,还包括:在所述原子序列内执行所述基础操作的所述一个或多个第一实例和所述基础操作的所述第二实例。
7.根据权利要求1所述的方法,其中被设计为启动所述原子序列的所述操作将承载静态值的存储寄存器作为目的地。
8.根据权利要求7所述的方法,还包括: 通过在所述原子序列内执行一个或多个常规存储操作来将数据存储在所分配的所述内存缓冲区中,其中通过执行条件存储操作来存储一个或多个数据字包括: 将第二数据字以及与存储在所述内存缓冲区中的数据相关联的一个或多个第一数据字存储在两个或多个内存位置的串接中,所述一个或多个第一数据字和所述第二数据字具有比与所述处理器相关联的数据字宽度更大的累积的宽度。
9.根据权利要求8所述的方法,其中与存储在所述内存缓冲区中的数据相关联的所述一个或多个第一数据字表示基础操作的一个或多个第一实例的一个或多个输出,并且所述第二数据字表示所述基础操作的第二实例的输出,存储在所述两个或多个内存位置的所述串接中的所述一个或多个第一数据字和所述第二数据字表示对应于所述基础操作的宽操作的输出。
10.根据权利要求9所述的方法,还包括:在启动所述原子序列之前,执行所述基础操作的所述一个或多个第一实例和所述基础操作的所述第二实例。
11.根据权利要求1所述的方法,其中被设计为启动所述原子序列的所述操作对驻留在单个内存行内的内存位置进行操作。
12.根据权利要求1所述的方法,其中在所述原子序列内被执行的任何常规加载操作或常规存储操作对驻留在单个内存行内的内存位置进行操作。
13.—种处理器设备,包括: 核心处理器;以及 与所述核心处理器相关联的内存缓冲区, 所述核心处理器被配置为: 通过执行被设计为启动原子序列并且分配内存缓冲区的操作来启动所述原子序列;以及 通过执行条件存储操作将一个或多个数据字存储在一个或多个内存位置的串接中,所述条件存储操作被设计为对于存储在所述内存缓冲区中的任何数据自动地检查所述内存缓冲区,并且基于检查所述内存缓冲区的结果来存储所述一个或多个数据字。
14.根据权利要求13所述的处理器设备,其中被设计为启动原子序列的所述操作是被设计为启动所述原子序列的加载操作,并且所述核心处理器还被配置为在执行被设计为启动所述原子序列的所述加载操作时加载数据字。
15.根据权利要求14所述的处理器设备,其中所述核心处理器还被配置为通过执行至少一个常规加载操作来加载至少一个数据字。
16.根据权利要求14所述的处理器设备,其中所述核心处理器还被配置为: 通过在所述原子序列内执行一个或多个常规存储操作来将数据存储在所分配的所述内存缓冲区中,其中所述核心处理器还被配置为在通过执行条件存储操作来存储所述一个或多个数据字时,将第二数据字以及与存储在所述内存缓冲区中的数据相关联的一个或多个第一数据字存储在两个或多个内存位置的串接中,所述一个或多个第一数据字和所述第二数据字具有比与所述处理器相关联的数据字宽度更大的累积的宽度。
17.根据权利要求16所述的处理器设备,其中与存储在所述内存缓冲区中的数据相关联的所述一个或多个第一数据字表示基础操作的一个或多个第一实例的一个或多个输出,并且所述第二数据字表示所述基础操作的第二实例的输出,存储在所述两个或多个内存位置的所述串接中的所述一个或多个第一数据字和所述第二数据字表示对应于所述基础操作的宽操作的输出。
18.根据权利要求17所述的处理器设备,所述核心处理器还被配置为在所述原子序列内执行所述基础操作的所述一个或多个第一实例和所述基础操作的所述第二实例。
19.根据权利要求13所述的处理器设备,其中被设计为启动所述原子序列的所述操作将承载静态值的存储寄存器作为目的地。
20.根据权利要求19所述的处理器设备,其中所述核心处理器还被配置为: 通过在所述原子序列内执行一个或多个常规存储操作来将数据存储在所分配的所述内存缓冲区中,其中所述核心处理器还被配置为在通过执行条件存储操作来存储所述一个或多个数据字时,将第二数据字以及与存储在所述内存缓冲区中的数据相关联的一个或多个第一数据字存储在两个或多个内存位置的串接中,所述一个或多个第一数据字和所述第二数据字具有比与所述处理器相关联的数据字宽度更大的累积的宽度。
21.根据权利要求20所述的处理器设备,其中与存储在所述内存缓冲区中的数据相关联的所述一个或多个第一数据字表示基础操作的一个或多个第一实例的一个或多个输出,并且所述第二数据字表示所述基础操作的第二实例的输出,存储在所述两个或多个内存位置的所述串接中的所述一个或多个第一数据字和所述第二数据字表示对应于所述基础操作的宽操作的输出。
22.根据权利要求20所述的处理器设备,其中所述核心处理器还被配置为:在启动所述原子序列之前,执行所述基础操作的所述一个或多个第一实例和所述基础操作的所述第二实例。
23.根据权利要求13所述的处理器设备,其中被设计为启动所述原子序列的所述操作对驻留在单个内存行内的内存位置进行操作。
24.根据权利要求13所述的处理器设备,其中在所述原子序列内被执行的任何常规加载操作或常规存储操作对驻留在单个内存行内的内存位置进行操作。
【文档编号】G06F3/06GK104516686SQ201410521310
【公开日】2015年4月15日 申请日期:2014年9月30日 优先权日:2013年10月3日
【发明者】R·E·凯斯勒, M·S·伯通, C·J·科米斯 申请人:凯为公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1