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

文档序号:6468953阅读:176来源:国知局
专利名称:用于在事务性存储器系统中实现强原子性的机制的制作方法
用于在事务性存储器系统中实现强原子性的机制
领域
本发明涉及处理器执行领域,具体地涉及指令组的执行。
背景
半导体处理和逻辑设计方面的进步已允许集成电路器件上可存在的逻辑 量上的增加。结果,计算机系统配置已经从系统中的单个或多个集成电路演进 成存在于个体集成电路上的多核及多逻辑处理器。处理器或集成电路一般包括 单个处理器管芯,其中该处理器管芯可包括任意数量的核或逻辑处理器。
集成电路上数量不断增加的核和逻辑处理器使更多的软件线程能够并发 执行。然而,可同时执行的软件线程数量上的增加产生了关于使诸软件线程间 共享的数据同步的问题。用来访问多个核或多个逻辑处理器系统中的共享数据
的一种常用的解决方案包括使用锁来保证对共享数据的多个访问上的互斥。然 而,不断增长的执行多个软件线程的能力潜在可能导致错误的竞争和执行的串 行化。
例如,考虑持有共享数据的散列表。利用锁系统,程序员可对整个散列表 加锁,从而允许一个线程访问整个散列表。然而,其它线程的吞吐量和性能潜 在可能受到不利的影响,因为它们不能访问散列表中的任何项,直到锁被释放。 或者,散列表中的每个项可被加锁。然而,这增加了编程复杂度,因为程序员 不得不计及散列表内更多的锁。
另一种数据同步技术包括使用事务性存储器(TM)。通常事务性执行包 括投机地执行多个微操作、操作、或指令的编组。在以上的示例中,两个线程 皆在散列表内执行,且其访问被监控/跟踪。如果两个线程皆访问/变更相同的 项,则这两个事务之一可被中断以解决此冲突。 一种类型的事务性执行包括软 件事务性存储器(STM),其中访问被跟踪,冲突解决、中断任务、和其它事 务性任务以软件方式来执行。
7以前,为了确保事务性存储器操作与非事务性存储器操作之间不发生运行 时冲突,编译器将每个非事务性存储器操作视为单个操作事务。换言之,事务 性操作被插在非事务性存储器操作处以确保不发生运行时冲突。然而,在非事 务性存储器操作处执行周到的屏障潜在可能浪费执行周期。
附图简述
本发明是藉附图中的各图为示例来示出且并非旨在为其所限定。

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