首页> 中国专利> 事务比较和丢弃指令

事务比较和丢弃指令

摘要

一种装置,包括:处理电路,用于处理数据处理线程;以及事务存储器支持电路,用于支持在由处理电路处理的线程内的事务的执行。响应于在给定事务内执行的指定目标地址和比较值的事务比较和丢弃指令,处理电路从对应于目标地址的存储器位置加载目标数据值;根据将目标数据值与比较值的比较结果来设置至少一个条件状态指示;并且将目标数据值丢弃,而不将目标地址添加到针对给定事务所追踪的工作地址集。这可用于使得线程级推测能够在事务存储器架构上实现。

著录项

说明书

技术领域

本技术涉及数据处理领域。更具体地,涉及事务存储器。

背景技术

数据处理系统可执行若干数据处理线程。有时,线程可能需要对共享资源进行访问,并且数据处理操作的性质可能使得一旦线程开始与共享资源交互,可能有必要在没有另一线程同时访问该资源的情况下使用该资源原子地完成组操作。

一种用于处置线程之间的这种冲突的技术可为使用锁(lock)来控制对至少一个目标资源的独占式访问。例如,当个线程开始对特定的地址区域中的数据进行访问时,线程可设置锁变量以主张锁的所有权,并且随后因为拥有锁的线程具有锁的所有权,对锁变量进行检查的其他线程可以确定锁已被主张并且因此不可进入与该地址区域交互的代码区。这样的基于锁的方法可以被看作是封闭式的,原因在于默认每个线程假设该线程不可以进入访问共享资源的代码区,因为除非该线程具有锁的所有权(从而保证可以不发生冲突),否则可能发生与另一线程的冲突。然而,锁标识符通常可控制对多个资源(例如,一系列地址)的独占式访问,并且因此不保证在一个线程正在访问由锁变量保护的资源集合内的某些资源的情况下另一线程肯定会访问相同的资源。因此,在线程之间的冲突极少的情形中,基于锁的方法可导致性能损失,因为线程可能在进入使用共享资源的代码临界区之前不必要地等待锁被释放。

用于处理访问共享资源的线程之间的冲突的更开放式的方法可以是使用事务存储器支持。一种数据处理系统可具有电路来其支持在由处理电路处理的数据线程内执行事务。事务可为线程中的指令,这些指令在标记事务开始的事务开始指令与标记事务结束的事务结束指令之间执行。在事务开始与结束指令之间,处理电路可推测性地执行介于中间的指令,并且阻止这些推测性地执行的指令的结果的提交,直到到达事务结束指令。在执行事务开始指令之后(但在到达事务结束指令之前)发生的中止事件可导致该事务中止并且丢弃推测结果。可存在中止事务的许多原因,但一个原因可能是检测到与另一线程进行的存储器访问的冲突。因此,利用此方法,每个线程可假设不会与其他线程发生冲突而开放式地开始处理代码的临界区,并且随后如果在未检测到任何冲突的情况下到达临界区的结束,则可以提交事务结果。在冲突极少的情形中,使用事务存储器支持可以通过允许更多线程同时处理它们的代码临界区来提高性能。

发明内容

至少一些示例提供了一种装置,该装置包括:处理电路,该处理电路用于对数据处理线程进行处理;以及事务存储器支持电路,该事务存储器支持电路用于支持在由该处理电路处理的线程内执行事务,该事务包括在事务开始指令和事务结束指令之间推测性地执行的该线程的指令,针对该事务,该处理电路被配置为:阻止该推测性地执行的指令的结果的提交,直到到达该事务结束指令,该事务存储器支持电路包括冲突检测电路,该冲突检测电路用于响应于检测到来自另一线程的对针对该事务而追踪的工作地址集中的一个地址的冲突访问而触发对该事务的中止;其中:响应于在给定事务内执行的、指定目标地址和比较值的事务比较和丢弃指令,该处理电路被配置为:从对应于该目标地址的存储器位置加载目标数据值;根据该目标数据值和该比较值的比较结果来设置至少一个条件状态指示;并且丢弃该目标数据值,而不将该目标地址添加到针对该给定事务的该工作地址集。

至少一些示例提供了一种数据处理方法,该方法包括:执行事务,该事务包括在事务开始指令与事务结束指令之间推测性地执行的线程的指令,针对该事务,处理电路被配置为:防止提交该推测性地执行的指令的结果,直到到达该事务结束指令;检测来自另一线程的对针对该事务而追踪的工作地址集中的一个地址的冲突访问,并且当检测到冲突访问时,中止该事务;以及响应于在该事务内执行的、指定目标地址和比较值的事务比较和丢弃指令:从对应于该目标地址的存储器位置加载目标数据值;根据将该目标数据值与该比较值进行比较的结果来设置至少一个条件状态指示;以及丢弃该目标数据值,而不将该目标地址添加到针对该给定事务的该工作地址集中。

至少一些示例提供了一种计算机程序,该计算机程序用于控制主数据处理装置以提供用于执行数据处理线程的指令执行环境;该计算机程序包括:处理程序逻辑,该处理程序逻辑用于对数据处理线程进行处理;以及事务存储器处理逻辑,该事务存储器处理逻辑用于支持在由该处理程序逻辑处理的线程内执行事务,该事务包括在事务开始指令和事务结束指令之间推测性地执行的该线程的指令,针对该事务,该处理程序逻辑被配置为:阻止该推测性地执行的指令的结果的提交,直到到达该事务结束指令,该事务存储器处理逻辑包括冲突检测电路,该冲突检测电路用于响应于检测到来自另一线程的对针对该事务而追踪的工作地址集中的一个地址的冲突访问而触发对该事务的中止;其中:响应于在给定事务内执行的、指定目标地址和比较值的事务比较和丢弃指令,该处理程序逻辑被配置为:从对应于该目标地址的存储器位置加载目标数据值;根据该目标数据值和该比较值的比较结果来设置至少一个条件状态指示;并且丢弃该目标数据值,而不将该目标地址添加到针对该给定事务的该工作地址集。

存储介质可存储该计算机程序。该存储介质可以是非暂态存储介质。

