高效且一致的软件事务存储器的制作方法

文档序号:6615900阅读:173来源:国知局
专利名称:高效且一致的软件事务存储器的制作方法
技术领域
本发明涉及处理器执行领域,特别涉及成组指令的执行。
背景技术
半导体工艺和逻辑设计中的进步己使得可在集成电路设备中提 供的逻辑的数量得以增加。因此,计算机系统配置己经从一个系统中 的单一或多个集成电路演进到在单个集成电路上提供多个核心和多 个逻辑处理器。 一个处理器或集成电路典型地包括单个处理器管芯
(die),其中该处理器管芯可以包括任意数量的核心或逻辑处理器。
集成电路上不断增加的核心和逻辑处理器数量使得能够执行更 多的软件线程。然而,可以被同时执行的软件线程数量的增加已经产 生了对软件线程之间共享的数据进行同步的问题。在多核心或多逻辑 处理器系统中访问共享数据的一种通常方案包括,使用锁来确保对共 享数据的多个访问之间的互斥。然而,不断增加的执行多个软件线程 的能力将可能会导致错误的争用和执行的串行化。
例如,考虑一个持有共享数据的哈希表。利用锁系统,程序员可 以锁住整个哈希表,允许一个线程访问整个哈希表。然而,其它线程 的吞吐量和性能将可能会受到负面影响,原因在于它们无法访问该哈 希表中的任何条目,直到该锁被释放。作为选择,可以对哈希表中的 每个条目加锁。然而,这增加了编程的复杂性,因为程序员不得不考 虑在一个哈希表内的更多的锁。
另一种数据同步技术包括使用事务存储器(transactional memory,
TM)。通常事务执行包括推测地执行一组的多个微操作、操作或指令。 在上述例子中,两个线程都在该哈希表内执行,而它们的访问被监视 /跟踪。如果两个线程都访问/改变同一条目,则可以中止其中一个事 务以解决冲突。 一种事务执行包括软件事务存储器(STM),其中访问被跟踪,以软件来执行冲突解决、中止任务和其它事务任务。
在一种实现中,跟踪读操作的版本以保持一致性并检测冲突。然
而,在典型的STM中,直到事务将被提交时才执行读操作的验证 (validation)。因此,如果在事务期间发生了比如冲突之类的无效动作, 则某些数据可能变得不一致,且使用不一致数据可能会导致程序异常 或无限循环。而且,为了发现所发生的不一致,在执行该事务的其余 部分期间,可能会浪费执行周期。


