具体实施方式
现在参照各图,其中相似标号通篇指代相似和对应部分,并且具体参照图1,图示高级框图,该高级框图描绘根据一个实施例的示例数据处理***100。在描绘的实施例中,数据处理***100是包括用于处理数据和指令的多个处理节点102a、102b的高速缓存相干对称多处理器(SMP)数据处理***。处理节点102耦合到用于承载地址、数据和控制信息的***互连110。可以例如实施***互连110为总线式互连、交换机式互连或者混合互连。
在描绘的实施例中,每个处理节点102被实现为包含四个处理单元104a—104d的多芯片模块(MCM),每个处理单元优选地被实现为相应集成电路。在每个处理节点102内的处理单元104通过本地互联114进行耦合,以用于相互通信以及与***互连110通信,本地互联114——类似于***互联110——例如可以用一个或多个总线和/或交换机实现。***互连110和本地互连114一起形成***结构。
如以下参照图2更具体描述的那样,处理单元104各自包括耦合到本地互连114以提供与相应***存储器108的接口的存储器控制器106。在***存储器108内驻留的数据和指令一般可以由在数据处理***100内的任何处理节点102的任何处理单元104中的处理器盒访问、高速缓存和修改。***存储器108因此形成在数据处理***100的分布式高速缓存存储器***中的最低级易失性存储装置。在备选实施例中,一个或者多个存储器控制器106(和***存储器108)可以被耦合到***互连110而不是本地互连114。
本领域技术人员将理解图1的SMP数据处理***100可以包括许多附加未图示的部件、比如互连桥接器、非易失性存储装置、用于连接到网络或者附着的设备的端口等。由于这样的附加部件不是理解描述的实施例所必需的,所以未在图1中图示或者这里进一步讨论它们。然而也应当理解这里描述的增强适用于不同架构的高速缓存相干数据处理***而决不限于图1中所示广义数据处理***架构。
多处理器数据处理***、比如图1的数据处理***100实施存储器一致性模型,该存储器一致性模型指定给定的多处理器程序关于存储器访问的合法可能执行(例如可以由加载指令返回的值、对存储器的写入顺序、影响存储器访问排序的那些指令执行依赖性和在多处理器程序结束时用于存储器位置的最终值以及其它执行)。存储器一致性模型由两个主要特性指定:存储器访问操作的顺序和存储操作的原子性。
存储器操作的排序指定存储器操作(如果发生)可以相对于它们的相应加载和从存储指令在微处理器程序中的个体执行线程中的顺序如何被重新排序。存储器一致性模型必须定义存储器访问操作在四种一般情况下的排序:(1)用于加载指令到后继加载指令的存储器操作的排序、(2)用于加载指令到后继存储指令的存储器操作的排序、(3)用于加载指令到后继存储指令的存储器操作的排序和(4)用于存储指令到后继加载指令的存储器操作的排序。强一致性存储器模型一般将保留这些排序中的所有或者至少多数排序。具体而言,许多强一致性存储器模型实行前三个排序、但是未实行存储到加载排序。弱一致性存储器模型将一般不实行这些排序中的多数或者所有排序。
存储操作的原子性是指给定的执行线程是否可以在其它线程之前读取它自己的存储操作的值并且另外是指存储操作对分布式共享存储器***的值写入是否变成以在逻辑上瞬时的方式对其它线程可见或者该值是否可以变成在不同时间点对其它线程可见。如果一个线程的存储操作写入的值变成以在逻辑上瞬时的方式对所有其它线程可见,则存储器一致性模型被称为“多拷贝原子”(multi-copyatomic)。一般而言,强一致性存储器模型是多拷贝原子的,并且弱一致性存储器模型未实行多拷贝原子性。
在给定的多处理器程序中,程序语义经常要求遵守多拷贝原子性和/或在存储器访问操作之间的各种排序。因此,在实施弱一致性存储器模型的分布式共享存储器***的数据处理***100中,通常提供所谓“阻塞(barrier)”(例如SYNC)指令以允许程序员指定将在执行多处理器程序期间应用什么存储器访问操作排序和原子性。
现在参照图2,描绘根据一个实施例的示例处理单元104的更具体框图。在描绘的实施例中,每个处理单元104是包括用于处理指令和数据的两个或者更多处理器核200a、200b的集成电路。在一个优选实施例中,每个处理器核200能够同时独立执行多个执行硬件线程。然而在以下描述中,除非在相同处理器上执行的线程之间的交互在具体情境中相关,为了简化,可互换地使用术语“处理器核”和“在处理器核上执行的线程”。如描绘的那样,每个处理器核200包括用于执行指令的一个或者多个执行单元、比如加载-存储单元(LSU)202。LSU202执行的指令包括存储器访问指令,这些存储器访问指令请求加载或者存储对在分布式共享存储器***中的存储器块的访问或者引起生成对于加载或者存储对在分布式共享存储器***中的存储器块的访问的请求。在一个或者多个寄存器文件(RF)208中缓冲加载访问从分布式共享存储器***获得的存储器块,并且从一个或者多个寄存器文件208对分布式共享存储器***写入存储访问所更新的存储器块。
每个处理器核200的操作由多级易失性存储器分级支持,该多级易失性存储器分级在它的最低级具有经由集成存储器控制器106访问的共享***存储器108并且在它的更高级具有一个或者多个高速缓存存储器级,该一个或者多个高速缓存存储器级在示例实施例中包括在每个处理器核200内并且专用于处理器核200的存储-直通第一级(L1)高速缓存226和用于每个处理器核200a、200b的相应存储-输入第二级(L2)高速缓存230。为了高效地处置对可高速缓存地址的多个并行存储器访问请求,可以用多个L2高速缓存分片实施每个L2高速缓存230,每个L2高速缓存分片处置对于实际存储器地址的相应集合的存储器访问请求。
虽然所示高速缓存分级包括仅两级高速缓存,但是本领域技术人员将认识备选实施例可以包括附加级(L3、L4等)的片上或者片外、专用或者共享、线内或者后备高速缓存,这些附加级的高速缓存可以完全包容、部分包容或者未包容更高级高速缓存的内容。
每个处理单元104还包括集成和分布式结构控制器216,该集成和分布式结构控制器216负责控制在包括本地互连114和***互连110的***结构上的操作流程并且负责实施为了实施选择的高速缓存相干性协议而需要的相干性通信。处理单元104还包括支持附着一个或者多个/O设备(未描绘)的集成I/O(输入/输出)控制器214。
在操作中,在处理器核200执行的硬件线程包括请求执行指定的存储器访问操作的存储器访问指令时,LSU202执行存储器访问指令以确定存储器访问请求的目标地址(例如有效地址)。在将目标地址翻译成实际地址之后,利用目标地址来访问L1高速缓存226。假设仅参考L1高速缓存226不能满足指示的存储器访问,LSU202然后向它的附属L2高速缓存230发送至少包括事务类型(ttype)(例如加载或者存储)和目标实际地址的存储器访问请求以用于服务。
现在参照图3,图示根据一个实施例的支持存储器事务的更低级高速缓存(例如L2高速缓存230)的一个示例实施例的更具体框图。如图3中所示,L2高速缓存230包括高速缓存阵列302和高速缓存阵列302的内容的目录308。虽然未明确地图示,但是优选地用单个读取端口和单个写入端口实施高速缓存阵列302以减少为了实施高速缓存阵列302而需要的管芯面积。
假设如常规的那样将高速缓存阵列302和目录308设置为关联,利用在***存储器(实际)地址内的预定索引位将在***存储器108内的存储器位置映射到在高速缓存阵列302内的特定同余类(congruence class)。在包含用于每个高速缓存行的一个目录条目的高速缓存目录308中记录在高速缓存阵列302的高速缓存行内存储的特定存储器块。尽管在图3中未明确地描绘,但是本领域技术人员将理解在高速缓存目录308中的每个目录条目包括各种字段、例如标识在高速缓存阵列302的对应高速缓存行中保持的存储器块的实际地址的标签字段、指示高速缓存行的相干性状态的状态字段、指示用于高速缓存行的相对于在相同同余类中的其它高速缓存行的更换顺序的LRU(最少最近使用)字段和指示是否在关联L1高速缓冲226中指示存储器块的包容性位。
L2高速缓存230包括用于独立和并行服务于从附属处理器核200接收的加载(LD)和存储(ST)请求的多个(例如16个)读取-主张(RC)机器312。为了服务于源于处理器核200而不是附属处理器核200的远程存储器访问请求,L2高速缓存230也包括多个探听机器311。每个探听机器311可以独立和并发地处置来自本地互连114“探听”的远程存储器访问请求。如将认识的那样,RC机器312对存储器访问请求的服务可以要求更换或者无效化在高速缓存阵列302内的存储器块。因而,L2高速缓存203也包括管理从高速缓存阵列302去除和回写存储器块的CO(逐出,castout)机器310。
L2高速缓存230还包括仲裁器305,该仲裁器控制复用器M1-M2以对从附属处理器核200接收的本地存储器访问请求和存储器事务请求(对应于这里进一步描述的tbegin、tbegin_rot、tabort和tcheck指令)以及在本地互连114上探听的远程请求的处理进行排序。根据仲裁器305实施的仲裁策略向分派逻辑、比如分派流水线306转发包括本地加载和存储以及存储器事务请求以及远程加载和存储请求的这样的请求,该分派逻辑处理关于目录308和高速缓存阵列302的每个读取/加载和存储请求。如以下进一步描述的那样,事务性存储器(TM)逻辑380处理存储器事务请求并且跟踪在存储器事务内的存储器访问操作以保证以原子方式完成存储器访问操作或者在存在冲突时中止存储器事务。
L2高速缓存230也包括RC分别缓冲向高速缓存阵列302中***和从高速缓存阵列302去除的数据的队列320和CPI(逐出推送干预)队列318。RC队列320包括各自单独对应于RC机器312中的特定RC机器的多个缓冲器条目,从而分派的每个RC机器312仅从指明的缓冲器条目取回数据。相似地,CPI队列318包括各自单独对应于逐出机器310和探听机器311中的特定一个的多个缓冲器条目,从而分派的每个CO机器310和每个探听器311仅从相应指明的CPI缓冲器条目取回数据。
每个RC机器312也具有向它指派的用于缓冲经由重载总线323从高速缓存阵列302读取和/或从本地互连114接收的存储器块的多个RC数据(RCDAT)缓冲器322中的相应RCDAT缓冲器。向每个RC机器312指派的RCDAT缓冲器322优选地用与关联RC机器312可以服务于的存储器访问请求对应的连接和功能来构造。RCDAT缓冲器322具有关联存储数据复用器M4,该关联存储数据复用器M4响应于仲裁器305生成的未图示的选择信号从它的输入之中选择数据字节用于在RCDAT缓冲器322中缓冲。
在操作中,处理器核200向存储队列(STQ)304发送包括事务类型(ttype)、实际目标地址和存储数据的存储请求。从STQ304经由数据路径324向存储数据复用器M4发送存储数据,并且向复用器M1传递事务类型和目标地址。复用器M1也从处理器核200接收处理器加载请求和从RC机器312接收目录写入请求作为输入。响应于仲裁器305生成的未图示的选择信号,复用器M1选择它的输入请求之一以向复用器M2转发,该复用器还经由远程请求路径326接收从本地互连114接收的远程请求作为输入。仲裁器305调度用于处理的本地和远程存储器访问请求并且基于调度来生成选择信号328的序列。响应于该仲裁器305生成的选择信号328,复用器M2选择从复用器M1接收的本地请求或者从本地互连114探听的远程请求作为待处理的下一存储器访问请求。
被选择用于由仲裁器305处理的请求被传递到TM逻辑380并且也被复用器M2放置到分派流水线306上。优选地实施分派流水线306为固定持续时间流水线,在该固定持续时间流水线中,多个可能重叠请求中的每个重叠请求被处理达预定数目的时钟周期(例如4个周期)。在分派流水线306内的第一处理周期期间,利用请求地址来执行目录读取以确定请求地址是在目录308中命中还是未命中并且如果存储器地址命中则确定目标存储器块的相干性状态。目录308在后续周期中向分派流水线306返回目录信息,该目录信息包括命中/未命中指示和存储器块的相干性状态。如将认识的那样,响应于对远程存储器访问请求未命中而一般未在L2高速缓存230内进行动作;因而从分派流水线306丢弃这样的远程存储器请求。然而在对本地存储器访问请求命中或者未命中或者对远程存储器访问请求命中的情况下,L2高速缓存230一般将服务于存储器访问请求,这对于不能在处理单元104内完全服务于的请求可能引起经由结构控制器216在本地互连114上的通信。
如以下参照图16更具体描述的那样,TM逻辑380也与目录读取并发地确定向L2高速缓存230发布存储器访问请求的线程的事务状态。至少对于作为事务性存储器访问请求的那些存储器访问请求,TM逻辑380向分派流水线306提供指示线程的确定的事务状态的事务状态指示383。基于事务状态指示383,分派流水线306优选地未分配用于失败存储器事务的存储器访问请求、因此防止失败事务的事务性存储器访问消耗资源、污染高速缓存阵列302和目录308以及不必要地使其它未决存储器事务失败。
在分派流水线306内的存储器访问请求的处理期间的预定时间,仲裁器305经由地址和控制路径330向高速缓存阵列302发送请求地址以发起请求地址指定的存储器块的高速缓存读取。经由数据路径342向纠错码(ECC)逻辑344发送从高速缓存阵列302读取的存储器块,该ECC逻辑针对错误校验存储器块并且如果可能则纠正任何检测到的错误。对于处理器加载请求,也经由数据路径340向加载数据复用器M3发送存储器块用于向附属处理器核200转发。
在分派流水线306内的存储器访问请求的处理的最后周期,分派流水线306基于多个标准做出分派确定,执行标准例如包括(1)在请求地址与逐出机器310、探听机器311或者RC机器312当前正在处理的先前请求地址之间存在地址冲突、(2)目录信息、(3)RC机器312或者探听机器311处理存储器访问请求的可用性和(4)事务状态指示383。如果分派流水线306做出将分派存储器访问请求的分派确定,则从分派流水线306向RC机器312或者探听机器311分派存储器访问请求。如果存储器访问请求分派失败,则可以在许多情况下通过重试响应向请求器(例如本地或者远程处理器核200)通知失败。请求器如果必需则可以随后重试失败的存储器访问请求。
在RC机器312正在处理本地存储器访问请求之时,RC机器312具有忙碌状态并且不可用于服务于另一请求。在RC机器312具有忙碌状态之时,RC机器312如果必需则可以执行目录写入以更新目录308的相关条目。此外,RC机器312可以执行高速缓存写入以更新高速缓存阵列302的相关高速缓存行。仲裁器305可以根据固定的目录读取和高速缓存读取调度在其中分派流水线306未已经处理其它请求的任何间隔期间调度目录写入和高速缓存写入。在已经完成用于给定的请求的所有操作时,RC机器312返回到未忙碌状态。
数据处置电路装置与RC机器312关联,在服务于各种类型的本地存储器访问请求期间运用该数据处理电路装置的不同部分。例如对于在目录308中命中的本地加载请求,从高速缓存阵列302经由数据路径340和加载数据复用器M3向附属处理器核200,并且还经由数据路径342向ECC逻辑344转发目标存储器块的未纠正拷贝。在本地加载请求获得的目标存储器块中的ECC错误的情况下,经由数据路径346和存储数据复用器M4向RCDAT缓冲器322转发、然后从RCDAT缓冲器322经由数据路径360和加载数据复用器M3向附属处理器核200转发纠正的数据。对于本地存储请求,在RCDAT缓冲器322内经由数据路径324和存储数据复用器M4从STQ304接收存储数据,合并存储数据与从高速缓存阵列302经由ECC逻辑344和存储数据复用器M4向RCDAT缓冲器322中读取的存储器块,然后从RCDAT缓冲器322经由数据路径362向高速缓存阵列302中写入合并的存储数据。响应于本地加载未命中或者本地存储未命中,经由重载总线323、存储数据复用器M4、RCDAT缓冲器322(具有用于存储未命中的存储合并)和数据路径362向高速缓存阵列302中加载通过在本地互连114上发布存储器访问操作获取的目标存储器块。
现在参照图4,描绘存储器事务的示例。本领域技术人员将认识用来实施这里描述的各种存储器事务的特定语义和指令仅为许多可能实现方式中的一些实现方式,并且公开的实施事务性存储器的技术未依赖于运用的具体指令和指令语义。
示例存储器事务400在tbegin指令402开始。tbegin指令402发起存储器事务400、使执行tbegin指令402的处理器核200采用处理器核200的架构寄存器状态的检查点210并且(例如通过向附属L2高速缓存230发送的对应tbegin请求)调用在事务体406内的加载和存储指令的跟踪以保证它们以原子方式完成或者存储器事务400在存在冲突时失败。存储器事务400还包括紧接地跟随tbegin指令402的分支指令404。在存储器事务400先执行时,分支指令404依赖于的在处理器核200中的条件码寄存器被初始化成如下值,该值使分支指令404指示的程序分支未被取用并且使执行流程继续事务体406。如以下讨论的那样,响应于存储器事务400的失败,条件码寄存器被设置成不同值,并且分支指令404使执行被分支到失败处置器例程。
在图3中描绘的示例实施例中,TM逻辑380跟踪在事务体406内的事务性存储器访问(例如加载和存储)指令以保证它们以原子方式完成或者存储器事务400在存在冲突时失败。在一个优选实施例中,在TM逻辑380内的TM跟踪逻辑381包括多个条目,这些条目指示在事务印记中包括高速缓存阵列302中的哪些高速缓存行(如例如参照图10描述的那样)。事务印记包括两个部分:与仅被在事务体406内的加载所触及的高速缓存行(例如在示例存储器事务400中在地址A的高速缓存行)对应的加载印记以及与仅被在事务体406中的存储指令或者加载和存储指令二者触及的高速缓存行(例如在示例存储器事务400中在地址B的高速缓存行)对应的存储印记。如参照图14和16进一步讨论的那样,TM跟踪逻辑381优选地跟踪核200的每个线程的当前事务状态并且响应于接收到给定的线程的每个事务性存储器访问请求而向分派流水线306提供指示该线程的事务状态的事务状态指示383。应当指出这一事务状态反映存储器事务在TM跟踪逻辑381的状态而不是线程本身在处理器核200中的架构状态。存储器事务在TM跟踪逻辑381的失败通常先于线程在处理器核200中的失败。
如图3中进一步所示,TM逻辑380还包括事务控制逻辑382,该事务控制逻辑控制存储器事务的定序并且向关联处理器核200提供通行/失败指示384和可选TM灭除指示385。通行/失败指示384向处理器核200指示是否在存储器事务400结束时执行tend指令408时向分布式共享存储器***成功提交存储器事务。TM灭除指示385向处理器核200指示冲突是否已经在事务期间出现。响应于事务控制逻辑382确立TM灭除指示385,处理器核200可以可选地在到达tend指令408之前中止和重启存储器事务400作为性能优化。
响应于通行/失败指示384(或者可选地响应于TM灭除指示385)指示冲突已经在执行存储器事务400期间出现,处理器核200从在执行tbegin指令402时取用的检查点210建立它的架构存储器状态、无效化在存储印记中的试探地修改的高速缓存行、释放跟踪逻辑381、设置条件码寄存器从而分支指令404将被采用并且向分支指令404传送控制。此外,处理器核200设置在处理器核200中的事务失败原因寄存器(未示出)以指示存储器事务的失败的原因。分支指令404调用的失败处置器例程可以可选地基于事务失败原因寄存器的内容选择重新尝试存储器事务400,或者回滚至更多常规锁定机制。
在执行存储器事务期间,事务体406向分布式共享存储器***存储的值(即在存储器事务的存储印记中的值)仅对执行存储器事务的处理器核200的线程可见。在相同或者其它处理器核200上运行的线程直至存储器事务成功提交、并且仅在存储器事务成功提交的情况下才将看见这些值。
为了存储器事务成功提交,在事务体406中的加载和存储指令必须以原子方式(即对于在存储器事务的加载和存储印记中的高速缓存行必须无冲突)完成,并且在事务体406中的存储指令的效果必须向在数据处理***100中的所有处理单元104传播并且无效化那些高速缓存行的在其它处理单元104中保持的任何高速缓存的拷贝。如果这两个条件在执行tend指令408时成立,则事务控制逻辑382经由通行/失败指示384向处理器核200指示存储器事务400向L2高速缓存230使在事务体406中执行的所有存储通行并且向L2高速缓存203提交这些存储、因此使它们同时对在***中的所有其它线程和处理器核200可见。
在以下讨论中,如果加载或者存储指令在存储器事务400的事务体406内出现,则该加载或者存储指令将称为“事务性的”。相似地,加载或者指令如果它在事务体406以外出现则将称为“非事务性的”。在一个示例实施例中,数据处理***100的冲突策略定义与另一处理器核的存储器访问的冲突在若干可能情况中的任一情况下对于给定的存储器事务出现。在第一情况下,如果来自另一处理器核200的非事务性存储命中在给定的存储器事务的加载或者存储印记内的高速缓存行,则冲突出现。在第二情况下,如果来自另一处理器核200的事务性存储命中在给定的存储器事务的加载印记内的高速缓存行,则冲突出现。在第三情况下,如果非事务性加载命中在给定的存储器事务的存储印记内的高速缓存行,则冲突出现。在第四情况下,如果来自另一处理器核200的事务性加载命中在给定的存储器事务的存储印记内的高速缓存行,则冲突出现。此外,给定的存储器事务在它的事务性存储之一命中在另一处理器核的存储器事务的存储印记中已经存在的地址的情况下具有冲突。这一示例冲突策略仅为事务性存储器的若干可能实施例之一。以上冲突策略偏向比事务性加载有利于事务性存储而允许事务性和非事务性加载自由混合。
现在参照图5,图示包含挂起区域的有代表性的存储器事务500。如通过比较图4-5可见,存储器事务500包括与以上描述的tbegin指令402、分支指令404、事务体406和tend指令408对应的tbegin指令502、分支指令504、事务体506和tend指令508。此外,存储器事务500包括发起挂起区域512的开始的tsuspend指令512。在通过执行tsuspend指令512挂起存储器事务时,当前为包含挂起区域512的封包存储器事务而建立的加载和存储印记保持于适当处并且继续被TM跟踪逻辑381跟踪冲突。然而在挂起区域512内的任何加载或者存储指令视为非事务性加载和存储并且遵循用于这样的加载和存储的现有语义。具体而言,在挂起区域512内的存储为非事务性的并且将提交而且无条件地向其它处理器传播。如果在挂起区域512内的存储命中封包存储器事务的加载或者存储印记,则冲突出现(这也破坏在存储印记中的高速缓存行的试探事务版本)并且被事务控制逻辑382登记。然而这一冲突直至在执行tresume指令514时恢复封包存储器事务才被作用,在这一点,处理器核200如描述的那样向分支指令504传递控制。如果在挂起区域512内的非事务性加载命中在封包存储器事务500的存储印记内的高速缓存行,则该加载指令返回在事务体506内的事务性存储所写入的试探地更新的值,除非该值已经被另一处理器核200的非事务性存储或者被在挂起区域512中的非事务性存储改写,在该情况下,非事务性加载指令返回目标位置的当前值。
对挂起区域512的使用允许暂时挂起存储器事务,这允许在挂起区域512中的存储指令无条件地更新在分布式共享存储器***中的位置而又也允许在以后时间恢复存储器事务。用于挂起区域512的一个可能使用是向分布式共享存储器***的暂存器区域中登记调试信息、然后恢复封包存储器事务。在无挂起区域的情况下,调试信息的写入将在中止封包存储器事务的任何时间被回滚。
现在参照图6A,示出举例说明在多处理器数据处理***中的因果性性质的示例程序的执行。如这里所用,定义“因果性”——该因果性是在多处理器程序中的希望的性质——为如果在执行多处理器程序期间给定的执行线程不能在给定的线程可以读取引起计算的写入之前读取该计算的效果则被保留。
在图6A中给出的简化示例(以及以下参照图6B-6C讨论的示例)中,多处理器程序由数据处理***100的为了易于参考而标注为处理器核0、处理器核1和处理器核2的三个处理器核200执行。在图6A中,处理器核0执行向在分布式共享存储器***中的地址A写入值1的存储指令600。地址A的这一更新向处理器核1传播,并且处理器核1执行的加载指令610因此返回值1。即使存储指令600进行的存储器更新已经向处理器核1传播,该存储器更新可以尚未向处理器核2传播。如果存储指令614在处理器1上执行并且关联存储器更新在存储指令600的存储器更新向处理器2传播之前向处理器2传播,则将违反因果性,因为向地址B存储值1——这是向地址A存储的效果——将在与因果存储指令600关联的存储器更新对处理器核2可见之前对处理器核2可见。
为了保证在弱一致性存储器模型中的因果性,阻塞指令612(例如SYNC)保证存储指令614直至加载指令610已经绑定到它的值则才生效或者开始向其它处理器核传播它的存储器更新。此外,阻塞指令612也保证与存储指令600关联的存储器更新在与存储指令614关联的存储器更新之前向处理器2传播。因此,保留因果性,因为计算的原因(即存储指令600的存储器更新)在计算的结果(即存储61的存储器更新)之前对处理器核2可见。阻塞指令622也由处理器核2执行以保证处理器核2执行加载指令620和624并且按顺序绑定它们的值、因此确保处理器核恰当遵从处理器核0和处理器核1进行的存储器更新。
现在参照图6B,图示在存储器事务方面表现的图6A的多处理器程序的一个示例实施例。在图6B中,为了简化而省略向存储器事务失败处置器的分支指令。
如图所示,处理器核0执行存储器事务630,该存储器事务包括tbegin指令632、tend指令636和事务体,该事务体包括向地址A存储值1的存储指令634。在执行tend指令636时,存储器事务600成功提交并且使对地址A的更新同时对所有其它处理器核可见。具体而言,截至在处理器核1上执行的存储器事务640的加载指令642可以从地址A读取值1,在处理器核2上执行的存储器事务650的加载指令654也必须能够读取用于地址A的值1。存储器事务640然后用于地址A的值1、向地址B存储值1并且成功提交。最后,存储器事务650的加载指令652读取用于地址B的值1,并且考虑到存储器事务640读取用于A的值1,加载指令654必须也读取用于地址A的值1。
为了使在成功事务中的存储指令的存储器更新同时对所有其它处理器核可见,在该存储器事务可以提交之前,存储器事务必需的所有存储器线无效化必须已经经过数据处理***传播,从而任何其它处理器核的、更新的高速缓存行的现在陈旧拷贝已经被去除(例如无效化)并且不再能够由其它处理器核读取。如果无这一要求,处理器核可能在更新存储器位置的存储器事务提交之后仍然读取用于更新的存储器位置的陈旧值。处理器核因此需要保证与经过数据处理***完全传播与它自己的事务性存储关联的存储器更新以在提交成功存储器事务之前无效化任何陈旧的高速缓存的拷贝以便维持存储器事务的语义。由于传播在存储器事务的语义中固有的存储器更新,所以在仅存储器事务用来访问在分布式共享存储器***中的存储器位置时平凡地保留因果性。然而在事务和非事务代码对相同共享变量交互时,未通过保证存储器事务进行的存储器更新同时对所有其它处理器核可见来直接保留因果性。
现在参照图6C,描绘说明性多处理器程序,该多处理器程序包括对分布式共享存储器***的事务和非事务访问的混合。在示例多处理器程序中,处理器核0执行无条件地向在分布式共享存储器***中的地址A写入值1的非事务性存储指令660。这一个值向处理器核1传播并且由在处理器核1执行的存储器事务670内的事务性加载指令672读取。处理器核1然后执行在存储器事务670内的存储指令674——该存储指令更新与地址B关联的高速缓存行并且完成无效化与地址B关联的高速缓存行的任何陈旧的高速缓存的拷贝(从而无其它处理器核保持现在陈旧的高速缓存行的拷贝)——并且在执行tend指令676时成功提交存储器事务670。处理器核2然后执行加载指令680和684以基于阻塞指令682实行的排序按顺序读取分别与地址B和A关联的高速缓存行。如果事务670仅保证在提交之前完全传播它自己的存储器更新,则存储指令660的存储器更新可以已经或者可以尚未向处理器核2传播。因此,在至少一些操作场景中,处理器核2可以读取用于与地址B关联的高速缓存行的值1和用于与地址A关联的高速缓存行的现在陈旧的初始值0、因此违反因果性。如果处理器核2如在图6B中为处理器2描绘的那样利用事务性加载以从地址A和地址B读取,则将获得相同结果。
为了保障因果性,存储器事务670必须保证不仅遍及整个分布式共享存储器***传播它自己的事务性存储而且在事务内的事务性加载所读取的任何非事务性存储也已经遍及分布式共享存储器***传播。(保障存储器事务读取的事务写入的存储器更新已经遍及分布式共享存储器***传播,因为那些存储器更新在它们对整个分布式共享存储器***可见之前不能由事务670读取)。为了保证也遍及分布式共享存储器***传播存储器事务670读取的非事务性存储的存储器更新,存储器事务670的tend指令676的处理必须直至遍及分布式共享存储器***传播存储器事务670读取的任何非事务性存储的存储器更新才允许提交存储器事务670。
现在参照图7,图示图1的数据处理***100的部分视图,该数据处理***执行图6C的多处理器程序。在图7中给出的视图中,处理器核200a、200b和200c分别对应于图6C的处理器核0、1和2。另外,因果性分解逻辑379的实例被实例化用于探听器311的每个实例并且耦合到该每个实例例如作为附属于每个处理器核200的L2高速缓存230的部件。
初始地,处理器核200c在它的L1高速缓存226c中保持存储器位置A的初始值(例如0)的高速缓存的拷贝。处理器200a通过执行存储指令660来开始执行图6C的多处理器程序。响应于执行存储指令660,处理器核200a向它的L2高速缓存230a发送存储请求,该L2高速缓存分配RC机器312以服务于存储请求。RC机器312向本地互连114广播存储器请求,并且附属于处理器核200c的L2高速缓存230c的探听机器311c寄存该存储请求、包括追溯存储请求的处理单元(即包括处理器核200a的处理单元)。在这一点,存储指令660的存储器更新尚未向处理器核200c传播、但是代之以被排队用于以后处理从而有利地允许处理器核200a在完全传播对存储指令660的存储器更新之前继续执行进一步指令。
处理器核200b然后执行加载指令672并且在它的L1高速缓存226b中未发现与地址A关联的目标高速缓存行的拷贝而向它的L2高速缓存230b发送读取请求。响应于读取请求,L2高速缓存230b分配RC机器312b以服务于读取请求。响应于读取请求在L2高速缓存230b中未命中,RC机器312b向本地互连114上发布读取请求以获得用于地址A的当前值。L2高速缓存230b对读取请求做出响应并且通过高速缓存到高速缓存干预来向处理器核200b提供地址A的当前值。在这一点,所谓“因果性通行读取”已经出现,也就是说,加载指令672已经读取尚未遍及整个分布式共享存储器***传播的存储指令的值。为了考虑这一事实并且保护因果性,在L2高速缓存230c中的因果性分解逻辑379c对于探听机器311c当前正在无效化的地址指出在处理器核200a和200b的竖直高速缓存分级之间的成功读取干预。以这一方式,因果性分解逻辑379c直接跟踪处理器200b及其竖直高速缓存分级对存储指令660的存储器更新完成它的传播而具有的因果依赖性。
处理器200b执行存储指令674,该存储指令指定将地址B的值更新成1。响应于执行存储指令674,RC机器312b在本地互连114上发布与存储指令674对应的存储请求。在不存在目标高速缓存行的现有高速缓存的拷贝时,存储器控制器106响应于存储请求而从***存储器108供应地址B的当前值,并且RC机器312b相应地更新L2高速缓存230b。在这一点,处理器核1执行tend指令676以尝试成功提交事务670并且在本地互连114上放置对应TEND请求,以保证存储器事务670中的事务性存储进行的所有在先存储器更新已经被遍及分布式共享存储器***地传播,并且存储器事务670读取的非事务性存储进行的任何存储器更新已经类似地被遍及分布式共享存储器***地传播。在这一情况下,存储指令674的存储器更新已经遍及分布式共享存储器***完全传播,因为无其它高速缓存保持与地址B关联的高速缓存行的拷贝。然而如果存在任何这样的拷贝并且存储器更新尚未完全完成,则在指出初始处理器核200发布存储的那些高速缓存中的探听机器311将活跃并且将提供对来自处理器核200的探听的TEND请求的重试响应(迫使重新发布TEND请求)直至高速缓存行的高速缓存的拷贝的无效化完成。
在当前情况下,TEND请求并不来自发起存储请求的处理器核200,因此探听机器311c将未提供对TEND请求的重试响应。然而随意性分解逻辑379c具有对于处理器200b及其竖直高速缓存分级的因果依赖性并且在本地互连114上发布对TEND请求的重试响应,因为TEND请求是从处理器核200发布的,该处理器核是探听机器311c正在处理的相同地址的因果性通行读取的接收方。以这一方式,因果性分解逻辑379直接跟踪哪些处理器核200由于读取对于因果性分解逻辑379与之关联的、处理器核未完全完成的、非事务性存储的存储器更新而具有因果性依赖性。
应当指出,一般而言,因果性分解逻辑379必须维持能够代表在数据处理***中的所有处理器核200的列表以在因果性依赖性链穿过多于一个处理器核(例如如下测试,其中第一处理器存储位置,第二处理器读取该位置、然后存储第一标志变量,第三处理器加载第一标志变量并且在事务中写入第二标记,继而最终线程读取第二标志、然后读取初始位置)的情况下提供因果性。在这样的实现中,重试从对与因果性分解逻辑379的实例关联的探听机器311正在无效化的目标地址有因果依赖性的任何处理器核发布的TEND请求。然而在大型SMP中,这样的实施例可能成本方面受到抑制,并且因果性分解逻辑379的许多实现方式仅精确地跟踪某个固定深度(例如两个或者三个处理器的因果依赖性链)而且在存在更长依赖性链时求助于悲观地重试所有TEND请求直至存储指令必需的高速缓存行无效化已经完成处理。
概括而言,因果性分解逻辑用来检测因果依赖性链在尚未遍及整个分布式共享存储器***完成处理的未决存储上出现至该实施例确定的深度。这些因果依赖性用来推迟完成对未完成(未决)存储有因果依赖性的那些处理器核的TEND请求。以这一方式,存储器事务直至存储器事务已经读取的存储(即在存储器事务的因果依赖性链中的存储)已经先遍及分布式共享存储器***完成才能完成(因此使它自己的存储可见)。仅在存储器事务的因果依赖性链中的这些存储(和存储器事务本身的事务性存储,尽管这由探听器311而不是因果性分解逻辑379保障)已经完成之后,TEND请求才可以完成,从而造成存储器事务如果无冲突已经在它的执行期间出现则成功提交。
在其它实施例中,可以要求附加因果性分解逻辑保证存储器操作的因果性。例如在包含多线程处理器核共享的写入-直通L1高速缓存、跟随有共享L2存储队列的实现中,不同线程(例如从软件的观点来看在逻辑上不同的处理器核)有可能在这些存储甚至已经向L2高速缓存、更不用说向整个分布式共享存储器***传播之前从L1高速缓存读取存储的值。在这样的实现中,tend指令必须充当用于在给定的线程中的事务性存储的阻塞。这一行为保证向***互连和必需探听机器311传播事务性存储,从而tend指令可以在试着完成存储器事务时保证存储器事务的存储所需要的所有高速缓存行无效化已经完全传播。此外,tend指令必须充当用于在事务内的事务性加载已经(或者可能已经)读取的非事务性存储的阻塞。在最简单(和最常见)实施例中,为了重试TEND请求,在共享存储队列内的所有非事务性存储被视为如同它们来自单个线程。
以这一方式,在本地互连114上呈现来自该多线程处理器核的用于任何事务的TEND请求之前根据需要向探听机器311广播任何事务已经(或者可能已经)从其读取的尚未完全传播的所有非事务性存储。在这样的实施例中,探听机器311以统一方式对待来自给定的多线程处理器核的所有存储,并且将根据需要,不考虑线程都重试来自该给定的多线程处理器核的任何TEND请求。在这一实施例中,因果性分解逻辑379未参与监视这些核内依赖性、但是代之以仅用来管理在多线程处理器核之间的因果性依赖性。
必需因果性分解逻辑的确切布局和细节将随着给定的实施例的细节而变化并且将在被给予这里的教导的本领域技术人员所清楚。一般而言,在任何点——在该点,加载可以返回尚未遍及整个分布式共享存储器***完全传播的存储的值——必须提供用于保证指出与不同处理器核有因果依赖性的任何存储的机制,并且该因果依赖性延迟结束存储器事务的tend指令(或者其它语义)的处理直至比如在存储器事务的因果依赖性链中的存储已经完成传播这样的时间。
现在参照图8,描绘根据一个实施例的终止存储器事务的tend指令的处理的高级逻辑流程图。该过程例如响应于发起在处理器核200的LSU202内执行tend指令而在块800开始。图8从块800向如下块801继续,该块描绘LSU202保证所有在先挂起模式加载指令和所有在先事务性加载指令让它们的值绑定。这一校验保证事务性加载指令存在于存储器事务的印记中并且挂起模式加载指令已经获得它们的值。该过程从块801向如下块802继续,该块描绘保证已经遍及分布式共享存储器***完全传播在存储器事务内的事务性存储必需的高速缓存行无效化。在以上描述的实施例中,通过一个或者多个探听机器311在本地互连114上提供任何适用TEND请求直至先前事务性存储已经无效化存储器更新作为目标的存储器位置的所有高速缓存的拷贝来实现验证事务性存储必需的高速缓存行无效化的传播。该过程然后继续步骤804,该步骤图示保证在因果上有依赖的非事务性存储必需的高速缓存行无效化已经遍及分布式共享存储器***完全传播。在以上描述的实施例中,通过因果性分解逻辑379的一个或者多个实例在本地互连114上提供任何适用TEND请求直至在因果上有依赖的非事务性存储的先前存储器更新已经无效化存储器更新作为目标的存储器位置的所有高速缓存的拷贝来实现验证非事务性存储必需的高速缓存行无效化的传播。
在块806,事务控制逻辑382确定冲突是否对于存储器事务已经出现。响应于事务控制逻辑382确定冲突已经出现,该过程继续块808,该块描绘事务控制逻辑382无效化存储器事务的(例如如在L2高速缓存230中记录的)试探存储印记并且经由通行/失败指示384指示存储器事务已经失败。如在块808进一步所示,响应于通行/失败指示384,处理器核200更新它的条件码寄存器并且向在存储器事务内的失败处置分支指令传送控制(块808)。该过程然后在步骤812终止。
回到块806,响应于事务控制逻辑382确定无冲突已经在执行存储器事务期间出现,该过程继续步骤810,该步骤描绘TM控制逻辑382通过使事务印记被提交到分布式共享存储器***(例如通过更新在L2高速缓存230的目录308中的一个或者多个相干性状态)并且经由通行/失败指示384向处理器核200指示存储器事务通行来提交事务以及其它操作。该过程然后在块812终止。
存储器事务如以上描述的那样使程序员能够实行数据处理***以原子方式执行加载和/或存储指令组,并且使存储器事务失败以及根据需要重复存储器事务以保留存储器事务的存储访问在存在与其它存储访问的冲突时的原子性出现。尽管存储器事务提供有价值和需要的能力,但是也需要能够推测地执行具体包括存储指令的指令块、然后能够在软件控制之下丢弃该执行的结果而未考虑冲突访问的存在。例如一些编程模型要求某些码序列的执行未引起故障。为了避免这样的故障,通常要求附加码序列证实向码序列的输入将在执行序列之前未产生故障。这一预先证实可能引起显著附加开销。然而有了如这里描述的“仅倒回”事务(ROT),可以推测地执行码序列而无附加证实开销,并且如果故障出现则可以倒回码序列。
已经传统地在现有处理器中未支持丢弃或者“倒回”存储指令的存储修改效果,因此严格地限制为存储指令(和为依赖于该存储指令的指令)允许的推测数量。如这里描述的那样,可以适配、重用和扩展支持事务性存储器的机制以高效地支持用于指令块、具体为包括存储指令的指令块的可丢弃推测执行机制。如果没有这里描述的增强,将以如以下描述的附加代价要求全存储器事务倒回存储指令。
为了支持倒回存储指令的存储修改效果,引入这里称为“仅倒回”事务(ROT)的不同存储器事务类型。不同于传统存储器事务,ROT按照定义无需任何冲突检测或者原子性保障、但是实际上仅提供用于实行丢弃可以包括一个或者多个存储指令的一组一个或者多个推测地执行的指令的执行结果的语义。另外,ROT的提交未依赖于或者要求如以上参照图8的块804描述的那样经过分布式共享存储***传播在因果上有依赖的非事务性存储的无效化。
尽管对于ROT的语义定义无需冲突检测,但是典型实现将提供用于在ROT内的存储指令的冲突跟踪、只要避免在处理器核和高速缓存分级的设计中的附加不必要复杂性而附加益处很少。因此,尽管按照定义对于ROT无需冲突跟踪(因为ROT未保留原子性),但是按照实现方式,支持执行ROT的硬件为了简化而通常将提供用于ROT的存储印记的冲突跟踪。
可以在多线程处理器核上的共享公共写入-直通L1高速缓存的不同线程之间的冲突管理中看见保持用于ROT的存储印记冲突跟踪的效用。在这样的多线程处理器核中,如果多个线程并行执行包括以给定的高速缓存行为目标的存储指令的ROT,则L1高速缓存将必须能够维持给定的高速缓存行的用于每个线程的不同映像(即L1高速缓存将必须能够保持任何给定的高速缓存行的多个并行活跃映像)。另外,在每个ROT提交时,L1高速缓存将必须能够将提交ROT的线程对高速缓存行进行的更新合并成高速缓存行的一个或者多个剩余并行拷贝——异常复杂的操作。一般而言,将现有冲突跟踪机制运用于ROT的存储印记是远远更高效和更少成本的,就如同它是非ROT存储器事务一样。
通常,加载指令将数目显著地超过在存储器事务中的存储指令。对于给定的容量的TM控制逻辑380,因此可以容纳显著地更大的事务作为ROT而不是非ROT存储器事务(该非ROT存储器事务在不存在ROT时将必须被运用于倒回推测地执行的存储指令)。另外,ROT可以在存在错误共享冲突(即例如在来自另一线程的存储指令在存储器事务的印记中的高速缓存行内写入、但是未实际地变更存储器事务正在操纵的数据时出现的冲突)时成功完成。由于是在每高速缓存行基础上而不是在每位置基础上跟踪冲突,所以这样的错误共享冲突引起存储器事务的定义未严格需要、但是由于冲突跟踪实现方式的限制而必须出现的存储器事务失败。然而ROT在存在这样的错误共享冲突时比将必须在不存在对于ROT的支持时使用的非ROT存储器事务更弹性。
现在参照图9,图示有代表性的ROT900的示例。ROT900可以例如形成多处理器程序的部分。
ROT900从唯一指令tbegin_rot902开始,该指令标识ROT的开始。与图4的正常(即非ROT)存储器事务400相似,紧接地跟随指令tbegin_rot902的指令是分支指令904,该分支指令响应于ROT900失败(或者如以下说明的那样)在软件控制之下中止而将执行重新引向失败处置例程。分支指令904跟随有事务体906,该事务体可以包含事务性存储器访问(例如加载和/或存储)或者其它智能以及可能包含一个或者多个tabort指令910。如果存在,则tabort指令910指引中止ROT900的执行并且丢弃ROT900的执行结果。虽然在图9中未图示,但是ROT900还可以可选地包括绕过指令,这些绕过指令确定是否应当中止ROT900(例如基于ROT的事务性加载从分布式共享存储器***读取的变量值或者***资源的可用性)并且响应于该确定而使tabort指令910被执行或者使执行绕过tabort指令910向包括tend指令908的一个或者多个事务指令分支,该tend指令在执行时使ROT900被提交(并且具体为使在事务体906内的存储指令的存储修改效果非推测)。
如果执行在ROT900内的tabort指令910,则丢弃ROT900的执行结果,更新条件码寄存器以指示tabort指令910使ROT失败,并且控制向基于在条件码寄存器中存在的值而取用的分支指令904传递。执行tabort指令910是丢弃ROT900的推测执行结果的主要方式,并且经由分支指令904向失败处置器传递控制。除了其它原因之外,ROT900(或者非ROT存储器事务)也可能由于容量溢出(使TM逻辑380的容量溢出)或者由于执行可能具有未跟踪的副作用、因此固有地不能被重新执行并且因而不能在(可能必须被执行若干次以成功提交)ROT或者存储器事务中合法地出现的指令(例如高速缓存禁止的加载或者存储指令)而失败并且经由分支指令904(或者分支指令404)向故障处置器传递控制。
现在参照图10,图示根据一个实施例的TM跟踪逻辑381的更具体视图。如描绘的那样,TM跟踪逻辑381包括TM目录1000,该TM目录包含用于跟踪在ROT和/或非ROT存储器事务的加载和存储印记内的高速缓存行的多个条目1002。在描绘的实施例中,在TM目录1000内的每个条目1002包括三个字段:地址标签字段1004、加载有效(LV)字段1006和存储有效(SV)字段1008。地址标签字段1004指示在ROT或者非ROT存储器事务的印记内的高速缓存行的实际存储器地址。SV字段1006和LV字段1008分别指示高速缓存行是存储器事务的存储印记或者加载印记的部分。在至少一个实施例中,LV字段1006和SV字段1008互斥,这意味着对于给定的条目1002,可以并行设置LV字段1006和SV字段1008之一或者均不设置、但是不能都设置。在重置字段1006和1008二者时,条目1002无效,然后该条目1002不对高速缓存行进行跟踪。
对于非ROT存储器事务,在向TM逻辑380呈现事务性加载并且在TM目录1000中无用于事务性加载的目标高速缓存行的条目时,分配新条目1002(可能驱逐现有条目1002),用目标高速缓存行的地址标签更新新条目的地址标签字段1004,并且设置LV字段1006。在另一方面,如果现有条目1002已经跟踪目标高速缓存行(因此已经设置LV字段1006或者SV字段1008),则不进行对现有条目1002的更新,因为已经对事务性加载的目标高速缓存行进行跟踪。
与事务性加载一样,如果未向TM逻辑380呈现非ROT存储器事务的事务性存储并且在TM目录1000中无用于事务性存储的目标高速缓存行的条目,则分配新条目1002(可能驱逐现有条目1002)并且用目标高速缓存行的地址标签更新新条目的地址标签字段1004而且设置SV字段1008。在另一方面,如果现有条目1002已经对目标高速缓存行进行跟踪并且为该条目1002设置LV字段1006,则重置LV字段1006并且设置SV字段1008以指示这一高速缓存行现在是用于存储器事务的存储印记的部分。如果已经为现有条目1002设置SV字段1008,则不执行对条目1002的更新。
响应于ROT或者非ROT存储器事务提交或者失败,TM跟踪逻辑381清除在TM目录1000中的条目1002。
对于ROT,TM跟踪逻辑381更新用于非ROT存储器事务的事务性存储的如以上描述的TM目录1000。然而对于在ROT内的加载,TM跟踪逻辑381不更新TM目录1000,因为加载印记不被跟踪在ROT中的冲突。可以用至少两种方式实施这一行为。在第一实现方式中,标识从处理器核200向它的L2高速缓存230发送的所有非事务性加载和存储操作为非事务性加载或者存储、非ROT事务性加载或者存储或者为ROT事务性加载或者存储。在这一情况下,TM跟踪逻辑381忽略用于更新TM目录1000的ROT事务性加载。在另一实现方式中,所有非事务性加载和存储以及ROT加载被标识为非事务并且相应地被TM跟踪逻辑381忽略用于更新TM目录1000。标识ROT事务性存储以及非ROT事务性加载和存储,并且TM跟踪逻辑381相应地更新用于非ROT事务性加载和存储的如以上描述的更新TM目录1000。在任一实现方式中,TM跟踪逻辑381优选地不更新用于ROT事务性加载的TM目录1000。
现在参照图11,图示根据一个实施例的终止非ROT存储器事务或者ROT的tend指令的处理方法的高级逻辑流程图。为了易于理解,相似标号用来表示与在图8中描绘的步骤对应的步骤。
图11的过程例如响应于发起在处理器核200的LSU202内执行tend指令而在块800开始。LSU202然后在块801保证所有之前的挂起模式加载指令和所有之前的非ROT事务性加载指令的值被绑定。这一校验保证非ROT事务性加载指令存在于存储器事务的印记中并且挂起模式加载指令已经获得它们的值。LSU202然后在块1100确定tend终止的存储器事务是ROT还是非ROT存储器事务。响应于确定存储器事务为非ROT存储器事务,该过程继续已经描述的块802和后续块。
回到块1100,响应于确定tend指令终止ROT,认为块802、804和806对ROT不必需而绕过,并且控制向块1102传递。块1102描绘LSU202向TM逻辑380查询TM跟踪逻辑381是否检测到用于ROT的存储印记的冲突(有别于在用于非ROT存储器事务的加载或者存储印记上的冲突)。响应于TM逻辑380指示已经对于ROT的存储印记检测到冲突,该过程继续块808,该块描绘如以上描述的那样ROT失败并且无效化它的存储印记。响应于TM逻辑380在块1102指示尚未检测到用于ROT的冲突,该过程继续块810,该块图示如以上描述的那样向分布式共享存储器***提交ROT。同样应当指出ROT的提交无需如以上参照块804描述的那样遵循随意性。在块808或者块810之后,该过程在块812结束。
在至少一些实施例中,可以嵌套包括ROT和/或非ROT事务的存储器事务至任何任意深度,这意味着ROT或者非ROT事务可以包含一个或者多个其它存储器事务。在至少一些实施例中,优选地运用所谓“平坦嵌套”,其中在最外存储器事务内包含的存储器事务被最外封包存储器事务蕴含成作为整体提交或者作为整体失败的单个存储器事务。
现在参照图12,图示包含嵌套存储器事务的有代表性的非ROT存储器事务1200。存储器事务1200可以例如形成多处理器程序的部分。
同前,最外或者封包存储器事务1200在跟随有分支指令1204的tbegin指令1202开始,该分支指令如果取用指示的分支则调用执行第一失败处置器例程。最外存储器事务1200还包括事务体1206,该事务体包括事务性存储器访问(例如加载和/或存储)指令并且可选地包括一个或者多个附加指令。
事务体1206还包括跟随有分支指令1216的tbegin指令1210发起的嵌套存储器事务1208,该分支指令如果将取用指示的分支时将使执行重新引向与嵌套存储器事务1208关联的第二失败处置器。嵌套存储器事务1208还包括事务体1212,该事务体包括一个或者多个事务性存储器访问(例如加载和/或存储)指令、零个或者更多可选附加指令和tend指令1214。
在所示示例中,将从不取用向第二失败处置器例程的分支,因为对于存储器事务1200检测到的任何冲突将使执行重新引向分支指令1204。尽管有这一事实,但是由于难以预先确定是否将执行存储器事务作为嵌套存储器事务的部分而通常为所有存储器事务提供向失败处置器例程的分支指令。(例如给定的存储器事务可以被直接执行或者可以备选地被执行作为在另一存储器事务内的函数调用的部分。在前一种情况下,将不嵌套存储器事务,而在后一种情况下,将嵌套存储器事务)。
为了实现以上指出的“平坦嵌套”,存储器事务1200的加载和存储印记在事务体1206和1212内分别包括事务性加载和存储指令访问的存储器地址的集合。此外,如果将在存储器事务1200内任何处执行tabort指令,则控制向分支指令1204传送。实质上,嵌套存储器事务1208的tbegin指令1210和tend指令1214除了如以下描述的那样使得对嵌套级寄存器和事务模式寄存器进行更新之外如同nop(noop)指令一样作用。还应当指出存储器事务1208可以被ROT更换而嵌套存储器事务的处置无任何改变。
在至少一些实施例中,也可以在ROT内嵌套一个或者多个ROT或者非ROT存储器事务。例如图13图示在跟随有分支指令1304的tbegin_rot指令1302处开始的ROT130,该分支指令如果取用指示的分支则调用第三失败处置器例程的执行。ROT1300还包括事务体1306,该事务体包括事务性存储器访问(例如加载和/或存储)指令、可选地包括一个或者多个附加指令以及可选地包括tabort指令1320。在所示示例中,事务体1306还包括如先前描述的嵌套非ROT存储器事务1208。在一个优选实施例中,如以上参照图9-11描述的那样处置先于嵌套非ROT存储器事务(例如存储器事务1208)的在ROT内的事务性存储器访问指令(例如ld A和st B)作为ROT事务性存储器访问,并且如以上参照图7-8描述的那样处置落在嵌套非ROT存储器事务内或者跟随嵌套非ROT存储器事务的在ROT内的事务性存储器访问指令(例如ld C、ld D、st E、st F和ld G)作为非ROT事务性存储器访问。换而言之,一旦嵌套存储器事务在初始tbegin指令或者在后续嵌套tbegin指令(比如在ROT1300中的tbegin指令1210)进入非ROT模式,存储器事务无论存储器事务类型如何对于所有嵌套存储器事务中的其余嵌套存储器事务保持于非ROT模式中。以这一方式,嵌套事务保持ROT的优点直至遇到在嵌套事务的总汇集中的第一、潜在地嵌套的非ROT事务。
为了支持嵌套存储器事务,优选地如在图14中描绘的那样扩充TM跟踪逻辑381。如描绘的那样,除了先前描述的TM目录1000之外,TM跟踪逻辑381优选地对于处理器核200的每个线程包括相应事务模式寄存器1400、嵌套级寄存器1402和事务状态寄存器1404。事务模式寄存器1400指示在关联线程的执行之下的存储器事务的当前模式(例如ROT或者非ROT)。对于其中所有嵌套事务是相同类型的嵌套存储器事务,事务模式寄存器1402被设置于最外tbegin或者tbegin_rot指令并且遍历嵌套存储器事务保持它的值。嵌套级寄存器1402指示在关联线程的执行之下的存储器事务的当前嵌套深度。在嵌套访问事务内的每个tbegin或者tbegin_rot,递增嵌套级寄存器1402,在嵌套事务内的每个tend指令,递减嵌套级寄存器1402。如果嵌套级超过嵌套级寄存器1402可以表达的嵌套深度,则tbegin指令执行失败从而设置条件码并且调用失败处置器例程的执行。事务状态寄存器1404指示用于处理器核200的关联线程的当前事务状态。例如事务状态寄存器1404如果线程未正在执行属于存储器事务的指令则指示“空闲状态”、如果线程正在执行在尚未失败的存储器事务内的事务指令则指示“事务通行”状态、如果线程正在执行在已经失败的存储器事务中的事务指令则指示“事务失败”、如果线程正在执行在尚未失败的挂起存储器事务中的非事务指令则指示“挂起通行”状态并且如果线程正在执行已经失败的挂起存储器事务中的非事务指令则执行“挂起失败”状态。TM跟踪逻辑381根据数据处理***100实施的冲突策略设置每个线程的事务状态寄存器1404。
现在参照图15,描绘与界定可能不同类型(ROT和/或非ROT存储器事务)的嵌套存储器事务的指令(例如tbegin、tbegin_rot和tend指令)对应的事务性存储器请求的处理的高级逻辑流程图。所示过程在块1500开始并且继续块1502,该块描绘TM逻辑380确定是否已经从附属处理器核200接收与发起存储器事务的tbegin或者tbegin_rot指令对应的tbegin或者tbegin_rot请求。如果不是,则该过程向以下描述的块1502传递。如果是,则该过程继续块1504,该块描绘TM控制逻辑382测试嵌套级寄存器1402以确定存储器事务的嵌套是否已经达到它的例如如嵌套级寄存器1402的大小确定的最大支持深度。如果是,则TM控制逻辑382设置在处理器核200中的条件码寄存器以指示存储器事务嵌套已经超过最大可允许深度的错误条件(块1506)。该过程然后返回到已经描述的块1502。
回到块1504,响应于TM控制逻辑382确定未超过最大嵌套级,TM跟踪逻辑381设置事务模式寄存器1400以例如利用在块1508-1516所示过程来指示适当操作模式(即ROT或者非ROT)利用。具体而言,TM跟踪逻辑381在块1508确定嵌套级是否为零(即tbegin或者tbegin_rot请求是否对应于发起最外或者外包存储器事务)。如果不是,则该过程向以下描述的块1510传递。然而如果嵌套级等于零,则TM跟踪逻辑381在块1512进一步确定存储器事务是否为ROT(即存储器事务请求是tbegin_rot请求)。如果不是(即存储器事务请求是与非ROT存储器事务的tbegin指令对应的tbegin请求),则该过程继续块1516,该块图示TM跟踪逻辑381设置事务模式寄存器1400以指示非ROT模式。在另一方面,如果TM跟踪逻辑381在块1512确定存储器事务请求是与发起ROT的tbegin_rot指令对应的tbegin_rot请求,则TM跟踪逻辑381设置事务模式寄存器1400以指示ROT模式(块1514)。在块1514或者块1516之后,该过程然后继续以下描述的块1518。
现在参照仅如果检测到的存储器事务是在另一封包存储器事务内封包的嵌套锁存器事务则到达的块1510,TM跟踪逻辑381确定存储器事务请求是否为与tbegin指令发起的嵌套非ROT存储器事务对应的tbegin请求(有别于tbegin_rot)。如果是,则TM跟踪逻辑381在块1516设置事务模式寄存器1400以指示向非ROT模式的转变。然而如果TM跟踪逻辑381在块1510确定存储器事务请求是与发起嵌套ROT的tbegin_rot指令对应的tbegin_rot请求,则该过程然后直接继续块1518而未更新事务模式寄存器1400。概括而言,TM跟踪逻辑381响应于与tbegin和tbegin_rot指令对应的存储器事务请求(即tbegin和tbegin_rot请求)而将事务模式寄存器1400设置成与最外存储器事务的类型(ROT或者非ROT)对应的事务模式、并然后响应于遇到在最外存储器事务内嵌套的任何后续非ROT存储器事务而将事务模式寄存器1400设置成非ROT模式。
如在块1518描绘的那样,TM跟踪逻辑381响应于与发起存储器事务的tbegin或者tbegin_rot指令对应的tbegin或者tbegin_rot请求而也递增嵌套级寄存器1402以指示当前嵌套深度。该过程然后返回到已经描述的块1502。
现在参照块1520,TM控制逻辑381确定接收的请求是否为与执行终止存储器事务的tend指令对应的tend请求。如果不是,则该过程返回到块1502以如已经描述的那样等待接收下一tbegin、tbegin_rot或者tend请求。然而如果TM跟踪逻辑381确定存储器事务请求是通过在附属处理器核200中执行tend指令而生成的tend请求,则TM跟踪逻辑381查询嵌套级寄存器1402以确定当前嵌套级是否大于一,这指示tend指令未终止嵌套存储器事务汇集的最外访问事务。如果是,则TM跟踪逻辑381简单地递减嵌套级寄存器1402以更新当前嵌套深度(块1552)。在其它方面中,tend请求和关联tend指令如以上指出的那样视为no-op。该过程然后返回到块1502。
回到块1550,如果嵌套级寄存器1402具有不大于一的值,则该过程继续块1554,该块描绘TM跟踪逻辑381确定嵌套级寄存器1402指示的嵌套级是否等于一,这指示与接收的tend请求对应的tend指令是否终止最外存储器事务。如果是,则根据以上参照图11描述的过程处理tend请求(块1556)。此外,TM跟踪逻辑381如以上参照块1552描述的那样递减嵌套级寄存器1402指示的嵌套级。
回到块1554,如果嵌套级寄存器1402指示的嵌套级不是一,则嵌套级必须为零(即不是一或者大于一)。这一条件指示错误已经由于已经执行tend指令而无对应tbegin或者tbegin_rot指令而出现。因而,TM跟踪逻辑381设置错误指示以指示检测到这一错误(块1558。随后,该过程返回到块1502以等待下一tbegin、tbegin_rot或者tend请求。
如以上讨论的那样,给定的线程的存储器事务可以例如由于相同处理器核200的或者不同处理器核200的另一线程的存储器访问请求命中线程的加载或者存储印记而失败。例如可以利用如先前描述的L2高速缓存230的TM跟踪逻辑381实施的冲突策略来检测线程的失败。由于可以先在多个线程的存储器访问请求流之间的冲突的轨迹(例如L2高速缓存230的TM逻辑380)检测事务的失败,所以除非TM灭除指示385被更早接收和作用,线程可以继续执行在TM逻辑380已知失败的存储器事务中的存储器访问指令并且可以因而继续向L2高速缓存230发布存储器访问指令直至到达tend指令。
失败存储器事务的存储器访问请求可能对数据处理***100的操作具有许多不希望的影响。例如失败存储器事务的存储器访问请求消耗L2高速缓存230的有限资源(例如RC机器312)从而减少这样的资源可用于执行有效工作的线程。此外,执行失败事务的线程的存储器访问请求可能与另一线程的存储器事务的事务印记冲突从而不必要地引起原本成功完成的另一存储器事务的失败。另外,失败存储器事务的存储器访问请求可能污染L2高速缓存230的在线程之间共享的各种数据结构、包括高速缓存阵列302、目录308(包括其中包含的更换顺序(例如LRU)信息)以及如果在线程之间共享它则包括TM目录1000。为了消除这些不希望的影响,L2高速缓存230的分派流水线306优选地如参照图16进一步具体描述的那样限制分派L2高速缓存抑制失败的存储器事务的事务性存储器访问请求。
现在参照图16,描绘在高速缓存存储器中处置事务性存储器访问请求的示例方法的高级逻辑流程图。根据示例方法,分派流水线306基于关联处理器核200的给定的线程的当前事务状态对该线程的事务性加载和事务性存储请求不同地做出响应。
所示过程在块1600开始、然后继续块1602,该块图示分派流水线306等待经由复用器M2从在本地处理器核200上执行的线程接收下一存储器访问请求。分派流水线306例如通过参考在从复用器M2接收的存储器访问请求内的或者关联处理器核200与存储器访问请求关联地发送的标志的设置来确定存储器访问请求是否为关联处理器核200的线程的存储器访问请求。响应于分派流水线306在块1602确定从复用器M2接收的存储器访问请求来自在本地处理器核200上执行的线程,分配流水线306在块1604进一步确定存储器访问请求是否为事务性存储器访问请求。响应于在块1604确定存储器访问请求不是事务性存储器访问请求,该过程向块1606传递。块1060描绘分派流水线306受制于以上参照图3讨论的用于非事务性存储器访问请求的分派标准,并且如果被该分派标准指示则分派存储器访问请求。随后,该过程返回到块1602。
响应于在块1604确定存储器访问请求是事务性存储器访问请求,分派流水线306例如通过参考从TM事务逻辑381接收的事务状态指示383来确定发布事务性存储器访问请求的线程的事务状态是否为“通行”(即“事务通行”或者“挂起通行”)。响应于在块1608确定线程的事务状态是“通行”,该过程向块1606传递,该块图示分派流水线306受制于用于事务性存储器访问请求的分派标准(该分派标准可以与用于非事务性存储器访问请求相同或者不同)并且如果被该分派标准指示则分派存储器访问请求。然而如果分派流水线306在块1608确定发布事务性存储器访问请求的线程的事务状态是“失败”(即“事务失败”或者“挂起失败”),则该过程继续块1610。
块1610图示分派流水线306确定事务性存储器访问请求是事务性加载请求还是事务性存储请求。响应于分派流水线306在块1610确定存储器访问请求是事务性加载请求,则分派流水线306如在块1612所示使事务性加载请求分派失败(即未向RC机器312指派事务性加载请求用于服务)并且使TM_abort代码取代请求的加载数据被返回到关联处理器核200(例如经由数据路径耦合复用器M3和处理器核200)。TM_abort代码向在本地处理器核200上执行的线程提供存储器事务处于失败状态中的指示。响应于TM_abort代码,本地处理器核200的发布事务性加载请求的线程可以可选地在执行tend指令之前中止执行(并且可以可选地重启执行)存储器事务、因此保存原本浪费在执行在失败存储器事务中的后续存储器访问请求的资源。如在块1612进一步指示的那样,分派流水线306对事务性加载请求的处置保证未响应于事务性加载请求而对目录308进行更新(包括其中包含的更换顺序(例如LRU)信息)。如果在分派流水线306中足够早地进行在块1612确定分派失败以避免访问高速缓存阵列302则也是优选的。
响应于分派流水线306在块1610确定事务性存储器访问请求是事务性存储请求,则分派流水线306使事务性存储请求分派失败(即未向RC机器指派加载请求用于服务)并且从分派流水线306丢弃事务性存储请求(块1614)。如在块1614进一步指示的那样,分派流水线306对事务性存储请求的处置保证未响应于事务性存储请求而对目录308进行更新(包括其中包含的更换顺序(例如LRU)信息)。如以上指出的那样,如果在分派流水线306中足够早地进行在块1614确定分派失败以避免访问高速缓存阵列302则是优选的。应当认识在相同存储器事务中的以在块1614丢弃的事务性存储器请求的目标高速缓存行为目标的任何后续事务性加载请求将接收用于指示事务印记包含错误数据的TM_abort代码。在块1612或者块1614之后,图16的过程返回到已经描述的块1602。
根据图16的示例过程,未响应于失败存储器事务的事务性存储器访问请求而进行对高速缓存阵列302或者目录308的更新。因而,这些事务性存储器访问请求未消耗L2高速缓存230的有限资源(例如RC机器312),这样的事务性存储器访问请求未污染L2高速缓存230的高速缓存阵列302和目录308,并且相关数据和目录信息保持在L2高速缓存230中驻留而不是由于容量约束而被不必要地逐出。另外,失败存储器事务的事务性存储器访问请求未与其它本地或者远程执行的线程的未决存储器事务冲突、因此未引起这些未决存储器事务的失败。
图17是在半导体设计、制造和/或测试中使用的设计过程的流程图。图17示出了例如在半导体IC逻辑设计、仿真、测试、布图和制造中使用的示例性设计流程1700的方块图。设计流程1700包括用于处理设计结构或器件以产生上述以及图1-3,图7,图10和图14中示出的设计结构和/或器件的逻辑上或其他功能上等效表示的过程、机器和/或机制。由设计流程1700处理和/或产生的设计结构可以在机器可读传输或存储介质上被编码以包括数据和/或指令,所述数据和/或指令在数据处理***上执行或以其他方式处理时,产生硬件组件、电路、器件或***的逻辑上、结构上、机械上或其他功能上的等效表示。机器包括但不限于用于IC设计过程(例如设计、制造或仿真电路、组件、器件或***)的任何机器。例如,机器可以包括:用于产生掩模的光刻机、机器和/或设备(例如电子束直写仪)、用于仿真设计结构的计算机或设备、用于制造或测试过程的任何装置,或用于将所述设计结构的功能上的等效表示编程到任何介质中的任何机器(例如,用于对可编程门阵列进行编程的机器)。
设计流程1700可随被设计的表示类型而不同。例如,用于构建专用IC(ASIC)的设计流程1700可能不同于用于设计标准组件的设计流程1700,或不同于用于将设计实例化到可编程阵列(例如,由Inc.或Inc.提供的可编程门阵列(PGA)或现场可编程门阵列(FPGA))中的设计流程1700。
图17示出了多个此类设计结构,其中包括优选地由设计过程1710处理的输入设计结构1720。设计结构1720可以是由设计过程1710生成和处理以产生硬件器件的逻辑上等效的功能表示的逻辑仿真设计结构。设计结构1720还可以或备选地包括数据和/或程序指令,所述数据和/或程序指令由设计过程1710处理时,生成硬件器件的物理结构的功能表示。无论表示功能和/或结构设计特性,均可以使用例如由核心开发人员/设计人员实施的电子计算机辅助设计(ECAD)生成设计结构1720。当编码在机器可读数据传输、门阵列或存储介质上时,设计结构1720可以由设计过程1710内的一个或多个硬件和/或软件模块存取和处理以仿真或以其他方式在功能上表示例如图1-3,图7,图10和图14中示出的那些电子组件、电路、电子或逻辑模块、装置、器件或***。因此,设计结构1720可以包括文件或其他数据结构,其中包括人类和/或机器可读源代码、编译结构和计算机可执行代码结构,当所述文件或其他数据结构由设计或仿真数据处理***处理时,在功能上仿真或以其他方式表示电路或其他级别的硬件逻辑设计。此类数据结构可以包括硬件描述语言(HDL)设计实体或遵循和/或兼容低级HDL设计语言(例如Verilog和VHDL)和/或高级设计语言(例如C或C++)的其他数据结构。
设计过程1710优选地采用和结合硬件和/或软件模块,所述模块用于合成、转换或以其他方式处理图1-3,图7,图10和图14中示出的组件、电路、器件或逻辑结构的设计/仿真功能等价物以生成可以包含设计结构(例如设计结构1720)的网表1780。网表1780例如可以包括编译或以其他方式处理的数据结构,所述数据结构表示描述与集成电路设计中的其他元件和电路的连接的线缆、分离组件、逻辑门、控制电路、I/O设备、模型等的列表。网表1780可以使用迭代过程合成,其中网表1780被重新合成一次或多次,具体取决于器件的设计规范和参数。对于在此所述的其他设计结构类型,网表1780可以记录在机器可读数据存储介质上或编程到可编程门阵列中。所述介质可以是非易失性存储介质,例如磁或光盘驱动器、可编程门阵列、压缩闪存或其他闪存。此外,介质可以是***或高速缓存器,或者缓冲器空间。
设计过程1710可以包括用于处理包括网表1780在内的各种输入数据结构类型的硬件和软件模块。此类数据结构类型例如可以驻留在库元件1730内并包括一组常用元件、电路和器件,其中包括给定制造技术(例如,不同的技术节点,32纳米、45纳米、90纳米等)的模型、布图和符号表示。所述数据结构类型还可包括设计规范1740、特征数据1750、检验数据1760、设计规则1770和测试数据文件1785,它们可以包括输入测试模式、输出测试结果和其他测试信息。设计过程1710还可例如包括标准机械设计过程,例如用于诸如铸造、成型和模压成形等操作的应力分析、热分析、机械事件仿真、过程仿真。机械设计领域的技术人员可以在不偏离本发明的范围和精神的情况下理解在设计过程1710中使用的可能机械设计工具和应用的范围。设计过程1710还可包括用于执行诸如定时分析、检验、设计规则检查、放置和路由操作之类的标准电路设计过程的模块。
设计过程1710采用和结合逻辑和物理设计工具(例如HDL编译器)以及仿真建模工具以便与任何其他机械设计或数据(如果适用)一起处理设计结构1720连同示出的部分或全部支持数据结构,从而生成第二设计结构1790。设计结构1790以用于机械设备和结构的数据交换的数据格式(例如以IGES、DXF、Parasolid XT、JT、DRC或任何其他用于存储或呈现此类机械设计结构的适合格式)驻留在存储介质或可编程门阵列上。类似于设计结构1720,设计结构1790优选地包括一个或多个文件、数据结构或其他计算机编码的数据或指令,它们驻留在传输或数据存储介质上,并且由ECAD***处理时生成图1-3,图7,图10和图14中示出的本发明的一个或多个实施例的逻辑上或以其他方式在功能上等效的形式。在一个实施例中,设计结构1790可以包括在功能上仿真图1-3,图7,图10和图14中示出的器件的编译后的可执行HDL仿真模型。
设计结构1790还可以采用用于集成电路的布图数据交换的数据格式和/或符号数据格式(例如以GDSII(GDS2)、GL1、OASIS、图文件或任何其他用于存储此类设计数据结构的适合格式存储的信息)。设计结构1790可以包括信息,例如符号数据、图文件、测试数据文件、设计内容文件、制造数据、布图参数、线缆、金属级别、通孔、形状、用于在整个生产线中路由的数据,以及制造商或其他设计人员/开发人员制造上述以及图1-3,图7,图10和图14中示出的器件或结构所需的任何其他数据。设计结构1790然后可以继续到阶段1795,例如,在阶段1795,设计结构1790:继续到流片(tape-out),被发布到制造公司、被发布到掩模室(mask house)、被发送到其他设计室,被发回给客户等。
如已经描述的那样,在至少一个实施例中,一种数据处理***具有处理器核和包括支持该处理器核的高速缓存存储器的共享存储器***。处理器核响应于在正在经历处理器核的执行的存储器事务中执行存储器访问指令来发布事务性存储器访问请求。响应于接收到事务性存储器访问请求,高速缓存存储器的分派逻辑评估用于分派的事务性存储器访问请求,其中该评估包括确定存储器事务是否具有失败事务状态。响应于确定存储器事务具有失败事务状态,分派逻辑限制分派该存储器访问请求用于高速缓存存储器的服务,并且限制响应于该事务性存储器访问请求而至少更新高速缓存存储器的更换顺序信息。
尽管已经具体示出和描述各种实施例,但是本领域技术人员将理解其中可以进行在形式和细节上的各种改变而未脱离所附权利要求的精神实质和范围并且这些备选实现方式都落入所附权利要求的范围内。例如虽然已经关于执行指引本发明的功能的程序代码的计算机***描述方面,但是应当理解可以备选地实施本发明为包括计算机可读存储介质的程序产品,该计算机可读存储介质存储数据处理***可以处理的程序代码。计算机可读存储介质可以包括易失性或者非易失性存储器、光或者磁盘等、但是排除信号介质。
作为示例,程序产品可以包括数据和/或指令,该数据或者这些指令在数据处理***上被执行或者处理时生成这里公开的硬件部件、电路、设备或者***的在逻辑上、在结构上或者另外在功能上等效的表示(包括仿真模型)。这样的数据和/或指令可以包括与更低级HDL设计语言、比如Verilog和VHDL和/或更高级设计语言、比如C或者C++相符和/或兼容的硬件描述语言(HDL)设计实体或者其它数据结构。另外,数据和/或指令也可以运用用于交换集成电路和/或符号数据格式的部件数据(例如在GDSII(GDS2)、GL1、OASIS、地图文件或者用于存储这样的设计数据结构的任何其它适当格式中存储的信息)的数据格式。