附图说明

本技术的其他方面、特征和优点将从对结合附图进行解读的示例的以下描述中显而易见,在附图中:

图1示意地图示了具有事务存储器支持电路的数据处理装置的示例;

图2示出了使用事务存储器资源处理事务的示例;

图3示出了存储条件状态指示的状态寄存器以及示出可以由条件状态指示来指示的不同条件的表的示例;

图4示出了多核心处理系统的示例;

图5示出了在支持事务存储器的多核心系统上执行线程级推测的示例;

图6示意地图示了事务比较和丢弃指令的示例;

图7是示出使用事务存储器支持电路来处理事务的方法的流程图;

图8是示出处理在事务内执行的事务比较和丢弃指令的方法的流程图;

图9和图10示出了用于请求从存储器系统加载数据的总线协议消息的示例;以及

图11示出了可以使用的模拟器示例。

具体实施方式

数据处理装置可以具有处理电路,该处理电路具有事务存储器支持电路,该事务存储器支持电路用于支持在由该处理电路处理的线程内执行事务。该事务包括在事务开始指令和事务结束指令之间推测性地执行的该线程的指令,针对该事务,处理电路可以阻止该推测性地执行的指令的结果的提交,直到到达该事务结束指令,并且当在到达事务结束指令之前发生中止事件时可使事务处理中止。事务存储器支持电路可以包括冲突检测电路,该冲突检测电路用于响应于检测到来自另一线程的对针对该事务而追踪的工作地址集中的一个地址的冲突访问而触发对该事务的中止。

在下文讨论的技术中,处理电路支持指定目标地址及比较值的事务比较和丢弃指令。响应于在给定事务内执行事务比较和丢弃指令,处理电路可以:从对应于目标地址的存储器位置(例如,缓存位置或系统存储器位置)加载目标数据值;根据将目标数据值与比较值进行比较的结果来设置至少一个条件状态指示;以及丢弃目标数据值,而不将目标地址添加到针对给定事务追踪的工作地址集中。

此方法是违反常理的,因为通常将期望在事务内任何从存储器加载数据的操作应当具有在事务的工作集内追踪的相应地址,使得如果在事务正在进行中时其他线程写入到相同地址,则事务可以被中止以避免事务使用来自所需地址的潜在失效(过期)值。

然而,发明人认识到,执行从存储器读取的值与比较值之间的比较而不将目标地址添加到针对事务的工作地址集中的事务比较和丢弃指令对于支持在利用线程级推测时使用事务存储器可以是特别有用的。一些程序循环可以包括多个迭代,其中每个迭代访问某些存储器地址,但在编译时未静态地得知在由一个迭代访问的地址与由另一迭代访问的地址之间是否将存在错误识别(aliasing)。用于执行这样的循环的传统方法可以是假设在循环之间可以存在依赖关系,并且因此顺序地执行每个迭代,其中仅在先前迭代完成的情况下才执行给定迭代。在线程级推测中,假设在不同迭代之间的这样的错误识别可能是足够少的,这样,可以通过使用单独的数据处理线程来并行地推测性地执行循环的多个迭代来提升性能。利用线程级推测,对应于多个迭代的线程可以各自同时执行,并且可以执行由一个迭代访问的地址与由另一迭代访问的地址是否冲突的运行时检查,如果在并行处理的线程之间存在地址冲突,则一些线程可以被取消并且稍后被重新执行。由于事务存储器的地址追踪以及中止机制可以用于检查在对应于程序循环的不同迭代的线程之间的地址风险,所以事务存储器可以用于支持这样的线程级推测。

然而,为了使用事务来支持线程级推测,可能需要确保对应于循环的每个迭代的事务以与原始程序循环的循环迭代的顺序对应的顺序来提交。典型的事务存储器架构无法强制相对于其他事务提交事务的特定顺序。而是,大多数事务存储器架构假设每个事务是完全独立的。

上文讨论的事务比较和丢弃指令可以支持在事务存储器系统中使用线程级推测。事务比较和丢弃指令可以用于检查存储在存储器中的变量,该变量追踪使用线程级推测而被并行化的循环中最新提交的迭代。由于事务比较和丢弃指令基于比较结果来设置条件状态指示,因此这使得事务的其他指令能够检查是否已提交针对循环的任何较早迭代的事务。

由于目标数据值被丢弃而不将目标地址添加到工作地址集中,这意味着即使当指示最新提交的循环迭代的共享变量由多个线程读取/写入时,这样的明显的地址冲突也将不触发任何事务的中止。这是有用的,因为如果当事务访问定义已提交哪些迭代的共享变量时这些事务被中止,则这将有效地导致所有事务被串行化,使得该等事务被顺序地执行,因此消除恰好是起初使用事务来支持线程级推测的优点。事务比较和丢弃指令避免了此问题,因为加载中访问的目标地址不被添加到工作地址集中,因此即使当一个事务写入到与另一事务所读取的共享变量相同的共享变量时,事务也可以继续被推测性地执行而不被中止。对事务比较和丢弃指令的架构支持使得事务能够被用于以与实现此功能性的替代方式相比较不硬件密集的方式来支持事务存储器。

应理解,线程级推测仅是可以获益于使用事务比较和丢弃指令的一种功能性,并且实际上,一旦提供了对此指令的架构支持,则程序员或编译者可发现针对此类指令的可以被有用地执行的其他功能。因此,在事务比较和丢弃指令提供特定的架构益处以支持线程级推测的同时,该指令还可以用于其他目的。

比较值可以由事务比较和丢弃指令通过不同方式来指定。在一些情况下,可以在事务比较和丢弃指令的指令编码中将比较值指定为立即值。

然而,提供其中事务比较和丢弃指令使用源寄存器来标识比较值的架构可以是特别有用的。实际上,当此类型的指令被用于支持线程级推测时,对应于不同循环迭代的不同线程可能需要将从存储器加载的值与取决于该线程表示的特定迭代的比较值的不同值进行比较。通过使用源寄存器来定义比较值,这使得写入在相应事务中要针对不同迭代执行的公共指令集更简单。