本发明通过例子进行说明,而并不是要受附图中的各图所限制。
图1说明了能够进行事务执行的系统的实施例。
图2说明了软件事务存储器(STM)系统的实施例。
图3说明了在STM中利用全局时间戳(global timestamp)来检测示
例性事务中的冲突的实施例。
图4a说明了高效的按需(on demand)事务验证的方法的流程图的
实施例。
图4b说明了继续自图4a的流程的实施例。 图4c说明了继续自图4a和图4b的流程的实施例。 图5说明了在程序代码中插入指令以执行高效的按需事务验证 的方法的流程图的实施例。
具体实施例方式
在以下说明书中,为了提供对本发明的全面理解,阐述了许多具 体细节,比如以下示例对于事务执行的具体硬件支持、具体的跟踪 /元数据方法、处理器中具体类型的局部/存储器、以及具体类型的存 储器访问和单元(location)等。然而,对于本领域技术人员显而易见的 是,本发明可以无需这些具体细节来实现。在其它实例中,为了避免 不必要地使本发明变得晦涩,没有详述公知的部件或方法,比如用软 件对事务进行编码、事务划分、具体的多核心和多线程处理器架构、 中断产生/处理、高速缓存组织以及微处理器的具体操作细节。这里所使用的值包括数字、状态、逻辑状态或二进制逻辑状态的 任何已知表示。通常,逻辑电平、逻辑值或逻辑上的值的使用也被称 为1和0,其简单地表示二进制逻辑状态。例如,1是指逻辑高电平, 而0是指逻辑低电平。然而,在计算机系统中也使用了值的其它表示。
例如十进制数10也可以被当作二进制值1010和十六进制字母A。
此外,状态可以由值或部分值来表示。例如,加锁状态可以由单 元中的第一个值(比如奇数)来表示,而该单元中的版本号(比如偶数值) 表示未加锁状态。这里,第一和第二个值的一部分可以被用来表示状 态,比如所述值的两个较低位、与所述值相关联的符号位或所述值的 其它部分。
这里所述的方法和装置用于软件事务存储器(STM)系统中的高 效且一致的验证。具体地,软件事务存储器(STM)系统中的高效且一 致的验证主要针对多核处理器计算机系统来进行讨论。然而,用于软 件事务存储器(STM)系统中的高效且一致的验证的方法和装置并不 被限制于此,原因在于它们可以被实现在、或关联于任何集成电路设 备或系统,比如移动电话、个人数字助理、嵌入式控制器、移动平台、 桌面平台和服务器平台,以及与利用事务存储器的其它资源(例如硬 件Z软件线程)相结合。
参考图1,说明了软件事务存储器(STM)系统中能够进行高效且 一致的验证的处理器的实施例。在一个实施例中,处理器100是能够 并行执行多个线程的多核处理器。然而,处理器100可以包括任何处 理单元,比如能够执行一个线程或多个线程的嵌入式处理器、单元处 理器(cdl-processor)、微处理器或其它已知的处理器。作为说明性的 例子,在图1中说明了处理器的乱序(out-of-order)架构的简化实施例。
下面将更详细讨论的处理器100中所示的模块可能用硬件、软 件、固件或它们的组合来实现。注意,所示的模块是逻辑块,其在物 理上可以与其它模块的边界重叠,并且可以以任何方式被配置或互
连。此外,如图1所示的模块在处理器100中不是必需的。此外,其 它模块、单元、和已知的处理器功能部件也可以包括在处理器100中。 总线接口模块105用于与诸如系统存储器175、芯片组、北桥或其它集成电路这样的设备进行通信。典型地,总线接口模块105包括 输入/输出(I/0)缓冲器,用以在互连170上发送和接收总线信号。互 连170的例子包括射电收发逻辑(Gunning Transceiver Logic, GTL) 总线、GTL+总线、双倍数据速率(DDR)总线、并发总线(pumpedbus)、 差分总线、高速缓存一致性总线(cache coherent bus)、点对点总线、 多点总线或其它己知的实现任何己知总线协议的互连。
处理器100耦合到存储器175,该存储器可以专用于处理器100 或与系统中的其它设备共享。存储器175的例子包括动态随机存取 存储器(DRAM)、静态RAM(SRAM)、非易失性存储器(NV存储器) 以及长期存储装置。所示的总线接口单元105还与高级高速缓存110 通信。
高级高速缓存110用于对最近取出的和/或操作的元素进行缓存。 在一个实施例中,高级高速缓存110是二级数据高速缓存。然而,高 级高速缓存110并不局限于此,因为它可以是、或包括用来存储最近 取出/解码的指令的指令高速缓存115。指令高速缓存115也可以被称 为轨迹高速缓存(tmce cache),被图示在取出逻辑120和解码逻辑125 之前。这里,指令高速缓存115存储最近取出的还没有解码的指令。 然而,指令高速缓存115可能会放置在取出逻辑120和/或解码逻辑 125之后以存储解码的指令。
取出逻辑120用于取出将要操作/执行的数据/指令。虽然没有示 出,但是在一个实施例中,取出逻辑包括或关联于分支预测逻辑、分 支目标缓冲器和/或预取器,用于预测将执行/采取的分支并沿着预测 的执行分支预取出指令。这里,能够进行推测执行的处理器可能会预 取并且推测地执行所预测的分支。解码逻辑125耦合到取出逻辑120 以对取出的元素进行解码。
分配器和重命名模块150包括用于保留资源的分配器,比如存储 指令处理结果的寄存器文件和跟踪指令的重排序缓冲器。单元150还 可以包括寄存器重命名器,用于将程序/指令参考寄存器重命名为处 理器100内的其它寄存器。
重排序/引退(retirement)模块155包括诸如上述的重排序缓冲器这样的部件,以支持乱序执行和乱序执行的指令在稍后的引退。在一 个实施例中,其中处理器100是有序执行处理器,则可以不包括重排序/引退模块155。在一个实施例中,调度器和执行模块160包括调度器单元以在执 行单元上调度指令/操作。还包括与执行单元相关联的寄存器文件以 存储信息指令处理结果。示例性执行单元包括浮点执行单元、整数执 行单元、跳转执行单元、加载执行单元、存储执行单元和其它己知的 执行单元。图1中还示出了低级数据高速缓存165。数据高速缓存165用于 存储最近使用/操作的元素,比如数据操作数。在一个实施例中,数 据转译后备缓冲器(data translation lookaside buffer, DTLB)与低级数据 高速缓存165相关联。通常处理器在逻辑上将物理存储器看成虚拟存 储空间。作为具体例子,处理器可以包括页表结构以将物理存储器分 成多个虚拟页。这里,DTLB支持虚拟到线性/物理地址的转译。数据 高速缓存165可以被用作事务存储器或其它存储器,以在事务执行期 间跟踪试探性访问,下面将更详细地讨论。在一个实施例中,处理器100是多核处理器。核心通常是指位于 能够维护独立架构状态的集成电路上的任何逻辑,其中每个独立维护 的架构状态与至少一些专用执行资源相关联。在一个实施例中,诸如 执行模块160这样的执行资源包括专用于每个核心的物理上分离的 执行单元。然而,执行模块160可以包括在物理上被安排为同一单元 的一部分或很邻近的多个执行单元;然而,执行模块160的各个部分 在逻辑上专用于每个核心。而且,每个核心可以共享对处理器资源(比 如高级高速缓存110)的访问,。在另一实施例中,处理器100包括多个硬件线程。典型地,硬件 线程是指位于能够维护独立架构状态的集成电路上的任何逻辑,其中 独立维护的架构状态共享对一些执行资源的访问。例如,可以为每个 硬件线程复制较少的资源,比如指令指针、重命名分配器逻辑150中 的重命名逻辑、指令转译缓冲器(ILTB),同时,硬件线程可以通过划 分来共享某些资源,比如重排序/引退单元155中的重棑序缓冲器、加载/存储缓冲器以及队列。其它资源,比如低级数据高速缓存和数据TLB 165、(多个)执行单元160和部分的乱序单元155,可能会被 完全共享。如可看到的,由于某些处理资源是被共享的而其它则专用于一种 架构状态,所以硬件线程与核心的命名(nomendature)之间的线重叠。 然而通常,核心和硬件线程被操作系统看成单独的逻辑处理器,每个 逻辑处理器能够执行一个线程。在这里逻辑处理器还可以被称为资源 或处理资源。因此,诸如处理器100这样的处理器能够在多个逻辑处 理器/资源上执行多个线程。结果,可以在处理器100中同时和/或并 发地执行多个事务。事务包括一组指令、操作或微操作,可以由硬件、软件、固件或 它们的组合对其进行分组。例如,指令可以用来划分事务。典型地, 在事务执行期间,对存储器的更新直到该事务被提交时才是全局可见 的。虽然该事务仍然未决,但是存储器内加载和写入的单元被跟踪。 一旦成功验证那些存储单元,就提交该事务并且使在该事务期间进行 的更新成为全局可见的。然而,如果事务在它的未决期间是无效的, 则重新开始该事务而不使所述更新成为全局可见的。结果,如这里使 用的,事务的未决是指已经开始执行且还没有被提交或中止(即未决) 的事务。事务执行的两个示例系统包括硬件事务存储器(HTM)系统和 软件事务存储器(STM)系统。硬件事务存储器(HTM)系统通常涉及利用处理器100的硬件在处 理器IOO执行事务期间对访问进行跟踪。例如,高速缓存行166用于 对系统存储器175中的数据项/对象176进行缓存。在事务执行期间, 与高速缓存行166相关联的注解/属性字段167被用来跟踪对行166 的访问和来自行166的访问。例如,属性字段167包括用于跟踪在事 务执行期间高速缓存行166是否已经被读取的事务读位和用于跟踪 在事务执行期间高速缓存行166是否已经被写入的事务写位。属性字段167可能会被用来在事务执行期间以及尝试提交该事 务时跟踪访问并检测冲突。例如,如果字段167中的事务读位被设置 为指示在事务执行期间发生了从行166的读取,并且发生了来自另一事务的与行166有关的存储,则检测到冲突。对于事务执行使用属性 字段的例子被包括在序列号待定、代理人案巻号为042390.P20165、 题目为"Transaction based shared data operations in a Multiprocessor Environment"的共有未决申请中。软件事务存储器(STM)系统通常涉及用软件执行访问跟踪、冲突 解决或其它事务存储器任务。作为一般的例子,当由处理器100执行 时,系统存储器175中的编译器179编译程序代码以将读和写屏障 (barrier)插入到加载和存储操作中,相应地,读和写屏障成为程序代 码内的事务的一部分。编译器179也可以插入其它的事务相关操作, 比如提交或中止操作。如所示,高速缓存165还用于缓存数据对象176、以及元数据177 和事务描述符178。然而,元数据单元177与数据项176相关联以指 示数据项176是否被加锁。读日志(可以存在于事务描述符178中)被 用来记录读操作,而写缓冲器或其它事务存储器(可以包括低级数据 高速缓存165)被用来缓冲或记录写操作。所插入的用于验证和提交的调用使用所述日志来检测冲突并验证事务操作。参考图2,说明了软件事务存储器(STM)系统的一实施例。数据 对象201包括任何粒度的数据,比如位、字、存储器中的一行、高速 缓存行、表、哈希表或任何其它已知的数据结构或对象。例如,由编 程语言所定义数据对象是数据对象201 。事务存储器205包括任何存 储与事务相关的元素的存储器。这里,事务存储器205包括多个行 210、 215、 220、 225和230。在一个实施例中,存储器205是高速缓 冲存储器。作为例子,数据对象201将被排成一行存储在高速缓存行 215中。作为选择,数据对象201能够被不排成一行而存储在存储器 205中。在一个例子中,每个数据对象与元数据阵列240中的一个元数据 单元相关联。作为一说明性实施例,与高速缓存行215相关的地址被 散列以定位阵列240,其将元数据单元250与高速缓存行215和数据 对象201相关联。注意,数据对象201可以与高速缓存行215大小相 同、比其更小(每个高速缓存行多个元素)或更大(多个高速缓存行一个元素)。此外,元数据单元250可以以任何方式与数据对象201和/或 高速缓存行215相关联。通常,元数据单元250表示数据对象201是加锁的还是可用的。 在一个实施例中,当数据对象201被加锁时,元数据单元250包括用 于表示加锁状态的第一值,比如读/写拥有状态252。另一示例性锁状 态是单拥有者读锁(Single Owner Read Lock, SORL)状态,在序列号待 定、代理人案巻号为042390.P24817、题目为"A mechanism for Irrevocable Transactions"共有未决相关申请中更详细地论述了该状 态。然而,可以在无数据单元250中利用和表示任何锁或锁状态。当 未加锁或可用时,元数据单元250包括第二值。在一个实施例中,该 第二值用于表示版本号251。这里, 一旦对数据对象201有写入,版 本号251就被更新(比如递增),以跟踪数据对象201的当前版本。作为说明图2所示实施例的操作的例子,响应于事务中涉及数据 对象201/高速缓存行215的第一读操作,该读操作被记录在读日志 265中。在一个实施例中,读日志265被包括在事务描述符260中。 事务描述符也可以包括写空间270,以及其它与该事务相关的信息, 比如事务标识符(ID) 261 、不可撤回事务(IRT)指示符262和其它事务 信息。然而,不要求在事务描述符260中包括写空间270和读日志 265。例如,写空间270可以被单独包括在与读日志265和/或事务描 述符260不同的存储空间中。不可撤回事务和事务描述符在序列号待 定、代理人案巻号为042390.P248H、题目为"A mechanism for Irrevocable Transactions"的共有未决相关申请中有更详细的论述。在一个实施例中,对读操作进行记录包括在读日志265中存储版 本号251和与数据对象201或高速缓存215相关联的地址。这里,假 定版本号251是1,以简化该例子。 一旦遇到涉及与数据对象201相 关的地址的写操作,该写操作就可能会作为一试探性更新被记录或跟 踪。此外,该元数据单元被更新为锁值,比如2,以表示数据对象201 被事务或执行该事务的资源加锁。在一个实施例中,使用原子操作来 更新该锁值,所述原子操作比如读、修改和写(RMW)指令。RMW指 令的例子包括位测试和设置(Bit-test and Set)、比较和交换(CompareandSwap)、以及相加(Add)。在一个实施例中,写空间270是一个缓冲器,用于对要写入到数 据对象201的新值进行缓冲/存储。这里,响应于提交,新值被"写 回"到它们相应的单元;而响应于中止,丢弃写空间270中的新值。 在另一实施例中,该写操作将高速缓存行215更新为新值,而旧值 272被存储在写空间270中。这里, 一旦提交了该事务,写空间中的 旧值就被丢弃,相反地, 一旦中止了该事务,该旧值就被恢复,艮P, 所述单元被"回滚"到它们在该事务之前的原始值。写空间270的例 子包括写日志、 一组检査点寄存器、以及存储空间,用于在事务期间 对要被更新的值进行记录/设置检查点。在序列号待定、代理人案巻号为042390.P24802 、题目为 "Compiler Technique for Efficient Register Checkpointing to Support Transaction Roll-back"的共有未决相关申请中论述了关于高效地对事 务设置检査点和进行回滚的更多信息。继续上面的例子,无论写空间270是被用作写缓沖器、写日志或 根本没有被使用,当提交时,该写操作就释放锁250。在一个实施例 中,释放锁250包括将元数据单元250返回到值1,表示未锁状态。 作为选择,该值被增加为3,表示未锁版本值251。该版本变更使其 它事务通过将其它事务的读日志中的所记录的版本值与当前版本值 251进行比较,可验证它们的加载了数据对象201的读操作。上述例子包括实现STM的一个实施例;然而,可以使用STM的 任何已知实现。在以下文章中论述了 STM: Bratin Sah4 Ali-Reza Adl-Tabatabai, Rick Hudson, Chi Cao Minh和Ben Hertzberg的 "Implementing a High Performance Software Transactional Memory for a Multi-core Runtime", Proceedings of the eleventh ACM SIGPLAN symposium on Principles and practice of parallel programming; N. Shavit 和D. Tuitou的"Software Transactional Memory", Proceedings of the Fourteenth ACM SIGACT-SIGOPS Symposium on Principles of Distributed Computing; T.L. Harris禾卩Fraser的"Language Support for Lightweight Transactions", Proceedings of the 2003 ACM SIGPLANConference on Object-Oriented Programming Systems, Languages and Applications;以及Ali-Reza Adl-Tabatabai, Brian Lewis, Vljay Menon, Brian Murphy, Bratin Saha禾口 Tatiana Shpeisman的"Compiler and runtime support for efficient software transactional memory", Proceedings of the 2006 ACM SIGPLAN conference on Programming language design and implementation 。事实上,也可以使用任何已知的用于执行事务存储器的系统,比 如HTM、 STM、无限制事务存储器(Unbounded Transactional Memory, UTM)系统、混合事务存储器系统(比如硬件加速STM(HASTM))、或 任何其它事务存储器系统。序列号待定、代理人案巻号为P24805、 题目为 "Hardware Acceleration of a write-buffering software transactional memory"的共有未决相关申请讨论了 STM的硬件加速。 序列号待定、代理人案巻号为042390.P23547、题目为"Overflow Method for Virtualized Transactional Memory"的共有未决申请讨论了 扩展/虚拟化HTM。以前,当版本251被远程资源(比如并未执行当前事务的资源)更 新时,更新的版本251指示出,在当前事务执行期间所发生的由远程 资源对行215的写操作。结果,在当前事务中先前的从行215的加载 可能变成无效;然而,直到当前事务的读集被验证时试图提交该当前 事务,才会从版本251上检测到该先前的无效加载。因此,在一个实施例中,能够按需验证的、高效且一致的STM 包括在执行加载/读操作之前和之后检査版本251的操作。例如,当 检测到在第一事务中从行215加载/读数据对象201时,对读屏障的 调用被插入在该加载操作之前。在一个实施例中,读屏障用于检查元 数据单元250。如上所述,如果元数据250在版本251中包括第一未 锁值,则该第一未锁值被记录在读日志265中。如果元数据250包括 加锁值,则在一个实施例中,当前事务等待,直到元数据250被设置 为未锁值。现在假定,执行加载操作,且随后远程资源更新数据对象201并 且将版本251修改为加锁值以及随后的版本251中的第二未锁值。结果,该加载操作已变为无效,即,远程资源向第一未决事务加载的单 元进行了写入,这是由与当前/后续的第二未锁版本值不同的已记录 版本第一未锁值来表示的。这里, 一检査版本屏障也被插入到第一事 务中该加载操作之后。该检查版本屏障用于取得当前/后续版本,并将它与读日志265中已记录的版本进行比较。结果,如果在读操作之 后且在检查版本屏障被调用之前发生了远程资源更新,则检查版本屏 障检测到版本251中的变化,并且能够在该点上中止该事务,而不用 等到该事务提交时才检测到读日志265中记录的读集里的无效加载 操作。然而,在上面的例子中,如果在该读操作之前或版本检查屏障之 后发生了远程资源进行的无效的写操作,则无效加载操作有可能不被 检测直到试图进行事务提交。因此,在一个实施例中,利用全局时间 戳来跟踪最新/最近提交的事务的版本。作为例子,全局时间戳中的 第一值被复制到第一事务的局部时间戳(local timestamp)中。在这种情 况下,加载操作之前的读屏障仍然读取版本251。另外,版本251被 与局部时间戳相比较。如果版本251大于局部时间戳,则第一事务的当前读集被验证。 本质上,比在事务开始时从全局时间戳复制的局部时间戳大的版本 251潜在地指示另一事务或远程资源更新过行215。为了说明,假定 全局时间戳被初始化为0。第一和第二事务开始将0复制到它们的局 部时间戳中。第一事务从行215加载而第二事务写入行215。随后,第二事务提交。这里,在提交期间,第二事务将全局时间 戳增加到1,并且将全局时间戳值1用于与在第二事务期间更新的行 215相关联的版本(比如版本251)。现在假定第一事务将要从行215 执行另一加载操作。当执行读屏障时,从元数据250读取版本1,而 该版本大于第一事务的局部时间戳,后者保持为值0。因此,第一事 务中的先前加载操作被进行验证,即,已记录的版本值O与当前版本 值1相比较。由于版本不同,指示冲突,因此第一事务可能会在该事 务中的该点上被中止。转到图3,说明了在能够利用插入的版本检查屏障和时间戳的STM中执行示例性事务的实施例。这里,存储单元305和310用于 存储元素、数据元素、指令、数据对象等。如参考图2所讨论的,存 储单元305和310分别与元数据(MD)单元306和311以任意方式相 关联。例如,存储单元305和310是用来存储数据对象的高速缓存行, 并且涉及数据对象或高速缓存行305和310的地址分别被散列以定位 MD单元306和311。此外,全局时间戳(GTS) 315用于存储GTS值。在一个实施例中, GTS是以任何已知方式存储的变量,比如在程序堆栈中、在存储器中、 在寄存器中,或其它存储元素。资源301和302包括能够进行并发或 同时执行的核心和/或线程。例如,资源301和302可以是单个物理 微处理器管芯上的核心,用于至少部分并发地执行事务303和304。 局部时间戳(LTS) 316和317是变量,比如分别在事务303和304中 初始化的局部变量。为了说明示例性操作,在事务303开始执行时,在操作320中将 LTS 316加载为GTS 315,以将初始GTS值0复制到LTS 316中。类 似地,在事务304开始执行时,在操作330中把仍具有O值的GTS 315 加载到与事务304相关联的LTS317中。首先,在存储操作321之前 插入的写屏障350用于执行写屏障操作,包括与写/存储操作相关的 任何事务任务。例如,写屏障350用于获取与被涉及的单元相关联的 锁。这里,获取单元305的锁。然后,执行存储321。如上所述,存 储操作321可以更新单元305并且记录单元305中的旧值,或者存储 操作321可以在写缓冲器中对新值进行缓冲并且在单元305中保持旧 值。接着,在事务304中,在从单元310进行加载操作331之前遇到 插入的读屏障355。这里,检查与单元310相关联的元数据单元。单 元311指示未加锁值O。该未加锁值0被与也具有值0的LTS317进 行比较。由于LTS317和元数据单元311保持相同的值0,因此没有 执行读集验证并且版本0被记录为已记录的版本。执行从单元310的 加载操作331。在加载操作331之后,版本检査屏障360检査元数据 311以确定第二、当前或后续版本。如果第二版本不同于第一版本,则可能发生了对存储单元310的修改并且可能会中止事务304。这里,在版本检查屏障360时的版本与读屏障355中记录的版本 相同,因此事务304的执行继续。接着,在事务303中,遇到了写屏 障350。获取单元310的锁。执行存储操作322以在单元310中存储 值99。然后提交事务303。在提交期间,GTS315递增,比如从值0 增加到l。在写缓冲STM中,新值被写回到单元305和310。在回滚 STM中,旧的记录值被丢弃。此外,递增后的GTS 315值1被用作 针对在事务303期间执行的写操作的版本。因此,元数据单元306和 311被更新为版本1,这是GTS315的值。由于事务304仍然在资源302中执行,所以遇到读屏障355。这 里,由于元数据单元306与将要由操作332从中加载的单元305相关 联,所以检査元数据单元306。己由远程资源301更新为1的元数据 单元311大于局部时间戳317的0。因此,在一个实施例中,局部时 间戳317被加载或重加载为GTS 315中的当前值1 。此外,事务304的读集被验证。这里,在操作331之前在读屏障 355处元数据311的记录值是O,而元数据311的当前值是l。结果, 确定加载操作331 (即事务304的读集)和事务304可以被在这一点上 中止并重新执行,而不是浪费执行尝试提交的执行周期。转到图4a,说明了高效且一致地在STM中执行事务的方法的流 程图的实施例。在流程405,开始事务的执行。在一个实施例中,执 行所编译的开始事务指令以开始该事务的执行。作为例子,对开始事 务函数的调用被编译器插入,当执行时,执行初始化和其它任务,比 如流程410中的任务。在流程410中,响应于第一事务的开始执行,将第一全局时间戳 (GTS)值存储在与第一事务相关联的第一局部时间戳(LTS)中。在第一 LTS中存储第一 GTS的操作的示例包括用来将第一 GTS复制到第 一LTS的复制操作、用来读取GTS的加载操作、和用来在第一LTS 中存储第一GTS的存储操作。接着在流程415中,在第一事务中遇到了被包括在第一事务中且 涉及第一地址和/或第一数据对象的读操作。注意,编译器可以在该读操作之前插入读屏障。结果,遇到读操作包括遇到与该读操作相关 的读屏障。作为例子,在读操作之前插入对读屏障函数的调用以执行流程420、 421、 425、 426、 427、 428、 430和435。在流程420中,确定第一地址是否未加锁。在一个实施例中,检 査与数据对象/地址相关的元数据单元。在流程421中,如果该地址 并未被解锁,即,元数据单元表示加锁值,则执行在流程421中等待, 直到该地址被解锁。这里,如果等待导致死锁,则可以中止该事务。在地址被解锁之后,在流程425中确定元数据单元中的第一版本 是否大于LTS。响应于第一版本大于LTS,在流程426中将局部时间 戳重新加载为当前GTS。此外,在流程427中,验证了第一事务中多 个先前的读操作,比如第一事务的/与第一事务相关联的读集。如果 在流程427中确定该读集不是有效的,则在流程428中第一事务被中 止。无论是在流程425中第一版本不大于LTS、还是在流程426中确 定读集有效,在流程430中都记录读操作,即,第一/当前版本。接 着,在流程435中,执行该读操作。在执行了当前读操作之后,执行 流程经436到达图4c中的流程460。这里,在流程460中检查/确定 与第一地址相关联的后续/第二版本。如果第一和第二版本(即已记录 的当前版本和后续版本或者在该读操作之前记录的和在该读操作之 后确定的版本)并不相同,则在流程428中第一事务被中止。回到图4b,在从图4a的流程405和410中初始化第一事务后, 可能在第一事务内的任何时间遇到要涉及该地址或数据对象的写/存 储操作,如经411从图4a到图4b的执行流程所表示的。类似于读/ 加载操作,在写操作之前可能会插入写屏障以执行写屏障任务,比如 在流程445和446中。这里,在流程445中,确定是否已经获得对于 该地址/数据对象的锁。如果己经获得锁,则可以在流程447中直接 执行该写操作。然而,如果还没有获得锁,则在流程446中获得锁。 注意,在STM的替代实现中,可以在提交期间而不是在这里所示的事务执行期间获得写锁。接着,无论是经流程450从图4b到4c(即,写操作之后),还是在流程460之后(即,读操作和版本检査屏障之后),遇到该事务的提 交。在一个实施例中,遇到提交事务指令(比如对提交函数的调用), 以执行提交操作,比如在流程470、 475、 480和485中的任务。在流程470中,确定LTS是否小于GTS。响应于LTS小于GTS, 在流程475中,验证第一事务中的每个读操作,包括来自流程427的 多个先前的读操作和在流程430中记录的当前读操作。响应于该读集 并非有效,在流程428中第一事务被中止。然而,如果该读集有效或者在流程470中LTS不小于GTS,比 如大于或等于LTS,则在流程480中,GTS被递增为递增后的GTS。 作为示例,可以以任意值来递增GTS,比如增量为l、 2或其它值。 接着,在流程485中,元数据单元被设置为至少该递增后的GTS值, 以跟踪第一事务是在那时最近提交的事务。转到图5,说明了用于插入操作/指令以在STM中执行高效且一 致的验证的流程图的实施例。在一个实施例中,执行编译器以编译程 序代码。在编译期间插入指令和/或操作。指令或操作都是指用于执行任务/操作、或一组或多个任务/操作 的代码。例如通常,指令或这里也使用的操作,包括多个微操作。例 如,比较和交换指令包括多个微操作,用于原子性地将存储单元的内 容与给定值进行比较,如果它们相同,则将该存储单元的内容修改为 给定的新值。因此,下面讨论的指令和操作在执行时可以包括单个或 多个操作/微操作,用以执行单个或多个任务/操作。此外,程序代码中的指令/操作可以被检测到和/或以任何顺序插 入。例如,在图5的流程中,在流程515中检测到加载操作,并且在 流程520和525中插入相关联的加载指令/屏障,而在流程530中检 测到存储操作,并且在流程535中插入写屏障。然而,在读操作之前 可以检测写操作。另外,写和读屏障可以是在编译期间的任何时间(比 如开始或结束时)插入的函数,并且当检测到存储或读操作时,插入 对所述函数的调用,以"在操作之前或之后插入屏障"。在流程505中,检测到开始事务指令。在流程510中,插入第一 指令,当其被执行时,用于将全局时间戳(GTS)加载到与第一事务相关联的局部时间戳(LTS)。在一个实施例中,全局时间戳用于保持最 近提交事务的最近时间戳值。作为例子,插入对开始事务函数的调用 并且将第一指令插入开始事务函数中。第一指令的示例包括复制、加 载、存储或其它操作,用于从GTS读取值并将该值存储在LTS中, 比如在执行时将GTS复制到LTS的复制操作。接着,在流程515中,检测到该事务中涉及一地址的加载操作。在流程520中,在该加载操作之前插入读屏障。在一个实施例中,在该加载操作之前插入对读屏障函数的调用。此外,在编译期间的某点上,编译器代码在执行时也用于插入读屏障函数。作为例子,读屏障函数在执行时用于确定保持在版本单元中的第一版本,所述版本单元例如是与该地址相关联的元数据单元。此外,读屏障用于确定第一版本是否大于局部时间戳。响应于第一版本大于局部时间戳:将GTS (比如当前GTS)重新加载到LTS中,验证第一事务中多个先前的读操作,并且响应于第一事务中多个先前的读操作之一无效而中止该第一事务。读屏障也记录下第一版本以用于随后的验证。在下面说明了读屏障的伪代码的一说明性实施例。 ReadBarrier()'-I双OwnLock(m)) { v — GetVersion() goto Done:v 4~ WaitOnOtherLockAndGetVersion0 if(v > Ix)ca]TimeSt咖p) {LocaTTkneStamp — GlobalTimeStampFor each LoggeS () ValidateVersion 0LogO Done;读屏障的伪代码的说明性实施例 这里,读屏障函数包括一组读屏障操作。当执行时,第一个读屏 障操作,即v《WaitOnOtherLockAndGetVersion0,用于进行等待直 到地址未加锁并且用于获得当前版本。当执行时,第二个读屏障操作, 即if(v>LocalTimeStamp),用于确定当前版本是否大于局部时间戳。 此外,当响应于当前版本大于局部时间戳而执行时, 一组验证操作,例如For each Logged()和ValidateVersion(),用于验证该事务中的多个 先前的读操作。当响应于当前版本大于局部时间戳而执行时,第三个 读屏障操作,例如LocalTimeStamp《GlobalTimeStamp,用于把全局 时间戳复制到局部时间戳。此外,当执行时,第四个读屏障操作,例 如Log(),用于将当前版本记录在读日志中。在流程525中,在加载操作之后还插入对版本检査屏障的调用。 在一个实施例中,版本检查屏障包括对版本检査函数的调用,当执行 时,用于确定保持在与该地址相关联的版本单元中的第二版本、确定 第二版本是否与第一版本不同、以及响应于第二版本不同于第一版本 而中止该第一事务。在下面说明了版本检査屏障函数的伪代码的一说 明性实施例。ReadCheckOv—new AbortOnOtherLockOrGetVereion(m) If(v != v一new) Abort版本检査屏障函数的伪代码的说明性实施例 这里,版本检查屏障函数包括一组版本检査屏障操作,当执行时, 用于将与该地址相关联的后续版本与当前记录的版本进行比较。当执 行时,第一个版本检查屏障操作,例如v—new《 AbortOnOtherLockOrGetVersion(m),用于如果没有其它事务在该地址 上有锁,则获得与该数据地址相应的后续版本,或者如果另一事务在 该地址上有锁,则中止当前事务。当执行时,第二个版本检査屏障操 作,例如If(v!-v—new),用于确定后续版本是否不同于当前版本。此 夕卜,响应于后续版本不同于当前记录的版本,将执行对中止函数的调 用以中止该事务。接着,在流程530,检测到第一事务中涉及所述地址的存储操作。 在实施例中,在流程535中,在存储操作之前插入对写屏障函数的调 用。作为示例,写屏障函数在执行时用于获得该地址的锁。在下面说 明了写屏障函数的伪代码的一说明性实施例。这里,响应于还未拥有 该地址的锁,而获取针对该地址的写锁。注意,也可以记录写集,这包括在下面在Done之前的记录写集伪代码操作。在获取该锁之后,将数据记录在写集中。 WriteBarrier():即wnLo汰(》goto Done: AcquireLock(); Done:写屏障函数的伪代码的说明性实施例 在流程540中,检测到提交事务指令。在一个实施例中,插入对 提交函数的调用。提交函数在执行时用于确定局部时间戳是否小于全 局时间戳。响应于局部时间戳小于全局时间戳,该提交函数在执行时 用于确定第一事务中的多个先前的读操作是否有效、并且响应于第一 事务中的多个先前的读操作之一无效而中止该第一事务。此外,全局 时间戳将被递增,变为递增后的全局时间戳,并且与该地址相关联的 版本单元(即元数据单元)将被设置为该递增后的全局时间戳。在下面说明了提交函数的伪代码的一说明性实施例。 Commit():If(LocalTimeStamp < GlobalTimeSt咖p) { For each Logged 0 ValidateVersfon 0v《++GlobaTnmeStamp; For each Locked m {SetVersk)nORe,easeLocic 0}提交函数的伪代码的一说明性实施例 在该示例中,当执行时,第一个提交操作, If(LocalTimeStamp〈GlobalTimeStamp),用于确定局部时间戳是否小于 全局时间戳。当响应于局部时间戳小于全局时间戳而执行时, 一组验 证操作,For eachLogged()和For each Logged(),用于验证该事务中的 多个先前的读操作。当执行时,第二个提交操作,v《 ++GlobammeStamp,用于对全局时间戳进行递增,将其变为递增后 的全局时间戳。此外,当执行时,第三个提交操作,SetVersion(),用于响应于在该事务执行期间获得针对该地址的锁,而将与该地址相关 联的最近版本设置为该递增后的全局时间戳。注意,在一个实施例中, 所述事务是只读事务,其中可能会省略提交操作。如上所述,可以执行STM的高效且一致的验证。以前,直到试图提交事务时,才可能会检测到无效的访问。结果,在无效访问提交 /发生时到试图提交该事务之间的执行期间,可能会在该执行期间使 用不一致数据,这可能导致执行异常或无限循环。而且,由于该事务 将被中止或重启,所以可能会浪费在不一致执行期间的执行周期。因 此,通过在加载操作之后插入版本检査屏障并使用时间戳,可以更早 地检测到无效的访问/冲突,这使得可以中止事务而不会额外浪费执 行周期或者引起无限循环的程序异常。此外,通过按需验证,可能会 避免由于不一致而产生的欺骗程序错误。上述的方法、软件、固件或代码的实施例可以通过存储在机器可 访问或机器可读介质中的、可由处理单元执行的指令或代码来实现。 机器可访问/可读介质包括以机器(比如,计算机或电子系统)可读的形 式提供(即,存储和/或传送)信息的任何机制。例如,机器可访问介质包括随机存取存储器(RAM),比如静态RAM (SRAM)或动态RAM (DRAM); ROM;磁或光存储介质;闪速存储器设备;电的、光的、 声的或其它形式的传播信号(例如,载波、红外信号、数字信号);等等。在整个说明书中对"一个实施例"或"一实施例"的引用表示, 结合该实施例描述的特定的特征、结构或特性被包括在本发明的至少 一个实施例中。因此,在整个说明书中各处出现的短语"在一个实施 例中"或"在一实施例中"并非必然全部是指同一个实施例。而且, 在一个或多个实施例中,可以以任意合适的方式对所述特定的特征、 结构或特性进行组合。在前面的说明书中,己经参考具体的示例性实施例给出了详细的 描述。然而,显然可以对其进行各种修改和变更而不脱离在所附权利 要求中提出的本发明的更宽的本质和范围。相应地,说明书和附图被 看成是说明性的而不是限制性的。此外,前面所使用的实施例和其它示例性语言并不必然是指同一个实施例或同一个示例,而是可以指不 同的和有区别的实施例、以及可能地同一个实施例。
权利要求
1、一种方法,包括响应于开始执行第一事务,在与所述第一事务相关联的第一局部时间戳中存储全局时间戳值;响应于遇到被包括在所述第一事务中、且涉及第一地址的当前的读操作,如果与所述第一地址相关联的当前版本大于所述局部时间戳,则验证所述第一事务中的多个先前的读操作。
2、 如权利要求1所述的方法,其中,响应于遇到所述当前的读 操作进一步检查所述第一地址是否未加锁,并且响应于所述第一地址 未加锁而记录所述当前版本。
3、 如权利要求2所述的方法,进一步包括 执行所述当前的读操作;以及 在执行所述当前的读操作之后,检査与所述第一地址相关联的后续版本,以及 如果所述后续版本不同于所述当前版本,则中止所述第一事务。
4、 如权利要求3所述的方法,进一步包括响应于遇到涉及所 述第一地址的写操作,获取与所述第一地址相关联的元数据单元中的 锁。
5、 如权利要求4所述的方法,进一步包括提交所述第一事务, 其中,提交所述事务包括响应于所述第一局部时间戳小于所述全局时间戳,验证所述第一 事务中的每个读操作,包括所述多个先前的读操作和所述当前的读操作;递增所述全局时间戳值,使其变为递增后的全局时间戳值;以及将所述元数据单元中的写版本设置为至少所述递增后的全局时 间戳值。
6、 如权利要求1所述的方法,验证所述第一事务中的多个先前的读操作包括如果与所述多个先前的读操作相关联的多个已记录版 本对应于与所述多个先前的读操作相关联的多个当前版本,则确定所 述多个先前的读操作是有效的。
7、 一种包括程序代码的制品,所述程序代码在被机器执行时,使得该机器执行以下操作检测事务中涉及一地址的加载操作;在所述加载操作之前插入要执行的一组读屏障操作,该组读屏障 操作在执行时用于获得与所述地址相关联的当前版本;在所述加载操作之后插入一组版本检査屏障操作,该组版本检查 屏障操作在执行时用于将与所述地址相关联的后续版本和所述当前 版本进行比较。
8、 如权利要求7所述的制品,进一步包括在所述加载操作之前插入对读屏障函数的调用,其中,所述读屏 障函数包括所述一组读屏障操作;以及在所述加载操作之后插入对版本检査屏障函数的调用,其中,所 述版本检查屏障函数包括所述一组版本检查屏障操作。
9、 如权利要求7所述的制品,其中,所述一组版本检查屏障操作包括第一版本检查屏障操作,在执行时用于获得所述后续版本; 第二版本检查屏障操作,在执行时用于确定所述后续版本是否不同于所述当前版本;以及对中止函数的调用,在响应于所述后续版本不同于所述当前版本而执行时用于中止所述事务。
10、 如权利要求7所述的制品,进一步包括 检测开始事务指令;以及插入在所述事务开始时要执行的复制操作,所述复制操作在执行 时用于把全局时间戳复制到与所述事务相关联的局部时间戳。
11、 如权利要求IO所述的制品,其中,所述一组读屏障操作包括第一读屏障操作,在执行时用于获得所述当前版本; 第二读屏障操作,在执行时用于确定所述当前版本是否大于所述局部时间戳;以及一组验证操作,在响应于所述当前版本大于所述局部时间戳而执 行时用于验证所述事务中的多个先前的读操作。
12、 如权利要求11所述的制品,其中,所述一组读屏障操作进一步包括第三读屏障操作,在响应于所述当前版本大于所述局部时间戳而执行时用于把所述全局时间戳复制到所述局部时间戳;以及第四读屏障操作,在执行时用于在读日志中记录所述当前版本。
13、 如权利要求10所述的制品,进一步包括检测提交事务指令;插入响应于提交所述事务而要执行的一组提交操作,该组提交操作包括第一提交操作,在执行时用于确定所述局部时间戳是否小于所述全局时间戳;以及一组验证操作,在响应于所述局部时间戳小于所述全局时间 戳而执行时用于验证所述事务中的多个先前的读操作。
14、 如权利要求13所述的制品,其中,所述一组提交操作进一步包括第二提交操作,在执行时用于把所述全局时间戳递增为递增后的 全局时间戳;第三提交操作,在执行时用于响应于在所述事务执行期间获取了 所述地址的锁,而将与所述地址相关联的最近版本设置为所述递增后 的全局时间戳。
15、 一种系统,包括存储设备,用于存储编译器代码和程序代码;以及 与所述存储设备相关联的处理器,该处理器用于执行所述编译器 代码,其中,所述编译器代码在执行时用于 检测所述程序代码中的第一事务;插入第一指令,该第一指令在执行时用于将全局时间戳加载 到与所述第一事务相关联的局部时间戳中,其中,所述全局时间 戳用于保持最近提交的事务的最近局部时间戳值。
16、 如权利要求15所述的系统,其中,所述编译器代码在执行 时还用于检测所述第一事务中涉及一地址的加载操作; 在所述加载操作之前插入对读屏障函数的调用;以及 在所述加载操作之后插入对版本检查函数的调用。
17、 如权利要求16所述的系统,其中,所述编译器代码在执行时还用于插入所述读屏障函数,所述读屏障函数在执行时用于确定保持在与所述地址相关联的版本单元中的第一版本; 确定所述第一版本是否大于所述局部时间戳;响应于所述第一版本大于所述局部时间戳将所述全局时间戳重新加载到所述局部时间戳中; 确定所述第一事务中的多个先前的读操作是否有效;以及 响应于所述第一事务中的多个先前的读操作之一无效,中止所述第一事务;以及 记录所述第一版本。
18、 如权利要求17所述的系统,其中,所述编译器代码在执行 时还用于插入所述版本检査函数,所述版本检查函数在执行时用于确定保持在与所述地址相关联的版本单元中的第二版本; 确定所述第二版本是否不同于所述第一版本;以及 响应于所述第二版本不同于所述第一版本,中止所述第一事务。
19、 如权利要求18所述的系统,其中,所述编译器代码在执行 时还用于检测所述第一事务中涉及所述地址的存储操作; 在所述存储操作之前插入对写屏障函数的调用,所述写屏障函数 在执行吋用于获取所述地址的锁。
20、 如权利要求19所述的系统,其中,所述编译器代码在执行 时还用于检测所述第一事务中的提交指令;响应于检测到所述提交指令,插入对提交函数的调用,其中,所 述提交函数在执行时用于确定所述局部时间戳是否小于所述全局时间戳; 响应于所述局部时间戳小于所述全局时间戳,确定所述第一事务中的多个先前的读操作是否有效;以及响应于所述第一事务中的多个先前的读操作之一无效, 中止所述第一事务;将所述全局时间戳递增为递增后的全局时间戳; 将与所述地址相关联的版本单元修改为所述递增后的全局 时间戳。
全文摘要
在此描述了一种用于软件事务存储器(STM)系统中的高效且一致的验证/冲突检测的方法和装置。在加载操作之后插入版本检查屏障,以比较加载操作前后的加载值的版本。另外,全局时间戳(GTS)被用来跟踪最新提交的事务。每个事务都与在事务开始时被初始化为GTS值的局部时间戳(LTS)相关联。随着事务提交,将GTS更新为新值并将所修改的单元的版本设置为该新值。未决事务将在读屏障中确定的版本与它们的LTS进行比较。如果该版本大于它们的LTS,这指示出另一事务已在未决事务开始且初始化LTS之后被提交,则该未决事务验证其读集以保持高效且一致的事务执行。
文档编号G06F9/46GK101286123SQ200710306288
公开日2008年10月15日 申请日期2007年12月28日 优先权日2006年12月28日
发明者A-R·阿德-塔巴塔巴伊, B·萨哈, C·王, W-Y·陈, Y·吴 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1