用于在事务性存储器系统中实现强原子性的方法、装置和系统的制作方法

文档序号:6515722阅读:192来源:国知局
用于在事务性存储器系统中实现强原子性的方法、装置和系统的制作方法
【专利摘要】本申请公开了用于在事务性存储器系统中实现强原子性的方法、装置和系统。在本文中描述了用于提供高效率的强原子性的方法和装置。可将经优化的强原子操作插在非事务性读访问处以提供高效率的强原子性。在非事务性功能的开始将全局事务值复制到本地事务值;这在本质上创建出此全局事务值的本地时戳。在该功能内的非事务性存储器访问处,将计数值或版本值与LTV比较以查看是否有事务已经启动更新存储器位置——或尤其是被访问的存储器位置。如果存储器位置还没有被事务更新,则通过避免要用全套的慢径强原子操作才保证访问到的数据的有效性来令执行加速。反之,可执行慢径操作以解决争用相同存储器位置的事务性和非事务性访问之间的竞争。
【专利说明】用于在事务性存储器系统中实现强原子性的方法、装置和系统
[0001]本发明专利申请是2008年12月30日提交的申请号为200810188987.9,名称为“用于在事务性存储器系统中实现强原子性的机制”的发明专利申请的分案申请。
【技术领域】
[0002]本发明涉及处理器执行领域,具体地涉及指令组的执行。
【背景技术】
[0003]半导体处理和逻辑设计方面的进步已允许集成电路器件上可存在的逻辑量上的增加。结果,计算机系统配置已经从系统中的单个或多个集成电路演进成存在于个体集成电路上的多核及多逻辑处理器。处理器或集成电路一般包括单个处理器管芯,其中该处理器管芯可包括任意数量的核或逻辑处理器。
[0004]集成电路上数量不断增加的核和逻辑处理器使更多的软件线程能够并发执行。然而,可同时执行的软件线程数量上的增加产生了关于使诸软件线程间共享的数据同步的问题。用来访问多个核或多个逻辑处理器系统中的共享数据的一种常用的解决方案包括使用锁来保证对共享数据的多个访问上的互斥。然而,不断增长的执行多个软件线程的能力潜在可能导致错误的竞争和执行的串行化。
[0005]例如,考虑持有共享数据的散列表。利用锁系统,程序员可对整个散列表加锁,从而允许一个线程访问整个散列表。然而,其它线程的吞吐量和性能潜在可能受到不利的影响,因为它们不能访问散列表中的任何项,直到锁被释放。或者,散列表中的每个项可被加锁。然而,这增加了编程复杂度,因为程序员不得不计及散列表内更多的锁。
[0006]另一种数据同步技术包括使用事务性存储器(TM)。通常事务性执行包括投机地执行多个微操作、操作、或指令的编组。在以上的示例中,两个线程皆在散列表内执行,且其访问被监控/跟踪。如果两个线程皆访问/变更相同的项,则这两个事务之一可被中断以解决此冲突。一种类型的事务性执行包括软件事务性存储器(STM),其中访问被跟踪,冲突解决、中断任务、和其它事务性任务以软件方式来执行。
[0007]以前,为了确保事务性存储器操作与非事务性存储器操作之间不发生运行时冲突,编译器将每个非事务性存储器操作视为单个操作事务。换言之,事务性操作被插在非事务性存储器操作处以确保不发生运行时冲突。然而,在非事务性存储器操作处执行周到的屏障潜在可能浪费执行周期。

【发明内容】