响应于事务比较和丢弃指令,处理电路可以丢弃目标值,而不将目标数据值写入到处理电路的架构寄存器。因此,作为执行事务比较和丢弃指令的结果,软件不可以访问从存储器读取的目标数据值。替代地,事务比较和丢弃指令仅提供对目标数据值的受限访问,以用于将目标数据值与比较值进行比较并且根据比较结果来设置至少一个条件状态指示的目的。

通过限制软件获得对架构寄存器内的目标数据值的访问的程度,这使得比较和丢弃指令较不可能由程序员或编译者不适当地用于在事务内尝试访问可能潜在地被其他线程访问的数据值。相比之下,如果提供了通用非事务加载指令,(该通用非事务加载指令可以在事务内执行以将从存储器中加载的目标值写入到架构寄存器中(而不针对给定事务追踪工作地址集中的相应的地址)),则这对由程序设计员或编译者误用而言将是更开放的,因为确实应当针对与其他线程的冲突而追踪的地址可能被非事务加载不适当地访问。

在一些架构中,事务比较和丢弃指令可以被限制为仅当事务正在进行中时成功地执行。因此,如果当不在事务内时尝试执行事务比较和丢弃指令,则指令解码器可以将该事务比较和丢弃指令处理为未定义的指令,并且触发异常以使由异常处置器来处置该未定义的指令。

替代地,当在事务内执行指令时也可以支持事务比较和丢弃指令。在此情况下,事务比较及丢弃可以触发处理电路从存储器加载数据值并且将所加载的数据值与由指令指定的比较值进行比较。

支持事务比较和丢弃指令的架构还可以支持指定测试条件的至少一个形式的条件指令。该条件指令控制处理电路以至少一个条件状态指示满足测试条件为条件来执行处理操作。例如,架构可需要提供专用条件状态寄存器来用于存储表示条件状态指示的一个或多个条件标志。例如,条件标志可以表示先前处理结果的性质,例如,结果是否是负的、是否涉及溢出、是否涉及进位、或者是否为0。至少一个条件状态指示可以是也由除事务比较和丢弃指令之外的其他形式的条件设置指令设置的相同指示。

除了冲突检测电路之外,事务存储器支持电路还可以包括其他元件。例如,事务存储器支持电路可以包括推测结果存储电路和/或复原状态存储电路,该推测结果存储电路用于存储针对至少一个事务推测性地执行的指令的结果,该复原状态存储电路用于存储响应于事务的事务开始指令而捕获的架构状态,如果事务中止,则该架构状态可以被复原。例如,推测结果存储电路可以缓存存储指令的结果,直到事务响应于事务结束指令而被提交,使得事务内推测性地执行的存储指令不污染存储器系统,直到得知事务可以被提交。复原状态存储电路可以例如在寄存器组中包括用于保持在事务开始时存在的状态的检查点的寄存器,以应对在当事务被中止时状态需要倒退(rewound)到该较早执行点的情况。替代地,可以使用寄存器重命名来维持复原状态,以在与存储当前架构状态的寄存器相同的寄存器文件内追踪旧的设置了检查点的(checkpointed)架构状态。

中止事务的另一可能原因可能是如果事务存储器支持电路用尽资源,使得不再可以保证事务将在没有冲突的情况下正确地继续进行。例如,如果要在推测结果存储电路中存储的推测结果的数量超过所提供的存储内可用的容量,则事务可以被中止。

在中止事务时,可以由软件来确定是再次尝试执行事务还是替代地使用非事务回退(fallback)路径(例如,使用锁和加载/存储独占式指令)。然而,处理电路的微架构可以提供提示以指示事务中止的可能原因,该提示可以由软件用于确定再次尝试执行事务是值得的还是使用回退路径(例如,如果中止的原因使得任何未来的尝试都将可能失败)。

如上文所讨论的,事务比较和丢弃指令可以用于执行线程级推测,在该线程级推测中执行两个或更多个处理线程,其中每个线程对应于程序循环的相应的迭代,并且每个线程包括至少一个事务。在这样的用例中,事务比较和丢弃指令可以将循环迭代提交变量的地址指定为目标地址,该循环迭代提交变量用于追踪提交针对程序循环的多个迭代的事务中的进展。在事务内,每个线程可以包括一个或多个指令,以基于由事务比较和丢弃指令设置的至少一个条件状态指示是否满足测试条件来确定是否中止事务。例如,在事务内,每个线程可以包括当型循环(while loop),该当型循环使用事务比较和丢弃指令来将循环迭代提交变量与特定于当前循环迭代的比较值进行比较,使用条件指令来测试所得的(一个或多个)条件状态指示,以及如果条件状态指示尚不指示准备好提交当前循环迭代,则有条件地分支回到循环开始。当准备好提交当前循环迭代时,程序执行可以前进到事务结束指令以提交整个事务的结果。

处理电路可使用根据特定总线协议定义的总线协议消息来与存储器系统交互。响应于事务比较和丢弃指令,处理电路可以触发第一总线协议消息的发出,以请求从存储器系统加载目标数据值。第一总线协议消息可以包括区分该总线协议消息与第二总线协议消息的指示,该第二总线协议消息是针对要求从存储器加载数据值的其他类型的指令而发出的。例如,第一总线协议消息可以具有与第二总线协议消息不同的消息类型,或者第一总线协议消息可以具有与第二总线协议消息相同的消息类型但其可以指定区分第一总线协议消息与第二总线协议消息的参数或控制标志。对于总线协议消息,把由事务比较和丢弃指令触发的加载与由其他类型的指令触发的加载区分开可能是有用的,因为对于事务比较和丢弃指令,由事务比较和丢弃指令触发的加载可以不需要一些操作(而通用加载操作可能需要这些操作,以确保数据一致性和/或管理在不同处理元件上执行的事务之间的冲突),这可以实现一些性能提高。

