专利名称::越过障碍的推测性执行的制作方法越过障碍的推测性执行有关申请的相互参照本申请涉及转让给本发明的受让人、标题为"LOCKELISIONWITHTRANSACTIONALMEMORY(采用事务存储器的锁定取消)"的序号xx/xxxxx的未决美国专利申请(AttomeyDocketNumber(律师记录号)P22226)。
背景技术:
:在M.Herlihy和J.Moss的"事务存储器无锁定数据结构的体系结构支持,,(Preceedingsofthe20thAnnualInternationalSymposiumonComputerArchitecture20,1993)(Heriihy和Moss)中描迷了通过硬件、使用事务存储器对无锁定共享数据结构的事务支持。这种方法描述了对于实现这种无锁定访问的现有多处理器高速緩存一致性协议的一组扩展。使用事务存储器的事务在本文称作事务存储器事务或者无锁定事务。障碍同步(barriersynchronization)是多线程编程、例如OpenMP系统中的一种常用范例。还可将障碍同步用于其它广泛使用的并发编程系统,包括基于以pthreads或Java实现的线程的系统。一般来说,并发计算中的障碍是多个线程或进程共享的同步点。要让多个线程越过障碍正确执行,各线程4全验并发执行的所有其它线程已经到达障碍是充分的。当使用障碍的线程集合中的所有线程已经到达障碍时,作为多线程程序的连续正确执行的先决条件的某个谓词4皮保证为真,因而程序执行可在所有线程中继续进行。一般来说,通常结合计数器的同步变量由线程用来相互传达它们已经到达障碍。因此,对障碍变量的互斥访问可在典型实现中在障碍上强制实行串行化点,以及所有线程到达障碍之前,已经到达障碍的各线程的有效执行的挂起,因而可能降低性能。但是,由于对于越过障碍的任何其它线程的正确执行,所有线程到达障碍是充分但不是必要条件,因此,在一些情况下,即使所有线程仍未全部到达障碍,线程也能够越过障碍正确执行。已经提出涉及多线程程序和专用硬件的程序员修改的学术方法,作为提高障碍同步的性能的一种方式。例如参见RajivGupta的"模糊障碍处理器的高速同步的机制"(ProceedingsoftheThirdInternationalConferenceonArchitecturalSupportforProgrammingLanguagesandOperatingSystems(ASPLOSIII),第54-63页,Boston,Massachusetts,1989年4月3-6日,ACMPress)。图1示出一个实施例中的基于处理器的系统。图2示出一个实施例中的处理。具体实施方式图1示出基于处理器的系统,它可包括耦合到总线110的一个或多个处理器105。或者,系统可具有作为多核处理器的处理器或者其它情况下的多个多核处理器。在一个简单示例中,总线110可耦合到系统存储器115、例如磁盘驱动器或其它存储设备120等存储设备、外围设备145。存储装置120可存储各种软件或数据。系统可经由一个或多个总线系统连接到各种外围设备145。这类外围设备还可包括显示器和打印系统,这是已知的。在一个实施例中,例如图中所示的处理器系统添加事务存4诸系统,它允许具有事务存储系统中高速緩存的共享数据结构的无锁定事务的执行,如Herlihy和Moss中所述。处理器105则可包括支持这种无锁定或基于事务存储器的事务的指令集体系结构。在这样一种体系结构中,这个实施例中的系统支持指令集,包括开始事务的指令;正常提交和终止事务的指令;以及中止事务的指令。在事务中,推测性地访问所有存储单元,并緩冲所有存储器更新。在事务期间,高速緩存一致性协议表明另一个线程是否正尝试访问同一个存储单元。如果检测到任何冲突,则产生可由中止处理程序进行处理的中断。在提交时,推测性更新变为原子可见。还可由于例如超额预订硬件资源等其它原因和其它异常而终止事务执行。图l的系统只是一个示例,并且本发明不限于任何特定体系结构。对于其它体系结构的系统的特定组件的变更可包括包含事务存储器,在一些情况下作为系统的处理器或多个处理器的组件;在其它情况不,它可以是连接到处理器的总线上的独立组件。在其它实施例中,系统可具有管理无锁定事务的附加指令。在其它实施例中,指令的实际形式或格式可能有所不同。可存在附加存储器或存储组件。大量其它变更是可能的。在一个典型的多线程程序中,可使用例如下表1所示的代码序列来实现障碍同步。<table>tableseeoriginaldocumentpage7</column></row><table>表l在表1的代码序列中,操作lockedlnc是互斥的增量操作,它使最初设置为零、作为由所有线程共享的障碍同步变量的变量barrierObject的字段mmiberThreadsAtBarrier递增。此外,障碍变量的字段numberThreadsInTeam的值是多线程计算中的线程数量。从以上代码序列可以看到,到达障碍的各线程首先使障碍变量递增,然后在第6至第8行的自旋锁循环(spinlockloop)中等待,直至所有线程到达障碍。这通过以下条件来表示barrierObject->numberThreadsAtBarrier!=barrierObject->numberThreadsInTeam变为真,这是在处于计算中的每一个线程已经使字段numberThreadsAtBarrier递增、固而表明它已经到达障碍时。表l中的代码序列表示通常实现的障碍同步。众所周知,这种同步是昂贵的,因为每一个线程都需要访问共享障碍变量barrierObject,它至少必须祐L依次访问以便进行递增,此外还因为各线程必须在自旋锁循环中闲置和自旋,直到所有其它线程已经4吏障碍变量递增。[10]在无序机中,处理器可越过barrierWait中的枱r验来进4亍内部推测,并在障碍之后推测性地执行程序指令。在这种推测期间,处理器还确保一致性;即,它确信没有其它处理器或线程正在访问它已经访问的同一个数据。但是,如果所有线程仍未全部到达障碍,则推测将在无序处理器中触发分支误预测异常,从而使所有推测性工作祐j文弃,并且处理器将回复到自旋锁循环中的自旋状态。[11]在一个实施例中,可使用事务存储器的指令集体系结构支持的属性,将通过硬件支持事务存储器的基于处理器的系统用于越过障碍进行推测性地执行。这在不支持无序执行的处理器中实现越过同步障碍的推测性执行。甚至在支持无序执行的处理器中,这允许越过障碍的多线程程序的推测性执行,而无需冒如上所述;^文弃无序处理器推测的风险。[12]图2示出一个这种实施例中的处理。在该图中,该处理根据事务存储器来实现推测性障碍,在210开始。在220,例如通过检查障碍同步变量,多线程程序首先检查是否所有线程已经到达障碍。由于这个动作是读动作,所以它不需要是互斥的。如果所有线程已经到达障碍,则无需推测性执行,并且在230,正常执行可继续进行,直到在295终止。[13]但是,如果所有线程仍未全部到达障碍,则程序越过障碍对于这个线程继续开始推测性执行。为了确保保护推测性执行不受其它线程干扰,在240,程序调用指令来开始体系结构所提供的基于事务存储器的事务。然后,在255,它推测性地执行程序的其余部分,直到在255^皮需要事务中止处理程序关注的外部事件中断为止。在一种情况下,逸个外部事件是专用于事务存储系统中的推测性执行的硬件资源的耗尽。由于只有有限数量的硬件可用于事务存储器支持、因而用于推测性执行,因此最终将产生这种中断。如上所述,在其它情况下,还有可能的是,由于推测中的数据误差、例如使推测性执行被折衷的线程之间的干扰而产生这个中断。在各种情况下,在260,中断将控制转移到中止处理程序。应当注意,中断只将控制转移到该处理程序,并且在这里也不存在中止和回滚或者事务的提交。然后,在270由该中止处理程序接管。首先,处理程序确定调用它的中断的原因。如果中断事件只是专用于事务存储器的硬件资源的耗尽,则仍未发生影响推测性计算的正确性的误差。随后,在280,通过读取同步变量,处理程序检查是否所有线程已经到达障碍。如果在280,仍存在未到达障碍的线程,则线程必须在自旋锁循环中等待,因为在这里,用于推测的任一个硬件资源可能不再是可用的,或者可能已经出现推测相关误差;即,在任何情况下,没有其它推测是可行的。一旦所有线程已经到达该障碍,则可在290^t是交该事务,并且在230,可继续进行正常执行。在这里,所有先前的推测性执行不再是推测性的,即,它变为有效,并且它的副作用是所有其它线程可见的。在该备选情况下,在270,结果可能是,由于推测中的实际误差所创建的事件、例如不同线程对已经由这个线程读取的变量进入写入的尝试,而调用中止处理程序。在这种情况下,推测需要被回滚。这通过在285中止事务并返回到220的过程开始处来进行。该中止放弃所有推测性执行,因为没有发生提交动作。在这里,线程当然可再一次重试推测性l丸行。[14]应当注意,当中止处理程序在280的循环中等待时,可能发生其它数据冲突。这则会导致在270的处理程序的重入调用。如果重入调用由误推测引起,则处理程序将按照上述方式进行操作,并引起推测的回滚。[15]最后,推测性执行或者常规执行将会成功,并且将到达在230的越过障碍的正常执行。[16]应当清楚地知道,图2所示的处理只是一个实施例的处理。其它实施例可以有所不同。例如,在描述其它实施例时,具体术语可能不同术语"线程"可由"进程"取代,术语"程序,,由"计算,,取代,术语"中断"由"陷阱(tmp)"取代,等等,这是本领域已知的。可改变所示的控制流程,以便在其它实施例由技术人员实现等效程序流程。许多这类变更是可能的。[17]表l和表l列示用于实现以上一般描述的推测性障碍的伪代码。<table>tableseeoriginaldocumentpage11</column></row><table>表3[18]在表2中,示出在一个实施例中进一步阐明由多线程程序进行的处理的伪代码。在第3-4行,代码首先检查它是否已经处于某个其它临界区之内,并且在情况是那样时中止,从而在第4行退出。这是因为障碍一般不应当在任何现有原子区域中出现。在第7行,程序判定(court)检查这个程序是否已经越过先前遇到的障碍进行了^f麵测,在那种情况下,函数调用getSpeculativeBarrierDepth将返回值"真"。在这个特定情况不,其它推测性执行是不可能的,因此,第8至18行的代码一般执行传统的障碍变量测试和自旋锁循环,并在障碍上等待。在该代码中,使用本领域已知的并称作"戳记(epoch)"同步变量的特定类型的障碍同步变量。具体来说,在第10行,非事务代码首先;l全查是否留下要进入的其它线程。如果情况是这样,则执行第12行的自旋锁循环,直到障碍可用为止。如果在第10行,代码检测到它是要进入障碍的最后一个线程,则它完成其障碍等待,并且可继续进行。[19]但是,如果第7行的代码发现它先前没有越过所遇到的障碍进行推测,则代码的事务阶段可开始。可以注意到,表2中第21至38行的代码大体上对应于图2的框220-260。如同非事务情况中那样,第23行的代码首先检查是否留下要进入障碍的其它线程。如果存在这类线程,则推测性事务开始。第24行的BeginTmnsaction调用是这个实现的下的事务存储器体系结构所提供的指令的包装器(wrapper)。在这个实施例中,BeginTransaction调用在成功时产生特定代码TransactionStarted。如果事务已经正确开始,则代码将关于这个障碍的存储装置(TLS)中。具体来说,在笫25至27行,代码存储这个特定线程已经越过障碍进行推测的事实、对障碍变量的引用以及检查是否所有线程已经命中障碍的戳记的引用。然后它在笫28行返回,这表示线程这时可继续推测性地执行,直到发生中止。另一方面,在第22行,这个函数可能发现它是尝试进入该障碍的最后一个线程。因此,推测性执行不是必要的,并且代码可以如同在第36至38行的正常非推测性情况中那样返回。[20]表3示出这个实施例中的中止处理程序的伪代码,它在来自表2的推测性事务代码开始的事务期间所产生的事务存储器相关事件的上下文中进行操作。在已经发生与事务存储器相关的、需要这个处理程序关注的事件时,事务存储器硬件体系结构将控制转移到这个处理程序。一般来说,如前面所述,该事件可以是支持推测性l丸行而分配的硬件资源或事务存储器资源的耗尽;不同的线程对于存储单元的冲突访问所引起的数据一致性4昔误,这个进程已经对该存々者单元写入或者这个进程已经从该存储单元中推测性地读取;或者与事务存储器相关的某种其它外部错误条件。表3中的伪代码大体上对应于图2中的框270-290。表3中的处理程序在第3行首先确定将控制转移到处理程序的中断是由硬件资源耗尽还是由另一种错误产生。如果该事件由与推测性执行的正确性相关的错误、如数据一致性错误所引起,则在第3行的测试为真,并且处理程序在第4行,通过中止先前开始的事务,来使推测性执行中止并回滚。否则,推测性执行成功,但这时处理程序需要等待其它线程完成,因为当没有充分的资源用于进一步推测时,它可能不再推测性地进行操作。为此,处理程序在第6和第7行分别恢复对障碍和戳记的引用,然后在笫8行使用它们在自旋锁循环中等待,直到所有其它线程完成。一旦所有线程已经到达障碍,则在第9行,处理程序提交这个线程开始的事务,以及推测性进行的所有改变在这时都是有效的,并且变为原子可见。[21]本领域的技术人员应当清楚地知道,上述表只是一个实施例中的示范性代码段。在其它实施例中,实现语言可以是另一种语言、例如C或Java,所使用的变量名可能有所不同,并且所定义或调用的所有函数的名称可能有所不同。实现以上列示的程序所完成功能的程序的结构和逻辑可在不改变输入和输出关系的条件下任意改变,这是已知的。[22]为了便于说明,以上描述中阐述了大量具体细节,以提供对所述实施例的充分理解,但是,本领域的技术人员会理解,即使没有这些具体细节也可实施其它许多实施例。[23]以上详细说明的某些部分根据对基于处理器的系统中的数据位的操作的算法和符号表示来提供。这些算法描述和表示是本领域的技术人员用来向本领域的其它技术人员最有效地传达其工作主旨的方式。操作是要求物理量的物理处理的那些操作。这些量可釆取能够3皮存储、传递、组合、比较以及以其它方式处理的电、磁、光或其它物理信号的形式。主要为了一般使用的原因,将这些信号称作位、值、元素、符号、字符、项、编号等,已经证明有时非常便利。[24]但应当记住,所有这些及类似的项均与适当的物理量相关联,并且只是应用于这些量的便捷标签。若没有明确说明,则/人描述中清楚地知道,诸如"执行,,或"处理"或"计算,,或者"确定"等术语可指基于处理器的系统或类似电子计算设备的动作和过程,其中所述基于处理器的系统或类似电子计算设备处理表示为基于处理器的系统的存储装置或者其它这类信息存储、传送或显示设备中的物理量的数据并将其转换为以类似方式表示的其它数据。[25]在实施例的描述中,参照了附图。附图中,相似的标号在所有几幅视图中描述基本相似的组件。可采用其它实施例,并且可进行结构、逻辑和电气改变。此外,大家要理解,各种实施例虽然有所不同,但不一定相互排斥。例如,在一个实施例中描述的特定功能、结构或特性可包含在其它实施例中。[26]此外,在处理器中实现的一实施例的设计可经过从创建到才莫拟直到制造的各种阶段。表示设计的数据可通过多种方式来表示设计。首先,如在模拟中有用的那样,硬件可采用硬件描述语言或者另一种功能描述语言来表示。另外,采用逻辑和/或晶体管门电路的电路级冲莫型可在设计过程的某些阶段产生。此外,在某个阶段,大部分设计达到表示硬件才莫型中的各种设备的物理设置的数据级。在采用传统半导体制造技术的情况下,表示硬件才莫型的数据可以是指定用于生产集成电路的掩才莫的不同掩模层上的各种特征是否存在的数据。在该设计的任何表示中,数据可存储在任何形式的机器可读介质中。经调制或者以其它方式产生以便传送这种信息的光或电波、存储器或者^f兹或光存储装置、如盘可以是机器可读介质。这些介质的任一种可"携带"或"表明"设计或软件信息。在传送表明或携带代码或设计的电载波,达到执行电信号的复制、緩冲或重传时,可能产生新的副本。因此,通信提供商或网络提供商可能制作构成或表示实施例的产品(载波)的副本。[27]实施例可作为程序产品来提供,该程序产品可包括其中存储了数据的机器可读介质,所述数据在由机器访问时可使机器执行根据要求权益的主题的过程。机器可读介质可包括但不限于软盘、光盘、DVD-ROM盘、DVD-RAM盘、DVD-RW盘、DVD+RW盘、CD-R盘、CD-RW盘、CD-ROM盘以及磁光盘、ROM、RAM、EPROM、EEPROM、磁卡或光卡、闪存、或者适合于存储电子指令的其它类型的^h质/机器可读^h质。此外,实施例还可作为程序产品下载,其中程序可通过载波或其它传播介质中包含的数据信号、经由通信链^各(例如调制解调器或网络连接)从远程数据源传递到请求设备。[28]以最基本的形式对许多方法进行了描述,但可以在不背离要求权益的主题的基本范围的前提下,对任何一个方法添加或删除步骤,或者对任何一个所述消息添加或减少信息。本领域的技术人员非常清楚,可进行许多其它修改和变更。具体实施例的提供不是要限制要求权益的主题,而是用于对该主题进行说明。要求权益的主题的范围不是由以上提供的具体实例来确定,而是仅由以下斥又利要求来确定。权利要求1.在多线程程序中,一种方法包括共享同步障碍的线程集合中的线程,向所述线程集合中的各个其它线程表明所述线程已经到达所述同步障碍;在所述表明步骤之后,所述线程开始基于事务存储器的事务;以及在开始所述基于事务存储器的事务之后,所述线程越过所述同步障碍继续执行。2.如权利要求l所述的方法,还包括如果所述线程已从所述集合中的各个其它线程接收到关于那些线程已经到达所述同步障碍的指示,以及如果越过所述同步障碍的才丸行没有引起数据一致性错误,则所述线程提交所述基于事务存储器的事务。3.如权利要求2所迷的方法,还包括如果越过所述同步障碍的执行引起了数据一致性賴-溪,则所述线程中止所述事务,并回滚越过所述同步障碍的执行。4.如权利要求l所述的方法,其中,向所述线程集合中的各个其它线程表明所述线程已经到达所述同步障碍的步骤还包括更新障碍变量。5.如权利要求3所迷的方法,其中,所述线程检查所述线程是否已从所述集合中的各个其它线程接收到关于那些线程已经到达所述同步障碍的指示的步骤还包括所述线程检查所述障碍变量。6.如权利要求1所述的方法,其中,所述多线程程序是Java程序。7.如权利要求2所述的方法,其中,所述多线程程序是Java禾呈序。8.如权利要求1所述的方法,其中,所述多线程程序是pthreads程序。9.如权利要求2所述的方法,其中,所述多线程程序是pthreads程序。10.—种机器可读介质,其上存储了在由机器访问时使所述机器执行在多线程程序中的一种方法的数据,所述方法包括共享同步障碍的线程集合中的线程,向所述线程集合中的各个其它线程表明所述线程已经到达所述同步障碍;在所述表明步骤之后,所述线程开始基于事务存储器的事务;以及在开始所述基于事务存储器的事务之后,所述线程越过所述同步障碍继续执行。11.如权利要求IO所述的机器可读介质,其中,所述方法还包括如果所述线程从所述集合中的各个其它线程接收到关于它们已经到达所述同步障碍的指示,以及如果越过所述同步障碍的执行没有引起数据一致性错误,则所述线程提交所述基于事务存储器的事务。12.如权利要求11所述的机器可读介质,其中,所述方法还包括如果越过所述同步障碍的执行引起了数据一致性错误,则所述线程中止所述事务,并回滚越过所述同步障碍的执行。13.如权利要求IO所述的机器可读介质,其中,向所述线程集合中的各个其它线程表明所述线程已经到达所述同步障碍的步骤还包括更新障碍变量。14.如权利要求12所述的机器可读介质,其中,所述线程检查它是否已从所述集合中的各个其它线程接收到关于它已经到达所述同步障碍的指示的步骤还包括所述线程检查所述障碍变量。15.如权利要求IO所述的机器可读介质,其中,所述多线程程序是Java程序。16.如权利要求11所述的机器可读介质,其中,所述多线程程序是Java程序。17.如权利要求10所述的机器可读介质,其中,所述多线程程序是pthreads禾呈序。18.如权利要求11所述的机器可读介质,其中,所述多线程程序是pthreads程序。19.一种包括事务存储器体系结构的系统,包括处理器,执行程序,并且还可操作以发起基于事务存储器的事务;提交基于事务存储器的事务;以及中止基于事务存储器的事务;存储器;事务存储器体系结构;处理器,执行所述存储器中存储的、共享同步障碍的线程集合中的线程,所述线程向所述线程集合中的各个其它线程表明所述线程已经到达所述同步障碍;在所述表明步骤之后,发起基于事务存储器的事务;以及在开始所述基于事务存储器的事务之后,越过所述同步障碍继续执行。20.如权利要求19所述的系统,其中如果所述线程已从所述集合中的每个其它线程接收到关于它已经到达所述同步障碍的指示,以及如果越过所述同步障碍的执行没有引起数据一致性错误,则所述线程还将提交所述基于事务存储器的事务。21.如权利要求20所述的系统,其中,如果越过所述同步障碍的执行引起了数据一致性错误,则所述线程还将中止所述事务,并回滚越过所述同步障碍的执行。22.如权利要求19所述的系统,其中,所述存储器还包括DRAM。全文摘要在多线程程序中,共享同步障碍的线程集合中的线程向线程集合中的各个其它线程表明该线程已经到达同步障碍,在表明之后,该线程开始基于事务存储器的事务,以及在开始基于事务存储器的事务之后,该线程越过同步障碍继续执行。文档编号G06F9/52GK101331456SQ200680047199公开日2008年12月24日申请日期2006年12月6日优先权日2005年12月16日发明者A·阿德尔-塔巴塔拜,B·萨哈申请人:英特尔公司