[0008]本发明的至少一个方面提出了一种用于在事务性存储器系统中提供强原子性的装置,包括:用于执行多个事务性操作和多个非事务性操作的处理元素单元,其中所述处理元素单元将在功能内执行所述多个非事务性操作中的非事务性加载操作,所述非事务性加载操作在被执行时用于从存储器位置加载;以及与所述处理元素单元相关联的用于确定从所述功能开始起所述存储器位置是否已被更新过的逻辑单元;其中所述处理元素单元响应于确定从所述功能开始起所述存储器位置尚未被更新过而不执行锁操作,所述锁操作在被执行时用于确定与所述存储器位置相关联的元数据位置是否持有解锁值。
[0009]本发明的另一个方面提出了一种用于在事务性存储器系统中提供强原子性的方法,包括:检测功能中的非事务性加载操作,所述非事务性加载操作在被执行时从存储器位置加载;以及响应于在所述功能中检测到所述非事务性加载操作而插入多个强原子性操作,所述多个强原子性操作在被执行时用于确定从所述功能开始起是否已有事务启动更新存储器位置。本发明的另一个方面又提出了一种用于在事务性存储器系统中提供强原子性的方法,包括:在功能中检测非事务性加载操作,所述非事务性加载操作在被执行时用于从存储器位置加载;以及响应于在所述功能中检测到所述非事务性加载操作而插入多个强原子性操作,所述多个强原子性操作在被执行时用于确定从所述功能开始起所述存储器位置是否已被更新过。
[0010]本发明的还有一个方面提出了一种用于在事务性存储器系统中提供强原子性的装置,包括:用于检测功能中的非事务性加载操作的装置,所述非事务性加载操作在被执行时从存储器位置加载;以及用于响应于在所述功能中检测到所述非事务性加载操作而插入多个强原子性操作的装置,所述多个强原子性操作在被执行时用于确定从所述功能开始起是否已有事务启动更新存储器位置。
[0011]本发明的进一步方面提出了一种用于在事务性存储器系统中提供强原子性的装置,包括:用于在功能中检测非事务性加载操作的装置,所述非事务性加载操作在被执行时用于从存储器位置加载;以及用于响应于在所述功能中检测到所述非事务性加载操作而插入多个强原子性操作的装置,所述多个强原子性操作在被执行时用于确定从所述功能开始起所述存储器位置是否已被更新过。
[0012]本发明的还有一个方面提出了一种用于在事务性存储器系统中提供强原子性的系统,包括:用于持有包括多个事务性操作和多个非事务性操作的程序代码的存储器,其中所述多个非事务性操作包括在功能中的非事务性加载操作;以及与所述存储器相关联的处理元素,用于执行所述非事务性加载操作以从与所述存储器中的存储器位置相关联的地址加载,并执行所述多个非事务性操作的多个强原子性操作以确定从所述功能开始起所述存储器位置是否已经被更新过。
[0013]本发明的还有一个方面也提出了一种用于在事务性存储器系统中提供强原子性的方法,包括:在功能开始时将全局事务值复制到本地事务值;执行所述功能中的非事务性加载操作以从存储器位置加载值;以及确定从所述功能开始起已有事务更新多个存储器位置;以及响应于确定从所述功能开始起所述事务已经更新所述多个存储器位置而执行多个慢径操作。
[0014]附图简述
[0015]本发明是藉附图中的各图为示例来示出且并非旨在为其所限定。
[0016]图1示出能够实现高效率的强原子性的系统的实施例。
[0017]图2示出用于提供高效率的强原子性的软件事务性存储器(STM)系统的实施例。
[0018]图3a示出用于提供高效率的强原子性的逻辑的实施例。
[0019]图3b示出用于提供高效率的强原子性的逻辑的另一个实施例。[0020]图4a示出提供强原子性的方法的流程图的实施例。
[0021 ] 图4b示出图4a中描绘的流程图的实施例。
[0022]图4c示出图4a中描绘的流程图的另一个实施例。
【具体实施方式】
[0023]在以下的描述中,陈述了众多具体细节,诸如对事务性执行的具体硬件支持的例子、具体跟踪/元数据方法、处理器中具体类型的本地/存储器、和具体类型的存储器访问和位置等,以便提供对本发明的透彻理解。然而,本领域的技术人员将显然易见的是并非必需要采用这些具体细节才能实践本发明。在其它情况下,没有详细描述公知的组件和方法,诸如在软件中编码事务、事务的划界、具体的多核及多线程处理器架构、事务硬件、高速缓存组织、和微处理器的具体操作细节,以免不必要地混淆本发明。
[0024]正如本文所使用的,值包括数、状态、逻辑状态、或二进制逻辑状态的任何已知表示。通常,使用逻辑电平、逻辑值、或逻辑性值也是指I和0,它简单地表示二进制逻辑状态。例如,I指的是高逻辑电平而O指的是低逻辑电平。然而,也已使用过计算机系统中值的其它表示。例如,十进制数10还可作为二进制值1010和十六进制字母A。
[0025]此外,状态可由值或者值的部分来表示。作为一个例子,加锁状态可由某位置中有第一值——诸如奇数——来表示,而位置中的版本号——诸如偶值——表示解锁状态。在此,可使用第一值和第二值的一部分来表示这些状态,诸如这些值的两个低位,与这些值相关联的符号位、或这些值的其它部分。此外,在一个实施例中,术语复位和置位分别指缺省和更新的值或状态。例如,缺省值可能包括高逻辑值,即复位,而更新值可能包括低逻辑值,即置位。
[0026]本文描述的方法和装置用于在事务性存储器系统中提供强原子性。具体地,主要参考利用基于高速缓存行的冲突检测和基于时戳的一致性的(STM)系统来讨论提供强原子性。然而,这些用于提供强原子性的方法和装置并不被限定于此,因为它们可实现在任何事务性存储器系统上或与其相关联地来实现。
[0027]参照图1,示出了能够在事务性存储器系统中提供经优化的强原子性的多处理元素处理器的实施例。处理元素指的是共享对该处理器的诸如保留单元、执行单元、流水线、和/或上级高速缓存/存储器之类的资源的访问的线程、进程、上下文、逻辑处理器、硬件线程、核、和/或任何处理元素。物理处理器一般指的是潜在可能包括任意数量的诸如核或硬件线程之类的其它处理元素的集成电路。
[0028]核通常指的是位于集成电路上的能够维持独立的架构状态——其中每个独立维持的架构状态与至少某些专用的执行资源相关联——的逻辑。与核形成对比,硬件线程一般指的是位于集成电路上的能够维持独立的架构状态——其中独立维持的架构状态共享对执行资源的访问一的任何逻辑。如图1所示的物理处理器100包括两个核一核101和102,它们共享对上级高速缓存110的访问。此外,核101包括两个硬件线程IOla和101b,而核102包括两个硬件线程102a和102b。因此,诸如操作系统的软件实体潜在可能将处理器100看作四个分别的处理器,而处理器100能够执行四个软件线程。
[0029]正如所能看到的,当某些资源被共享而其它资源被专用于某架构状态时,硬件线程与核的命名体系之间的线索重叠。然而,通常核和硬件线程被操作系统看作个体的逻辑处理器,其中操作系统能够个体地调度每个逻辑处理器上的操作。换言之,软件将物理处理器上的两个核或线程看作两个独立的处理器。另外,每个核潜在可能包括用于执行多个软件线程的多个硬件线程。因此,处理元素包括上述能够维持上下文的元素一诸如核、线程、硬件线程、虚拟机、或其它资源一中的任何元素。
[0030]在一个实施例中,处理器100是能够并行执行多个线程的多核处理器。在本此,第一线程与架构状态寄存器IOla相关联,第二线程与架构状态寄存器IOlb相关联,第三线程与架构状态寄存器102a相关联,而第四线程与架构状态寄存器102b相关联。在一个实施例中,对处理器100中的处理元素的引述包括对核101和102以及线程101a、101b、102a和102b的引述。在另一个实施例中,处理元素指的是在处理域的阶层体系中在同一级上的元素。例如,核101和102处于同一域级,而线程101a、101b、102a和102b处于同一域级,因为它们全都包括在核的域内。
[0031]尽管处理器100可以包括不对称核,即具有不同配置、功能单元和/或逻辑的核,但示出了对称核。结果,将不对示为等同于核101的核102进行详细讨论,以免混淆本讨论。
[0032]如所示,架构状态寄存器IOla被复制在架构状态寄存器IOlb中,如此使得能够为逻辑处理器IOla和逻辑处理器IOlb存储个体的架构状态/上下文。还可为线程IOla和IOlb复制诸如指令指针和重命名分配器逻辑130中的重命名逻辑之类的其它较小的资源。诸如重排序器/退役单元135中的重排序缓冲器、ILTB120、加载/存储缓冲器、和队列之类的某些资源可通过划分来共享。诸如通用内部寄存器、页表基址寄存器、下级数据高速缓存和数据TLB115、执行单元140、和脱序单元135部分之类的其它资源潜在可能被全共享。
[0033]总线接口模块105用于与处理器100外部的设备,诸如系统存储器175、芯片组、北桥、或其它集成电路通信。存储器175可被专用于处理器100或与系统中的其它设备共享。存储器175的例子包括动态随机存取存储器(DRAM)、静态RAM (SRAM)、非易失性存储器(NV存储器)、和长期存储。
[0034]典型的总线接口单元105包括输入/输出(I/O)缓冲器,用以在互连170上传送和接收总线信号。互连170的例子包括射电收发器逻辑(GTL)总线、GTL+总线、双倍数据率(DDR)总线、泵式总线(pumped bus)、差分总线、高速缓存相干总线、点对点总线、多站总线或其它已知的实现任何已知的总线协议的互连。如图所示的总线接口单元105还用于与上级高速缓存110通信。
[0035]上级的或远端高速缓存110用于高速缓冲近期取回和/或操作过的元素。注意,上级或远端指的是高速缓存层级增加或更远离执行单元。在一个实施例中,上级高速缓存110是二级数据高速缓存。然而,上级高速缓存110并不被限定于此,因为它可以是也被称为踪迹高速缓存的指令高速缓存或包括指令高速缓存。踪迹高速缓存可代替地耦合在解码器125之后以存储近期的解码踪迹。模块120还潜在可能包括用于预测将被执行/取道的分支的分支目标缓冲器和用于存储指令的地址翻译项的指令-翻译缓冲器(Ι-TLB)。在此,能够进行投机执行的处理器潜在可能预取回并投机执行预测出的分支。
[0036]解码模块125耦合到取回单元120以解码取回的元素。在一个实施例中,处理器100与定义/规定处理器100上可执行的指令的指令集架构(ISA)相关联。在此,通常由ISA认可的机器代码指令包括被称为操作码的一部分指令,其参引/规定待执行的指令或操作。[0037]在一个示例中,分配器和重命名器版块130包括分配器以保留诸如用于存储指令处理结果的寄存器堆之类的资源。然而,线程IOla和IOlb潜在可能是能够进行脱序执行的,在其中分配器和重命名器版块130还保留其它资源,诸如用于跟踪指令结果的重排序缓冲器。单元130还可包括寄存器重命名器,以将程序/指令参引寄存器重命名成处理器100内部的其它寄存器。重排序器/退役单元135包括诸如上面提及的重排序缓冲器、加载缓冲器、和存储缓冲器之类的组件,以支持脱序执行以及脱序执行了的指令稍后的按序退役。
[0038]在一个实施例中,调度器和执行单元版块140包括调度器单元以调度执行单元上的指令/操作。事实上,指令/操作潜在可能根据其类型可用性在执行单元上被调度。例如,浮点指令被调度在具有可用的浮点执行单元的执行单元的端口上。还包括与执行单元相关联的寄存器堆,以存储信息指令处理结果。示例性执行单元包括浮点执行单元、整型执行单元、跳变执行单元、加载执行单元、存储执行单元、和其它已知的执行单元。
[0039]下级数据高速缓存和数据翻译缓冲器(D_TLB)150耦合到执行单元140。该数据高速缓存用于存储近期使用/操作过的、潜在可能被保持在存储器相干性状态——诸如修改的、排他的、共享的、和无效的(MESI)状态——的元素,诸如数据操作数。D-TLB用于存储近期的虚拟/线性至物理地址翻译。作为一个具体的例子,处理器可能包括页表结构以将物理存储器分成多个虚拟页。数据高速缓存150可用作事务性存储器或其它存储器,以如以下更详细讨论的那样在事务的执行期间跟踪试探性访问。此外当利用STM系统跟踪试探性访问时,软件表/数据可被持有在系统存储器175中并被高速缓冲在下级高速缓存150中。
[0040]也可被称为临界代码段的事务包括可由硬件、软件、固件、或其组合编组起来的指令、操作或微操作编组。例如,指令或操作可被用于对事务或临界段进行划界。一般地,在事务的执行期间,并不令对存储器的更新全局可见,直到该事务被提交。在事务仍未决时,跟踪存储器中加载自和写至的位置。一旦成功地确认这些存储器位置,事务就被提交,并且令在该事务期间作出的更新全局可见。
[0041]然而,如果事务在其未决期间被无效,则不令这些更新全局可见地即重启该事务。结果,正如本文所使用的事务的未决指的是已经开始执行但尚未被提交或中断——即未决中的事务。事务性执行的示例实现包括硬件事务性存储器(HTM)系统、软件事务性存储器(STM)系统、及其组合。
[0042]硬件事务性存储器(HTM)系统通常指的是以处理器100的硬件来跟踪与处理器100间的事务的执行期间的访问。例如,高速缓存150高速缓冲来自系统存储器175的数据项/对象。在事务的执行期间,利用与高速缓存150中持有该数据对象的高速缓存行相关联的注解/属性字段来跟踪去往和来自此高速缓存行的访问。在一个实施例中,注解字段包括读存储单元和写存储单元。每个存储单元逢相应的读或写而被置位,以指示在事务的未决期间是否已发生读或写。
[0043]软件事务性存储器(STM)系统通常指的是以软件或至少部分地以软件来执行访问跟踪、冲突解决、或其它事务性存储器任务。作为一般化的示例,编译器在被执行时编译程序代码以相应地为作为此程序代码内的事务的一部分的加载和存储操作插入读和写屏障。编译器还可插入其它事务或非事务相关操作,诸如提交操作、中断操作、簿记操作、冲突检测操作、和强原子性操作。[0044]如上所述,以往非事务性存储器操作在提供事务性和非事务性代码之间的隔离的强原子系统中被作为单个事务来对待。通常,编译器在非事务性存储器访问处插入操作以确保强原子性,即确保事务性和非事务性存储器操作之间的有效性。以往的插在非事务性存储器访问操作处以确保强原子性的操作的例子包括诸如测试操作之类的锁操作,以确定锁是否指示存储器位置可用/无主。然而,在一个实施例中,插入数量减少的强原子性操作以在不执行诸如锁操作之类的某些慢径(slowpath)操作来确定锁是否可用的情况下保证有效性。以下讨论提供高效率的强原子性的更多细节。
[0045]参照图2,描绘了 STM系统的简化说明性实施例。数据对象201包括任何粒度的数据,诸如字、数据元素/操作数、指令、存储器行、高速缓存行、编程语言定义的对象、编程语言定义的对象的字段、表、散列表、或任何其它已知的数据结构或对象。在一个实施例中,参引数据对象201或与之相关联的地址——诸如物理或虚拟地址——被散列以索引到锁/元数据位置阵列/表中,诸如元数据阵列240。作为一个具体示例,地址的数个低位被掩掉然后被散列以索引到锁阵列240中。在此,将数据对象201说成是与高速缓存行215相关联,因为高速缓存行215用于持有/高速缓冲数据对象201。此外,还将数据对象201说成是与元数据位置250相关联,因为是利用参引数据对象201或位置250的地址来索引到表240中位置250处。
[0046]通常,持有在元数据位置250中的值指示数据对象201是加锁的还是可用的。在一个实施例中,当数据对象201是加锁的时,元数据位置250包括第一值以表示加锁状态,诸如读/写有主状态252。然而,可在元数据位置250中使用和表示任何的锁或者锁状态。当解锁或可用时,元数据位置250包括第二值以指示解锁状态。在一个实施例中,第二值用于表示版本号251。在此,逢有对数据对象201的写,版本号251就被更新,诸如递增,以跟踪数据对象201的当前版本。
[0047]读/加载操作被记录在读日志265中,而写/存储操作被缓冲或记录在写空间270中。这种日志记录/缓冲通常被称为屏障操作,因为它们通常提供待执行的用于确认事务性读或写操作的障碍物。在一个实施例中,将读记入日志包括在读日志265中更新或创建具有与版本号251相关联的地址266的表示的项。在此,读日志265可类似于具有地址266的基于地址的查找表,地址266可以是参引数据对象201的、与对应的版本号251相关联的地址的线性、虚拟、物理或其它部分。注意,读日志265可以是将被持有在系统存储器中并被高速缓冲在高速缓存205中的数据对象,诸如数据对象201。
[0048]在一个实施例中,对数据对象201的写是用新值更新高速缓存行215,且旧值272被持有在写空间270中。一旦提交此事务,写日志270中的旧值就被丢弃且令试探值全局可见,而反之,一旦中断此事务,旧值就被复原到原始位置以盖写试探性持有的值。通常,这种类型的软件事务性存储器(STM)系统被称为写日志STM或就地(in-place)更新STM,因为写空间270类似于写日志那样来持有旧值,而试探性事务值是被“就地更新”的。
[0049]在另一个实施例中,对数据对象201的写被缓冲在类似于写缓冲器的写空间270中,而旧值仍持有在其原始位置中。在此,写缓冲器270持有要被写到位置215的试探性事务值。一旦中断此事务,持有在写缓冲器270中的试探值就被丢弃,反之,一旦提交此事务,试探值就被复制到相应的存储器位置以盖写旧值。通常这种类新的软件事务性存储器(STM)系统被称为写缓冲STM,因为写空间270类似于写缓冲器,且试探性事务值被缓冲/持有在写空间270中。
[0050]注意,写空间270可包括任何存储区。在一个实施例中,写空间270是上级存储器,诸如二级闻速缓存或系统存储器。在另一个实施例中,与空间270可以是持有在寄存器或其它的存储器位置中的单独的写空间。写空间270可类似于具有与记入日志的老值或缓冲的试探性值相关联的地址的查找表。在又一个实施例中,写空间270可包括持有在上述存储区域中的任何区域或单独的存储区域中的程序栈或单独的栈存储器。
[0051]然而,不管是将写空间270用作缓冲试探性值的写缓冲器还是记录旧值的写日志,写在被提交时都释放锁250。在一个实施例中,释放锁250包括将元数据位置250返回到表示解锁或无主状态的值。这个值是通过递增全局时戳来获得的。该时戳计数已经完成执行——即提交或中断——的事务的数目。这种版本化允许其它事务能通过将其它这些事务在其读日志中记录的版本值与当前版本值251进行比较来确认其加载数据对象201的读。
[0052]以上的例子包括实现STM的一个实施例;然而,可以使用STM的任何已知的实现。事实上,还可使用任何已知用于执行事务性存储器的系统,诸如HTM、STM、无界事务性存储器(UTM)系统、混合事务性存储器系统,诸如硬件加速STM (HASTM)、或任何其它事务性存储器系统。例如,可利用诸如注解位之类的HTM特征来加速STM,诸如将其基于对高速缓存行的访问来置位/复位,软件可解释和利用其来加速高速缓冲行层级上的事务性跟踪/冲突检测。
[0053]如上所述,在被执行时编译程序或应用代码的编译器可在事务性存储器访问处插入事务性操作,这些事务性操作在被执行时执行读和写屏障功能。速度屏障操作的例子包括:计算编入锁表240的索引以确定位置250,测试以查看元数据位置250是否持有无主版本值,以及在读日志265中记录此版本值。
[0054]在一个实施例中,高效率的强原子性操作被插在非事务性存储器访问处以执行经优化的读屏障功能来提供强原子性,即确保有效的非事务性存储器访问。作为一个例子,强原子性操作在被执行时用于确定要由该非事务性读访问来访问的存储器位置从功能开始起是否已经被更新。为了说明,强原子性操作被插在每个功能的开始处。强原子性操作在被执行时用于制作全局事务值(GTV)的本地副本。
[0055]GTV响应于结束事务而被递增。在一个实施例中,在GTV被递增后,新的GTV值就被用作无主版本值以释放锁。换言之,GTV跟踪/指示最新或最近期中断/提交的事务,这通常导致GTV被称为最近期事务值。结果,GTV在诸如功能开始之类的特定时间的副本可被称为时戳,因为它提供了 GTV在功能开始处的快照。因此,在以上讨论的实施例中,在功能的开始,制作GTV的副本。在此被称为本地事务值的这一本地副本指示在复制/移动即功能开始时更新存储器位置的最新事务。
[0056]在一个实施例中,插在功能内的非事务性存储器访问处的强原子性操作在被执行时用于将LTV同与作为执行此非事务性存储器读操作的结果要被访问的存储器位置相关联的版本值进行比较。在此,如果版本值大于LTV,则该存储器位置从此功能的开始起已被更新过。换言之,从GTV被复制为LTV的时间起,已有事务结束了,GTV已被递增,且新的GTV已作为新版本被写到与此存储器位置相关联的锁位置。因此,当版本大于LTV时,确定至少已发生了以上的更新过程。反之,如果版本值等于或小于LTV,则存储器位置从功能的开始起还未被更新过。在一个实施例中,锁位置在其被加锁时存储最高位被置位的值,而所有的版本号(以及GTV中的值)的最高位总是不置位的。为了防止GTV因有很多提交事务之故而溢出,可使用较大的值,诸如64位值。
[0057]为了说明,假设功能中的非事务性存储器操作包括用于从高速缓存行215加载的加载操作。在此功能的开始,在本示例中以十进制值10起始的GTV响应于执行第一强原子操作而被复制作为LTV。随着执行继续,假定事务在提交期间更新高速缓存行215,将GTV递增到十进制值12,并利用递增了的GTV值12释放与行215相关联的锁250。当遇到此非事务性加载时,执行第二强原子操作以将LTV与持有在元数据位置250中的当前版本进行比较。因为元数据位置250先前已被更新为12且LTV持有值10,于是确定从此功能开始起行215已被更新过。因此,可响应于确定待访问的位置已经被更新过而采取任何数量的动作,诸如执行慢径——即特强原子性屏障——操作,以确保此非事务性加载操作的有效性。
[0058]在另一个实施例中,插在非事务性存储器访问处的强原子性操作在被执行时用于将LTV值与指示已经启动的事务数的计数值进行比较。换言之,在此,并不去确定该特定的存储位置从功能的开始起是否已经被更新过,而是确定从功能的开始起是否有任何事务已经启动更新任何存储器位置。事务计数器响应于事务开始和/或事务开始更新存储器位置而被递增。例如,在写缓冲STM中,计数器在事务到达提交点并启动更新存储器位置时被递增。作为另一个例子,在写日志或就地更新STM中,计数器在事务启动时被递增。
[0059]利用以上例子,在包括非事务性加载操作的功能的开始处,值为10的GTV被复制作为LTV,且启动事务计数器初始也持有值10。在此,当另一个事务开始或启动更新存储器位置时,取决于实现,启动事务计数器就被递增,即从值10递增至11。然而,在本实施例中,第二强原子性操作在被执行时用于将LTV与此启动事务计数器进行比较。当此计数器等于或小于LTV时,则确定此非事务性加载有效,即从该功能开始起,尚无事务更新存储器位置。
[0060]然而,如在本示例中那样,当启动事务计数器值即11大于LTV即10时,则确定从该功能开始起存储器位置已被更新过,即从该功能开始起已有事务启动更新存储器位置。如上,可响应于确定从该功能开始起存储器位置已被更新过而采取任意数量的动作,诸如执行慢径操作、执行处理程序、和/或利用保证数据有效性的另一种方法。
[0061]转到图3a,示出了用于提供高效率的强原子性的逻辑的实施例。在一个实施例中,图3a中示出的逻辑被包括在集成电路中,诸如包括在微处理器中。处理元素301和302包括上面提及的任意处理元素,诸如硬件线程、核、或其它逻辑处理器/处理元素。存储元素305用于持有全局事务值(GTV)。注意,存储元素包括用于持有值的任意存储区域,诸如寄存器、存储器位置、高速缓存位置、栈位置、或其它存储区域。例如,存储元素305包括用于持有GTV的寄存器。在另一个实施例中,程序栈位置用来持有GTV。
[0062]在要于PE301上执行的功能的开始,响应于执行操作351,将把GTV的副本持有在存储元素301b中作为本地事务值(LTV)。如上,存储元素301b可包括任意存储元素/区域,诸如寄存器、存储位置、高速缓存位置、栈位置、或其它存储区域。注意,存储元素301b示出在PE301内;然而存储元素301b可按任何方式与PE301相关联。例如,存储元素301b可以是与PE301相关联的寄存器组中的寄存器或与处理元素301相关联的程序栈位置。尽管没有细述,但所讨论的存储元素302b以与存储元素301b相似的方式工作。如所示,元素301b和302b是分开的;然而,它们可物理地位于同一设备或存储区域中并且相应地与PE301和302相关联。GTV还可被称为最近期事务值,即指示最新中断/提交的事务,或被称为全局时戳,即指示在特定的时间点提交/中断了的事务或事务数。如所示,操作351本质上是拍下持有在存储元素305中的GTV在功能执行开始时的快照。
[0063]操作352包括非事务性加载操作,即不被包括在临界事务段中的加载操作,该加载操作在被执行时用于从高速缓存行310加载。处理元素302执行导致对高速缓存行310更新的事务性操作353,诸如提交操作、中断操作、和/或存储操作。在一个实施例中,在事务的提交或中断处,持有在存储元素305中的GTV被更新/递增。新递增的GTV可被用作版本号来更新与高速缓存行310相关联的元数据位置315。
[0064]从上文注意到,作为例子,可通过对与行310相关联的地址的至少一部分使用散列函数以索引到元数据位置表内的元数据位置315,来将元数据位置315与高速缓存行310相关联。同样,在一个实施例中,位置315中的版本号指示高速缓存行310是解锁/无主的。或者,高速缓存行310响应于在位置315中持有加锁/有主值而被加锁。作为一个例子,通过在位置315的最高有效位(MSB)位置中持有逻辑I来在位置315中指示加锁/有主值,而通过在位置315的MSB位置中持有逻辑O来指示版本号。
[0065]在操作354,比较逻辑320将元数据位置315中持有的锁值与从功能开始起持有在LTV存储区域310b中的GTV305副本比较。如果持有在位置315中的值小于或等于310b中的LTV,即指示持有在位置315中的版本——并且相关联地还有存储器位置310从GTV305被复制到LTV存储元素310b中起尚未被更新过,则执行正常继续。当确定此访问有效时,该执行流程不执行更多外加的外部操作即继续进行。
[0066]反之,如果持有在元数据位置315中的值大于持有在存储元素310b中的LTV,则确定从GTV被高速缓冲在LTV存储元素301b中起存储器位置310已被更新过。注意,在其中加锁值包括持有在位置315的MSB位置中的逻辑I的实施例中,加锁值将大于被用作版本号来更新位置315的任何GTV,因为版本号在MSB位置中包括O。因此,在一个实施例中,确定从位置315持有加锁值的时间到元数据位置315被更新为更大的版本值的时间位置310已被更新过。
[0067]响应于持有在位置315中的锁值大于持有在存储元素301b中的LTV,可采取任何数量的强原子性解决动作。作为一个例子,可执行一组慢径操作以确保有效的非事务性存储器访问。慢径操作可包括其它更谨慎的操作,诸如在执行访问前对锁可用性的测试/检查。作为另一个例子,可利用其它竞争解决算法,诸如执行处理程序或中断正在争用此存储器位置的事务。
[0068]作为演示操作实施例的过于简化的说明性示例,GTV305初始持有GTV0001 (十进制值I ),且元数据位置315也包括版本0001。在功能的开始,GTV值0001被复制到LTV存储元素301b。执行从行310进行的非事务性加载。另外,正由PE302执行的事务提交,这导致GTV305被递增到0010 (十进制值2)。在此事务执行期间,位置315被转移到诸如1000(十进制值8)的锁值,并且行310被更新。此外,在更新后,当释放此锁时,新的GTV值0010作为新版本被存储在元数据位置315中。当比较逻辑320将持有在元数据位置315中的锁值与LTV301b进行比较时,锁值不但在锁被持有时大于LTV301b即1000>0001,而且在版本被更新之后亦是如此,即0010>0001。结果,强原子性解决可得以执行,诸如执行慢径操作。[0069]转到图3b,示出了用于提供高效率的强原子性的模块的另一个实施例。在此,操作351-353以与参考图3a所讨论的类似方式工作。然而,在操作354中,比较逻辑320是将LTV301b与持有在启动事务计数器330中的事务计数值进行比较。在一个实施例中,事务计数值330是响应于启动事务而被递增。在另一个实施例中,事务计数器330是响应于事务启动更新存储器位置而被递增。在更新就地STM中,更新在事务新存储执行时发生/开始。因此,计数器330将在该点被递增。然而,在写缓冲STM中,计数器330是在事务提交——即存储器更新开始时被递增。
[0070]如果计数器330小于或等于LTV301b,则尚无事务启动更新存储器位置,且执行可正常继续。然而,如果计数器330大于LTV301b,则已有事务启动更新存储器位置。因此,可执行其它较慢路径操作。例如,通过比较LTV和计数器值,可优化或避免其它操作,诸如计算所访问的存储器位置、进入元数据位置的散列值、以及持有在元数据位置中的版本值。因此,如果计数值大于LTV,即指示存储位置已经被更新过,则可比较版本以确定所访问的存储器位置是否已经被更新过。此外,可执行任何其它的慢径指令或操作。
[0071]作为演示操作实施例的过于简化的说明性示例,GTV305初始持有GTV0001 (十进制值1),且计数器330包括事务值0001。在功能开始,GTV值0001被复制到LTV存储元素301b。执行从行310进行的非事务性加载。另外,正由PE302在写缓冲STM中执行的事务提交,这导致计数器330被递增到0010。当比较事务值0010和LTV值0001时,事务值较大,这指示已有事务更新过存储器位置。注意,在此,事务或许并不更新存储器位置310。因此,比较逻辑320可如上所讨论地有条件地将版本与LTV比较以明确地确定该事务是否已经更新存储器位置310。
[0072]接下来参照图4a,示出了提供高效率的强原子性的方法的流程图的实施例。此外,如上所讨论的,编译器在被执行时用于编译应用/程序代码。在编译期间,可插入事务性操作,诸如读屏障、写屏障、提交操作、和中断操作。另外,可插入非事务性强原子性操作,它在被执行时用于执行以上和/或以下参考图4a_4c描述的操作/功能。
[0073]在流程405中,全局事务值(GTV)在功能开始被复制到本地事务值(LTV)。在一个实施例中,GTV是响应于事务提交和中断而被递增/更新的全局时戳。作为一个例子,在被执行时用于执行复制/移动的强原子性操作被插在非事务性功能的开始。
[0074]接下来,在流程410中,执行此功能内所包括的非事务性加载操作以从存储器位置加载。在流程415,确定从此功能开始起是否已有事务更新过存储器位置。如果从此功能开始起尚未有事务更新过存储器位置,则确定此加载有效且在流程425中正常地继续执行。反之,如果从此功能开始起事务已经更新过存储器位置,则在流程420执行慢径操作。注意,慢径操作可包括任何用于确保非事务性加载的有效性的解决操作,包括检查、测试、和/或在锁上空转(spinning) /等待、计算版本、检查版本尚未被改变、和/或再次执行此非事务性加载。
[0075]图4b示出用于确定从图4a的功能开始起已有事务更新过存储器位置的流程图的实施例。流程405、410、420、和425与图4a中同样的流程相似。然而,在流程416中,与加载自的存储器位置相关联的事务记录值被确定。在一个实施例中,参引此存储器位置的地址的至少一部分被散列到事务记录表中。从与存储器位置相关联的事务记录来确定此事务记录值。在流程417,将此事务记录值与在流程405中从GTV复制的本地事务值进行比较。在一个实施例中,全局事务值(GTV)响应于有事务被提交/中断而被递增。另外,用新递增的GTV更新此事务记录值以释放由正在提交的事务拥有的存储器位置上的锁。
[0076]因此,如果事务记录值小于或等于LTV,则确定从此功能开始起该存储器位置尚未被更新过,且在流程425执行正常继续。然而,如果事务记录值大于LTV,则确定从GTV被高速缓冲为LTV起——即从此功能开始起——该存储器位置已经被更新过。在此,执行慢径指令/操作以确保该非事务性加载的有效性,诸如检查事务记录、在事务记录上空转/等待其变成解锁/无主的、获取事务记录的所有权、和/或再次执行该非事务性访问。
[0077]转到图4c,示出了确定从功能开始起存储位置是否已被更新的方法的流程图的另一个实施例。在此,是在流程412在有事务启动更新存储器位置时递增全局启动计数器。在写缓冲STM中,是在提交时更新位置,所以启动事务计数器将在事务的提交时被递增。然而,在就地更新STM中,存储器位置是在事务的执行期间试探性地更新的,所以计数器可响应于启动事务或在遇到第一个事务性存储时被递增。注意,计数器可被递增整数或其倍数。例如,如果版本号包括偶数,且有主值包括奇数,则计数器可被递增偶倍数以与版本或GTV相符。
[0078]在流程418中,将启动计数器值与本地事务值(LTV)进行比较。因此确定从LTV最近被更新一即功能开始起是否已有任何事务启动更新存储器位置。注意,被访问的特定存储位置或许尚未被更新;然而,有事务已经启动更新存储位置。在此,在流程420执行慢径操作时,以类似于图4b所示的方法来比较版本,以确定特定的存储器位置是否已经被更新。然而,可替换地或补充地执行确保非事务性加载的有效性的其它操作。
[0079]如上所示,可插入经优化的强原子性操作,这些操作在被执行时用于为非事务性读访问提供高效率的强原子性。对每个非事务性加载周到的屏障操作潜在可能被避免以加速非事务性加载在事务性存储器系统中的执行。此外,可利用多级进取性执行的组合。例如,可仅确定是否已有另一个事务启动了就来执行非事务性访问,而不是非得计算版本值。如果尚无事务开始更新存储器位置,则不是非得执行周到的簿记也能继续执行。然而,如果存储器位置已经被更新,则可计算版本并将其与本地时戳进行比较以确定特定存储位置是否已经被更新。因此,通过避免在锁上检查/空转仍可一定程度地加速执行。此外,如果存储器位置已经被更新,则可执行以往的全强原子性操作即较慢的指令路径,以确保事务性与非事务性存储器访问之间的数据有效性。
[0080]上述的方法、软件、固件或代码集的实施例可经由存储在机器可访问或机器可读介质上的、可由处理元素执行的指令或代码来实现。机器可访问/可读介质包括任何提供(即,存储和/或传送)诸如计算机或电子系统之类的机器可读形式的信息的机制。例如,机器可访问介质包括:随机存取存储器(RAM),诸如静态RAM (SRAM)或动态RAM (DRAM)5ROM ;磁或光存储介质;闪存设备;电、光、声或其它形式的传播信号(例如,载波、红外信号、数字信号)等。
[0081]在本说明书全文中对“一个实施例”或“一实施例”的引述表示结合该实施例描述的特定特征、结构、或特性包括在本发明的至少一个实施例中。因此,在本说明书全文中各处出现的短语“在一个实施例中”或“在一实施例中”不一定全指同一实施例。此外,这些特定的特征、结构、或特性可以按任何适当的方式在一个或更多个实施例中被组合。
[0082]在以上的说明书中,已参考具体的示例性实施例给出了详细的描述。然而,显然可对其进行各种修改和改变而不会脱离所附权利要求书中阐述的本发明的更宽的精神和范围。因此本说明书和附图应在说明性的意义而不是限制性的意义上来对待。此外,上文对实施例和其它示例性语言的使用不一定指相同的实施例或相同的示例,而是既可指不同的和区别的实施例也可指潜在可能相同的实施例。
【权利要求】
1.一种方法,包括: 检测功能中的包括多个存储器操作的非事务性加载操作,所述非事务性加载操作从多个存储器位置中的第一存储器位置加载; 在所述功能中插入第一原子性操作以将全局事务值的副本存储为本地事务值(LTV); 插入第二原子性操作以将所述LTV与事务计数器值进行比较以确定事务在所述功能开始之后是否已更新了所述多个存储器位置中的任意存储器位置,当任意存储器位置被更新时所述事务计数器递增;以及 当所述事务计数器值与所述LTV的比较指示所述事务在所述功能开始之后已更新了所述多个存储器位置中的至少一个存储器位置时,插入第三原子性操作以分析与所述存储器位置中的所述第一存储器位置相关联的版本值,以确定所述存储器位置中的所述第一存储器位置在所述功能开始之后是否被更新,其中所述第一和第二原子性操作不包括锁操作,所述锁操作用于确定与所述存储器位置中的所述第一存储器位置相关联的锁是否是无主的。
2.如权利要求1所述的方法,其特征在于,还包括:响应于确定所述事务在所述功能开始之后已更新所述存储器位置中的至少一个存储器位置,插入所述锁操作以供执行。
3.如权利要求1所述的方法,其特征在于,所述第一原子性操作用于更新用于保持所述LTV的寄存器。
4.一种方法,包括: 在功能中检测非事务性加载操作,所述非事务性加载操作用于从多个存储器位置中的第一存储器位置加载;以及 响应于在所述功能中检测到所述非事务性加载操作,通过以下步骤确定所述多个存储器位置中的任意存储器位置在所述功能开始之后是否已被更新: 在所述功能中插入第一原子性操作以利用与全局事务值相对应的本地事务值(LTV)来更新寄存器; 插入第二原子性操作以将与所述多个存储器位置相关联的事务计数器值与所述LTV进行比较,当所述存储器位置中的任意存储器位置被更新时所述事务计数器值会递增;以及 当所述事务计数器值大于所述LTV时,插入第三原子性操作以分析与所述存储器位置中的所述第一存储器位置相关联的版本值,以确定所述存储器位置中的所述第一存储器位置在所述功能开始之后是否已被更新,其中所述第三原子性操作包括: 第一版本操作,用于获得与所述存储器位置中的所述第一存储器位置相关联的地址;以及 第二版本操作,用于计算编入事务记录表中的事务记录中的索引以获得所述版本值。
5.如权利要求4所述的方法,其特征在于,所述事务记录用于保持加锁值以指示所述存储器位置中的所述第一存储器位置为有主的,并用于保持所述版本值以指示所述存储器位置中的所述第一存储器位置为无主的,且其中所述加锁值包括在所述事务记录的最高有效位(MSB)中的逻辑I,且所述版本值包括在所述事务记录的所述MSB中的逻辑O。
6.如权利要求4所述的方法,其特征在于,所述第二原子性操作用于: 如果所述事务计数器值大于所述LTV,则确定所述存储器位置中的至少一个存储器位置在所述功能开始之后已被更新;以及 如果所述事务计数器值小于或等于所述LTV,则确定所述存储器位置中没有存储器位置在所述功能开始之后被更新。
7.一种系统,包括: 存储器,用于保持包括多个非事务性操作的程序代码,其中所述多个非事务性操作包括在功能中的非事务性加载操作;以及 与所述存储器通信的处理逻辑电路,用于执行所述非事务性加载操作以从与所述存储器中的多个存储器位置中的第一存储器位置相关联的地址加载,并用于执行所述多个非事务性操作中的多个原子性操作以确定所述存储器位置中的所述第一存储器位置在所述功能开始之后是否已被更新,所述多个原子性操作包括: 第一原子性操作,用于将全局事务值高速缓存为本地事务值(TLV); 第二原子性操作,用于将与所述多个存储器位置相关联的事务计数器值与所述LTV进行比较,以确定所述多个存储器位置中的至少一个存储器位置在所述功能开始之后是否被更新;以及 第三原子性操作,用于在所述第二原子性操作的结果指示所述多个存储器位置中的所述至少一个存储器位置被更新时,分析与所述多个存储器位置中的所述第一存储器位置相关联的版本值以确定所述存储器位置中的所述第一存储器位置在所述功能开始之后是否被更新,其中所述第一和第二原子性操作不包括锁操作,所述锁操作用于确定与所述存储器位置中的所述第一存储器位置相关联的锁是否是无主的。
8.如权利要求7所述 的系统,其特征在于,所述处理逻辑电路用于:如果所述事务计数器值大于所述LTV,则执行与所述多个非事务性操作相关联的多个慢径操作;如果所述事务计数器值小于或等于所述LTV,则不执行所述多个慢径操作。
9.一种方法,包括: 在功能开始时将全局事务值复制到本地事务值(LTV); 执行所述功能中的非事务性加载操作以从多个存储器位置中的所选的一个存储器位置加载值; 基于事务计数值与所述LTV的比较,确定事务从所述功能开始起是否已更新了所述多个存储器位置中的至少一个存储器位置;以及 如果所述事务从所述功能开始起已更新了所述多个存储器位置中的至少一个存储器位置,则分析与所述存储器位置中的所选的所述一个存储器位置相关联的版本值,其中分析所述版本值包括: 获得与所述存储器位置中的所选的所述一个存储器位置相关联的地址;以及 计算编入事务记录表中的事务记录中的索引以获得所述版本值。
10.如权利要求9所述的方法,其特征在于,确定所述事务从所述功能开始起是否已更新了所述多个存储器位置中的所述至少一个存储器位置包括: 如果所述事务计数器值大于所述LTV,则确定所述事务从所述功能开始起已更新了所述多个存储器位置中的所述至少一个存储器位置;以及 如果所述事务计数器值小于或等于所述LTV,则确定所述事务从所述功能开始起未更新所述多个存储器位置中的所述至少一个存储器位置。
11.如权利要求9所述的方法,其特征在于,所述版本值被保持在元数据位置,所述元数据位置通过与所述存储器位置中的所选的所述一个存储器位置相关联的地址的至少一部分的散列值来引用。
12.如权利要求9所述的方法,其特征在于,确定所述事务从所述功能开始起是否已更新了所述多个存储器位置中的所述至少一个存储器位置包括: 响应于开始所述事务,更新所述事务计数器值; 将所述LTV与所述事务计数器值进行比较; 如果所述事务计数器值等于所述LTV,则确定所述事务从所述功能开始起未更新所述多个存储器位置中的所述至少一个存储器位置;以及 如果所述事务计数器值大于所述LTV,则确定所述事务从所述功能开始起已更新所述多个存储器位置中的所述至少一个存储器位置。
【文档编号】G06F9/46GK103544054SQ201310487913
【公开日】2014年1月29日 申请日期:2008年12月30日 优先权日:2007年12月30日
【发明者】B·萨哈, A-R·阿德尔-塔巴塔拜, C·王, T·史佩斯曼 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1