例如,在包括其他处理组件并且该处理组件也包括事务存储器支持电路的系统中,响应于接收到第一总线协议消息或由第一总线协议消息触发的另一总线协议消息(例如,响应于第一总线协议消息的互连触发的监听消息),如果该其他处理元件当前正在执行事务并且针对该事务目标地址是针对该事务追踪的写入地址集的一部分,则不必须在该其他处理组件上中止该事务。而是,可以允许在该其他处理组件处的事务继续而不中止,直到该事务到达其事务结束指令(除非检测到导致中止的任何其他原因)。这将是违背常识的,因为通常将期望针对互斥而言,当另一事务读取相同地址时必须中止使用其写入集中的地址的事务,以确保在已经由另一事务读取地址之后不可以提交由一个事务进行的对同一地址的写入。

然而,在事务比较和丢弃指令的期望用例中,事务可在当型循环中使用,该当型循环旋转(spin)直到共享的迭代追踪变量已到达所需值,因此,使用过时值服务与事务比较和丢弃指令相关联的加载,而该过期值已经由在不同的处理组件上执行的另一事务写入,不会造成问题。即使由事务比较和丢弃指令加载的值过期,在此情况中,当型循环将简单地旋转一些额外循环,直到其他事务被提交,并且更新值可以然后在后续经过当型循环时返回。由于在其他处理组件处中止事务将在任何情形中简单地导致返回旧值(未被所中止的事务更新),在执行事务比较和丢弃指令的第一处理元件处的影响是相同的,但通过在其他处理组件处不中止事务,可以提高性能(因为稍后不必再次重新开始该事务)。

此外,由于当服务与事务比较和丢弃指令相关联的加载时不必总是提供最新值,这意味着与必须获得保证为最新值的值的情况(在一些情况下可能需要较长访问延迟)相比,存储器系统(或互连)能够通过以较低访问延迟从缓存中提供(潜在过期)值来更快地服务加载。

因此,提供具有区分由事务比较和丢弃指令触发的加载与其他类型的加载的消息格式的总线协议可以用于实现性能提高。

可提供相应的计算机程序,以控制主机数据处理装置提供用于执行数据处理线程的指令执行环境,该计算机程序包括用于处理数据处理线程的处理程序逻辑以及用于支持在由处理程序逻辑处理的线程内执行事务(以与上文针对硬件实施例讨论的支持事务的类似的方式)的事务存储器程序逻辑。事务存储器程序逻辑可以包括冲突检测程序逻辑,该冲突检测程序逻辑用于当检测到来自另一线程的对针对事务而追踪的工作地址集中的一个地址的冲突访问时触发事务中止。计算机程序的程序逻辑可以以与如上文讨论的相应的处理电路类似的方式对事务比较和丢弃指令的执行进行相应。

因此,可以提供计算机程序,该计算机程序向在其上执行的软件呈现与将由具有上述特征的实际硬件装置提供的指令环境类似地指令环境,即使可能不存在在执行该计算机程序的主机计算机上提供这些特征的任何实际硬件。替代地,计算机程序(其可以例如是模拟器或虚拟机)可以通过提供程序逻辑(例如,指令集或数据结构)来仿真硬件架构的功能性,该程序逻辑使得通用主机数据处理装置能够执行代码,该代码意在用于以与将在具有事务存储器支持的装置上实现的结果兼容的方式在具有事务存储器支持的装置上执行。

计算机程序可以被存储在存储介质上。该存储介质可以是非暂态存储介质。

图1图示了包括具有硬件事务存储器(HTM)支持的处理器核心2的数据处理装置的示例。核心2具有处理逻辑4,用于执行指令以执行数据处理操作。例如,处理逻辑4可以包括:用于执行各种类型的处理操作的执行单元,诸如用于执行算术或逻辑运算(诸如加法、乘法、AND、OR等)的算术/逻辑单元(ALU);用于对浮点操作数执行运算的浮点单元;或用于对包括多个数据元件的向量操作数执行向量处理的向量处理单元。提供了用于存储由处理逻辑4执行的指令的操作数以及用于存储所执行指令的结果的架构寄存器集6。架构寄存器6包括用于存储至少一个状态值(例如,条件标志)的状态寄存器7,该状态值指示先前执行的指令的结果的性质。指令解码器8解码从指令缓存10提取的指令以产生控制信号,从而控制处理逻辑4或数据处理装置2的其他组件以执行相关操作。还提供了加载/存储单元12以执行加载操作(响应于由指令解码器8解码的加载指令)来将数据值从数据缓存14或主存储器16加载到架构寄存器6中,并且执行存储操作(响应于由指令解码器8解码的存储指令)来将来自架构寄存器6中的数据值存储到数据缓存14或存储器16。

处理器核心2还具有事务存储器支持电路20,该事务存储器支持电路20提供用于支持硬件事务存储器(HTM)的各种资源。事务存储器支持电路20中的HTM资源可以包括例如:推测结果存储22,其用于存储事务的推测结果;地址追踪电路24,其用于追踪由事务访问的工作地址集;冲突检测电路26,其用于检测在由事务进行的数据访问与由其他线程进行的数据访问之间的冲突,使得当检测到冲突时事务可以被中止;以及复原状态存储电路28,其用于存储在事务开始时来自架构寄存器6的架构状态数据的快照,使得当事务被中止时此状态可以复原以覆写(overwrite)事务的推测结果。在一些示例中,追踪工作地址集可以包括单独地追踪读取地址集(表示由事务读取的地址)、以及写入地址集(表示由事务写入的地址)。例如,读取地址集/写入地址集可以通过在缓存中设置标志(指示相关联的缓存线是否是分别针对给定事务的读取集或写入集的一部分)来追踪。

此外,资源可以包括嵌套深度寄存器30,其用于存储追踪事务的嵌套水平的嵌套深度值。其对于程序员或编译者能够定义嵌套事务(其中,在对应于第一事务的第一事务开始指令之后但在对应于第一事务的第一事务结束指令之前遇到第二事务开始指令)可以是有用的。这对于确保原子地处理代码的临界区(即使存在超出第一事务开始指令之外的到代码的一部分的分支)可以是有用的。然而,为了避免不得不在推测结果存储中捕获架构状态的多个检查点,一些微架构可有效地忽略嵌套事务集的“内部”事务,并且仅捕获响应于第一事务开始指令的架构状态的检查点。在事务结束指令之前出现的任何后续事务开始指令可以被有效地忽略,除了嵌套深度寄存器30可以递增以追踪已经遇到了多少事务开始指令,使得在遇到事务结束指令时,微架构可以追踪哪个事务结束指令涉及嵌套事务集的外部事务。因此,当遇到事务结束指令时,如果嵌套深度是一个或多个,则忽略事务结束指令,而如果嵌套深度是零(指示事务是嵌套集的外部事务),则可以提交事务。

图2示出了使用事务存储器支持电路20以及处理逻辑4在给定线程内执行事务的示例。事务是由事务开始指令(tstart)及事务结束指令(tcommit)界定的程序代码段。如图2所示,响应于事务开始指令,在架构寄存器6中的当前架构状态被捕获并且被存储在复原状态存储电路28中。处理逻辑4跟随tstart指令而开始执行后续指令的推测性执行,并且由于这些指令被执行,被这些指令访问的地址由地址追踪电路24追踪,并且冲突检测电路26检测在所追踪的地址与其他线程进行的存储器访问的地址之间的冲突。事务内的指令的至少一些推测结果被存储在推测结果存储电路22中。例如,在事务仍然未决时,响应于存储指令STR而存储到缓存或存储器的值可以保持在推测结果存储22中。如果在到达事务结束指令(tcommit)而在期间未发生中止事件,则响应于事务结束指令,提交推测结果。在提交事务时,在推测结果存储22中针对该线程存储的任何结果可以写入到数据缓存14或存储器16,并且可以丢弃或允许覆写复原状态28,因为不再需要将架构状态倒退到遇到事务开始指令之前的点。

另一方面,如果发生中止事件,例如,当由冲突检测电路26检测到冲突(当另一线程访问已经被事务访问的地址时)时,则触发事务的中止,并且将来自复原状态存储器28的复原状态复原到架构寄存器6。中止事件的其他原因可以例如包括执行不允许在事务内执行的指令、在推测结果存储22或地址追踪电路24内用于处置推测结果或给定事务所需的地址的资源不足、或者在事务期间接收到中断。

图3示意性地图标了在状态寄存器7中指示的条件状态指示40的示例。由指令解码器8支持的指令集架构可包括多个类型的条件设置指令,其可以是用于执行算术/逻辑运算并且基于结果的性质设置条件状态40的算术或逻辑指令、或者用于比较两个值并且基于比较结果设置条件状态指示40的专用比较指令。比较指令可有效地是减法指令,该减法指令从要比较的两个值中的一个值中减去另一个值并且基于减法结果设置条件标志40。在此示例中,存在四个条件状态指示40:负标志N,指示先前处理结果是否为负;零标志Z,指示先前处理操作的结果是否为零;进位标志C,指示先前处理操作是否涉及从结果的最高有效位进位;以及溢出标志V,如果处理操作产生具有从第二最高有效位到最高有效位(其中最高有效位表示指示结果符号的符号位)的溢出的带符号结果,则使该溢出标志置位。

如在图3的下部中的表中所示,可指派对应于针对条件状态指示的各个值集合的多个条件代码。在表中指示每个条件代码的意义连同条件状态指示40的对应标志值。条件指令可以指定指示满足特定测试条件(例如,EQ、NE等)的参数以便用于执行对应的条件操作。条件指令的测试条件参数可以定义在图3中指定的条件代码的一个。

如图4所示,图1所示的处理器核心2可以是在多处理器系统中的多个核心2中的一个。处理器核心2可以经由互连50连接,该互连可以处置在核心之间的通信以及对存储器系统16的访问。在一些情况下,互连50可以是一致性互连,该一致性互连还管理在不同核心2的相应缓存10、14之间的一致性。

在一些示例中,核心2中的至少两个可以包括图1所示的硬件事务存储器资源20。在一些情况下,所有核心2可具有这样的硬件事务存储器资源20。然而,这不是必须的,并且在一些情况下,也可以存在不能够执行事务的一些处理器核心。在图4的示例中,将单独的核心2中的每个图示为在单独的处理器核心2的微架构内具有事务存储器支持电路20,但这不是必须的。在一些情况下,可以在处理器核心之间共享一些事务存储器资源。例如,可以提供用于捕获复原状态或追踪地址的一些共享存储器,该共享存储器可以被共享以在多个处理器核心之间使用。

图5示意性地图示了将多个处理器核心2上执行的事务用于执行线程级推测(TLS)。TLS是用于加速执行程序循环的技术,在运行时期望该程序循环在迭代之间不具有依赖关系,但其中在编译时迭代不能被证明为独立的。例如,这样的程序循环可以包括取决于输入到程序的数据的地址访问模式,或者对不能由编译者可用的静态分析来消除歧义的存储器进行间接访问。因此,虽然这样的循环经常能够通过并行执行的多个迭代来执行,但有时冲突可以在由不同迭代访问的地址之间出现,并且如果如此,则可能需要检测此冲突以当值在已经由稍后迭代读取之后由循环中的较早迭代更新时防止稍后迭代使用该不正确值。

上文讨论的事务存储器资源20可以对于进行地址冲突检查是有用的。因此,如图5所示,针对给定循环,可将每个迭代分配到在个处理核心2中的一个上执行的特定处理线程,其中迭代的操作在对应的处理线程中执行的事务60内执行。例如,在图5中,已经将对应于循环的迭代0的操作分配到在核心0上的线程中执行的事务60-0,已经将对应于迭代1的操作分配到在核心1上的线程中执行的事务60-1,并且针对其他循环迭代以此类推。在此示例中,存在支持事务存储器的四个处理器核心,并且因此可以并行地处理四个迭代。

不能提交对应于给定循环迭代的事务,直到循环的先前迭代还已提交其事务,使得如果在由一个迭代访问的地址与由另一迭代访问的地址之间检测到冲突,则稍后迭代可以被中止,并且一旦已提交具有冲突地址的较早迭代,就重新开始。这确保了总体结果与所有迭代已以连续方式逐一执行的情况相同。为了帮助追踪已经提交哪些迭代,循环迭代提交变量70被存储在存储器系统16中,并且每个事务60包括一些指令以检查循环迭代提交变量70的当前值,以确定是否已提交针对所需较早迭代的事务(以及因此是否当前事务也可以提交)。例如,每个事务可包括当型循环,该当型循环进行循环直到循环迭代提交变量指示已提交相关的先前迭代,并且然后允许通过执行事务结束指令来提交事务。表示循环迭代提交变量70的特定形式可以变化。例如,在一些情况下,循环迭代提交变量可以,指示最新提交的迭代的迭代编号。在其他替代方案中,循环迭代提交变量70可以指示要提交的下迭代的迭代编号。一般地,循环迭代提交变量70可以采取使代码能够推断出哪个迭代是要提交的下一迭代的任何值。

因此,每个事务60包括(朝着事务码的结束)一些指令,以检查循环迭代提交变量以确定是否可能提交当前事务。在图5的示例中,在未检测到与较早事务所访问的地址的任何冲突的情况下执行对应于迭代0至5的事务,因此能够无延迟地提交这些事务。也就是说,针对迭代0至5的事务60-0至60-5访问彼此独立于地址。

然而,当执行针对迭代6的事务60-6时,在迭代6中访问的地址与在迭代5中访问的地址之间检测到冲突。这触发了对应于迭代6的事务60-6的中止。一旦已经提交针对循环迭代5的事务60-5,执行事务60-6的处理器核心2然后再次尝试对应于循环迭代6的事务60-6’。

然而,由于针对循环迭代6的事务60-6被中止和被再次尝试,这随后延迟了提交对应于后续迭代7、8及9的事务,因为这些迭代必须在它们可以被提交之间等待循环迭代6的提交。因此,即使在事务60-7、60-8及60-9期间的实际处理操作正在访问独立于在任何其他迭代中访问的地址的地址,这些事务也被防止提交,直到已事务60-6’完成。

因此,一般地,为了支持事务的使用以实现TLS,需要用于允许不同事务访问共享变量70以追踪程序循环的相关迭代的提交的机制。期望用于访问共享循环迭代提交变量70的从存储器的加载不触发读取/写入相同地址的任何其他事务的中止,因为在其他情况下程序循环的每个迭代将不得不顺序地逐一执行,这将消除恰好是起初TLS来并行化相同程序循环的不同迭代的优点。

一种用于支持对针对多个事务的共享变量的这样的非中止访问的方法可以是提供指令集架构,该指令集架构在整个事务中允许事务中途暂停而不中止事务,使得在事务暂停期间,可以进行数次存储器访问,这导致从存储器访问相应的地址而无需将这些地址添加到事务的工作地址集。

在这样的架构中,如果在暂停持续期间其他线程已访问在当前事务的暂停之前添加到工作地址集的地址中的一个,则在暂停的持续时间之后恢复事务时,事务被中止。然而,在暂停期间由暂停的事务本身访问的地址不添加到工作地址集。此指令集架构功能性可以用于通过在即将需要检查共享循环迭代提交变量之前暂停线程来支持TLS,使得对该变量的访问将不被处理为要在工作地址集中追踪的地址。然而,利用此方法的问题是提供用于在事务中暂停及恢复事务的微架构支持就所需的额外硬件逻辑而言是相对昂贵的。这在一些架构中是不太可能采用的超重的(heavyweight)方法。

另一种用于实现在不追踪针对事务的工作地址集中的该地址的情况下检查共享变量的方法可以是提供实现对所指定的存储器地址的通用加载访问的非事务加载指令,使得将从地址位置读取的数据值返回到处理器核心并且放置在处理器核心2的架构寄存器6中,而不将相应的存储器地址添加到由地址追踪电路24追踪的工作地址集。此方法可能是不期望的,因为提供代码执行加载任意地址而不在针对事务的工作地址集中追踪该地址的通用能力可导致将事务不适当地用于实际不意在以事务方式处理的操作。这可能导致问题,由于其可导致在由程序设计员或编译者写入的程序代码内事务实际上保持未决达很长时间,这可能对可用的事务资源20产生压力。通过不支持非事务加载,程序设计员/编译者被迫更仔细地考虑哪些操作确实需要被事务开始/结束指令界定。此外,程序设计员或编译者更可能无意地使用非事务加载来访问实际上应该被事务式地访问的变量,使得其地址被添加到工作地址集,从而使得可以检测到冲突并且如果必须要的话则中止事务。因此,通常可能不期望提供用于在事务内加载存储器的通用架构支持,该通用架构支持不导致在针对事务的工作地址集中追踪相应的地址。

图6示出了可以解决这些问题的事务比较和丢弃指令。指令解码器8识别编码(代码指令)为表示事务比较和丢弃指令的特定类型的指令。响应于检测到这样的指令,解码器8生成控制信号,以控制处理逻辑4从由目标地址82(该目标地址由事务比较和丢弃指令的参数指定)标识的位置从存储器系统14、16中加载目标数据值80,并且将目标数据值80与在架构寄存器文件6的源寄存器86中指定的比较值84进行比较。事务比较和丢弃指令在指令的编码内标识此源寄存器86。目标地址82可以是绝对地址或相对于事务比较和丢弃指令本身的地址而标识的相对地址,并且可以基于立即值或一个或多个寄存器中的值来标识。基于将目标数据值80与比较值84进行比较的结果,处理逻辑4将状态寄存器7的条件状态指示40设置为取决于比较结果的值。然后,处理逻辑4丢弃目标数据值80,而不将目标数据值80写入处理器核心2的任何架构寄存器6并且不将目标地址82添加到由地址追踪电路24追踪的工作地址集(读取集)。因此,执行事务比较和丢弃指令的代码不获得对目标数据值80的实际值的访问,而是仅看到基于与比较值84的比较而设置的所得条件标志40。例如,条件标志40可指示比较值84是大于、小于还是等于目标数据值80。

因此,当如图5所示使用事务来实现TLS时,事务比较和丢弃指令可以朝着每个事务的结束使用以检查循环迭代提交变量70,并且将其与在寄存器中指定的比较值进行比较,该比较值(直接或间接地)指示正在由当前事务执行的处理的迭代编号。这允许事务确定是否其准备好提交或应当等待直到其他事务提交。由于比较和丢弃指令不提供对目标数据值80本身的通用访问,此事务不太可能由程序设计员或编译者误用,并且对比较和丢弃指令的架构支持意味着不必支持中途暂停事务的能力,这可以很大地降低实现指令集架构的微架构开销。

图7图示了示出处理事务的方法的流程图。在步骤100处,解码和执行事务开始指令。作为响应,在步骤102处,复原状态存储器28捕获架构寄存器6中的架构状态的当前快照,作为针对事务维持的复原状态。应理解,虽然在一些情况下这可导致所捕获的架构状态被写入到单独的寄存器,但其他实施方式可将物理寄存器文件用于具有与指令集架构中支持的寄存器数量相比更多寄存器数量的架构寄存器6,其中寄存器重命名用于重新映射哪个特定实体寄存器被认为存储该架构所需的特定架构寄存器的数据值。在这样的系统中,寄存器重命名可以用于在遇到事务开始指令时改变从架构寄存器到物理寄存器的映射,使得先前捕获的架构状态检查点可以在相同的物理寄存器文件中有效地维持为当前架构状态本身,如果需要的话,这可以加速状态复原。在此情况下,可以通过改变寄存器映射来完成捕获复原状态,因此可以不需要到/从物理寄存器的任何实际数据传送。

在步骤104处,跟随事务开始指令,推测性执行指令开始。尽管指令在事务内推测性地执行,一些推测指令的结果可以被分配到推测结果存储电路22(例如,用于将数据存储到存储器的存储指令的结果)。由推测性地执行的指令访问的地址可添加到地址追踪结构24,并且尽管事务保持未决,但可以检测由其他线程对由地址追踪结构24针对事务维持的工作地址集的访问。

在步骤106处,冲突检测电路检测是否发生中止事件。例如,中止事件可以是:另一线程访问由地址追踪结构24追踪的工作地址集的一个地址;发生中断或异常;执行不允许在事务内执行的指令类型;或者可用于地址追踪24或推测结果存储22的资源被充分利用,使得不再可能继续安全地执行事务(由于不能够再追踪可能需要存储的一些额外地址或推测结果)。应理解,也可以根据指令集架构的约束而定义其他类型的中止。如果中止事件然后在步骤108处发生,则事务被中止并且存储在复原状态存储器28中的复原状态被复原到架构寄存器6,该复原状态表示系统的当前架构状态。然后,处理可以从复原的架构状态所表示的较早执行点复原。在一些情况下,在中止事务时,微架构可提供指示中止事务的原因的提示,该提示可以被软件中的异常处置器使用以确定是否值得再次尝试作为事务来执行所需操作,或重新处理以执行回退路径(其不使用事务)来执行相应的处理操作是否是优选的。

如果在步骤106处不发生中止事件,则在步骤110处,确定是否已经解码和执行任何事务结束指令。如果为否,则方法循环回到步骤106以等待中止事件或执行事务结束指令。应理解,指令的推测性执行以及工作地址集的追踪和潜在冲突在步骤104至110中继续,直到发生中止事件或到达事务结束指令。

然后,当在步骤112处执行事务结束指令时,将事务的任何推测结果提交到状态,并且丢弃或允许覆写先前捕获的复原状态。

图8是示出如上文讨论的事务比较和丢弃指令的处理的流程图。在步骤120处,在事务内推测性地执行指令的同时,指令解码器8识别指定目标地址及比较值的事务比较和丢弃指令。作为响应,指令解码器8生成控制信号,以控制处理逻辑4和加载/存储单元12(其可共同地被描述为处理电路)来执行图8的后续步骤。

在步骤122处,加载/存储单元12触发从缓存14或存储器系统16中的存储器位置加载目标数据值,该存储器位置对应于由事务比较和丢弃指令指定的目标地址。当从存储器返回目标数据值时,在步骤124处,处理逻辑4将目标数据值80与从事务比较和丢弃指令指定的寄存器获得的比较值84进行比较。例如,比较可以涉及从目标数据值和比较值中的一个中减去另一个。在步骤126处,处理逻辑根据步骤124处的比较结果来设置状态寄存器7的条件状态标志40。例如,如果目标与比较值相等,则可以使Z标志置位,如果目标数据值以及比较值中的一个大于或等于另一个,则可以使C标志置位,依此类推。然后,在步骤128处,丢弃目标数据值,而不将目标地址82添加到由地址追踪电路24追踪的事务的地址读取集并且不将目标数据值80写入到任何架构寄存器6。

因此,在已执行事务比较和丢弃指令的情况下,后续的条件指令(例如,条件分支指令)可以然后测试条件状态指示40的值,以根据目标数据值来确定是否应当执行后续的事务结束指令,或者程序流是否应当循环返回以再次检查目标数据值是否满足所需条件,以便允许提交事务。这对于支持如图5所示的线程级推测是非常有用的。

图9和图10示出了由总线协议支持的总线协议消息的示例,该消息被互连50使用以管理对存储器系统16的数据访问以及在多个处理器核心2上的事务之间的一致性和冲突。图9示出了当核心0上的事务执行上文所讨论类型的事务比较和丢弃指令时触发的总线协议消息的示例。在核心0处执行事务比较和丢弃指令触发将第一类型的读取总线协议消息发出到互连50。消息指定地址X,该地址对应于由事务比较和丢弃指令所指定的目标地址。响应于第一类型的读取总线协议消息,互连50将第一类型的监听消息发送到其他核心以检查在这些核心处缓存的数据的一致性状态。替代地,如果互连50维持追踪数据至少部分地追踪在其他核心处缓存的数据,并且可以基于该追踪数据来确定针对地址X的数据未由任何其他核心访问,则可以不必发送监听消息。互连50获得对应于目标地址的数据,该数据可以从其他处理器核心2处的缓存获得、或从互连内的系统缓存获得、或从存储器系统16获得。数据返回到核心0,用于与事务比较和丢弃指令的比较值进行比较,并且然后丢弃数据,而不将数据写入到架构寄存器或将地址X添加到事务的读取集内。

当事务比较和丢弃指令在核心0上执行时,可以存在正在执行事务的另一核心(例如,核心1),针对该事务,在写入地址集中指定地址X(即,核心0上的事务已经请求将更新的值写入到地址X,该更新的值可以在核心1的推测结果存储22中缓存,直到提交事务)。由于核心0所需的数据仅用于针对事务比较和丢弃指令的比较,例如,用于检查被期望为随着事务实现TLS提交而递增的循环迭代提交变量70,返回尚未由核心1上的事务更新的过期数据不是问题,因为这将简单地导致在核心0上的事务中的当型循环旋转以进行一些额外迭代,直到核心1上的事务提交并且最新(up-to-date)值可用。实际上,由于将期望在事务结束附近写入共享的循环迭代提交变量70,写入在核心1处维持推测性的周期可以是相对短的,因此核心0处的当型循环不太可能将需要旋转以进行许多额外循环。因此,为了改进核心1处的性能,响应于由图9所示的第一类型的读取总线协议消息触发的监听消息,即使由第一类型的读取总线协议消息指定的地址X在事务的写入集中,也不一定要中止核心1上的事务。

相比之下,如图10所示,当核心0执行指定地址X的另一类型的加载指令时,将第二类型的读取总线协议消息发布到互连50。第二类型的读取消息可以任何方式(例如,通过消息类型指示符或通过其他消息参数)与第一类型的读取消息区分。响应于第二类型的读取消息,将不同类型的监听消息发送到其他核心(与图9中相比)。当发送了第二类型的读取总线协议消息时,然后如果另一核心(例如,核心1)当前正在执行地址X在其写入集中的事务,则该事务被中止以保持互斥,并且确保核心1上的事务不能在地址X已经由核心0上的事务读取之后提交对地址X的写入。

总而言之,如与将值加载到核心的架构寄存器中的更通用类型的加载相反,在互连上的相干性/总线协议支持可以使用图9所示的第一类型的读取消息以指示返回的值将仅用于比较。这意味着如果核心0使用事务1中的比较和丢弃指令,并且地址当前在核心1处的事务2的写入集中且因此被推测性地修改,则互连可以选择用旧值(例如,来自共享的缓存)进行响应,而非不中止事务2并且无论如何都用旧数据进行响应。这可以在核心0及核心1处实现性能提高,在核心0处,如果数据可以较低的访问延迟从共享缓存返回,则数据可更快地返回,并且在核心1处,事务可以继续不中止,并且与事务被中止并且不得不稍后再次尝试该事务的情况相比可较早地达到提交。

图11图示了可以使用的模拟器实现。虽然先前所描述的实施例是从用于操作支持相关技术的特定处理硬件的装置和方法的方面实施本技术,但也可能提供根据本文中所描述的实施例的指令执行环境,该指令执行环境是通过使用计算机程序来实施的。这样的计算机程序通常称为模拟器,只要它们提供硬件架构的基于软件的实现。模拟器计算机程序的变型包括仿真器、虚拟机器、模型、以及二进制转换器(包括动态二进制转换器)。般而言,模拟器实现可以运行在支持模拟器程序310的主机处理器330(可选地运行主机操作系统320)上。在些布置中,可能在硬件与所提供的指令执行环境之间存在着多层模拟,并且/或者存在着提供在相同主机处理器上的多个相异的指令执行环境。历史上,已经需要强力的处理器来提供以合理的速度执行的模拟器实现,但这样的方法在某些情况下可以是有理的,例如在出于兼容性或重复使用的理由而有需要运行相对于另个处理器而言是原生的代码时。例如,模拟器实现可以提供具有未受主机处理器硬件所支持的额外功能性的指令执行环境,或提供般与不同的硬件架构相关联的指令执行环境。模拟的概述在RobertBedichek在1990年冬季的USENIX会议第53-63页所发表的“Some Efficient ArchitectureSimulation Techniques(些高效的架构模拟技术)”中给出。

在先前已经针对特定硬件构造或特征描述实施例的情况下,在模拟的实施例中,可以由合适的软件构造或特征提供等效的功能性。例如,可以在模拟的实施例中将特定的电路实施为计算机程序逻辑。类似地,可以在模拟的实施例中将存储器硬件(例如寄存器或缓存)实施为软件数据结构。在先前所描述的实施例中所引用的硬件组件中的者或更多者存在于主机硬件(例如主机处理器330)上的布置中,些模拟的实施例可以在合适时利用主机硬件。

模拟器程序310可以被存储在计算机可读可读存储介质(其可以是非暂态介质)上,并且提供对目标代码300(其可以包括应用程序、操作系统、以及超管理器)的程序界面(指令执行环境),该程序界面与正被模拟器程序310建模的硬件架构的应用程序界面相同。因此,可以使用模拟器程序310从指令执行环境内执行目标代码300的程序指令(包括上文描述的预定类型的加载指令以及独占式加载/存储指令),使得实际上不具有上文所讨论的装置2的硬件特征的主机计算机330可以模仿这些特征。模拟器程序310可包括处理程序逻辑312、事务存储器程序逻辑314以及冲突检测程序逻辑316,它们分别提供对应于处理逻辑4、硬件事务存储器资源20以及冲突检测电路26的功能性。

在本申请中,用词“被配置为…”用来意指装置的组件具有能够实现所定义的操作的配置。在此上下文中,“配置”意指硬件或软件互连的布置或方式。例如,该装置可以具有提供所定义的操作的专用硬件,或者可以将处理器或其他的处理装置编程为执行功能。“被配置为”并不暗示需要以任何方式改变装置组件以提供所定义的操作。

虽然已经在本文中参考附图详细描述本发明的说明性实施例,但应理解,本发明不限于这些精确的实施例,并且可以在不脱离如由所附权利要求所限定的本发明的范围和精神的情况下由本领域技术人员在这些实施例中进行各种改变、添加、以及修改。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号