掌桥专利:专业的专利平台
掌桥专利
首页

用于将脏高速缓存行排出到持久性存储器的排出操作

文献发布时间:2023-06-19 19:38:38


用于将脏高速缓存行排出到持久性存储器的排出操作

本技术涉及数据处理领域。

数据处理系统可以执行多个数据处理线程。有时,线程可能需要访问共享资源,并且数据处理操作的性质可能使得一旦线程开始与共享资源交互,就可能需要一组操作使用资源来原子地完成而同时没有另一个线程访问该资源。

用于处理线程之间的这种冲突的一种技术可以是使用锁来控制对至少一个目标资源的排他性访问。例如,当一个线程开始访问特定地址区域中的数据时,该线程可以设定锁变量来声明该锁的所有权,并且随后当该锁拥有线程具有该锁的所有权时,检查该锁变量的其它线程可以确定该锁已被声明并且因此可能无法进入与该地址区域交互的代码部分。此类基于锁的方法可被视为悲观的,因为每个线程默认假设它不能进入访问共享资源的代码部分,因为可能会发生与另一个线程的冲突,除非它具有锁的所有权,从而保证不会发生冲突。然而,锁标识通常可以控制对多个资源(例如,地址范围)的排他性访问,并且因此无法保证在一个线程正在访问由锁变量保护的资源集内的某些资源的情形下,另一个线程将肯定访问相同资源。因此,在线程之间的冲突很少的情况下,基于锁的方法可能导致性能损失,因为线程可能在进入使用共享资源的关键代码部分之前不必要地等待锁被释放。

用于处理访问共享资源的线程之间的冲突的更乐观的方法可以是使用事务性存储器支持。数据处理系统可以具有支持在数据处理线程内执行事务的电路。事务可以是在标记事务开始的事务开始指令与标记事务结束的事务结束指令之间执行的那些线程指令。在事务开始与结束指令之间,处理电路可以推测性地执行中间指令,并且在到达事务结束指令之前防止提交那些推测性地执行的指令的结果。在执行事务开始指令之后(但在到达事务结束指令之前)发生中止事件可能导致事务被中止并且推测性结果被丢弃。中止事务可能存在许多原因,但一个原因可能是检测到与由另一个线程进行的存储器访问的冲突。因此,利用这种方法,每个线程可以假设将不会与其它线程发生冲突,乐观地开始处理关键代码部分,并且随后在到达关键部分的结束而没有检测到任何冲突的情形下,可以提交事务的结果。在冲突很少的情况下,使用事务性存储器支持可以通过允许更多线程同时处理其关键代码部分来改善性能。

至少一些示例提供了一种装置,该装置包括:处理电路,该处理电路支持事务的处理,该事务包括在事务开始指令与事务结束指令之间推测性地处理的指令,针对该事务,该处理电路被配置为在不存在该事务被中止的情况下,在到达该事务结束指令之前防止提交该推测性地处理的指令的结果;以及包括至少两级高速缓存的高速缓存分级结构;其中:响应于在事务内处理的存储指令,该处理电路被配置为将推测性存储数据写入到该高速缓存分级结构,其中该推测性存储数据被标记为推测性的,以在提交该事务之前防止该推测性存储数据传递越过该高速缓存分级结构中的预定层级的高速缓存之外到达至少一个另外层级的高速缓存;并且该装置包括排出电路,该排出电路检测有可能导致存储在该至少一个另外层级的高速缓存中的状态丢失的排出触发事件,并且响应于检测到该排出触发事件而执行排出操作来扫描该高速缓存分级结构的子集以识别脏高速缓存行并且将与该脏高速缓存行相关联的数据写入到持久性存储器,该高速缓存分级结构的该子集包括该至少一个另外层级的高速缓存,其中在该排出操作中,该排出电路被配置为确保防止该预定层级的高速缓存中存储标记为推测性的推测性存储数据的脏高速缓存行被排出到该持久性存储器。

至少一些示例提供了一种装置,该装置包括:用于处理指令的构件,该用于处理指令的构件支持事务的处理,该事务包括在事务开始指令与事务结束指令之间推测性地处理的指令,针对该事务,该用于处理的构件被配置为在不存在该事务被中止的情况下,在到达该事务结束指令之前防止提交该推测性地处理的指令的结果;以及用于在包括至少两级高速缓存的高速缓存分级结构中高速缓存数据的构件;其中:响应于在事务内处理的存储指令,该用于处理的构件被配置为将推测性存储数据写入到该用于高速缓存的构件,其中该推测性存储数据被标记为推测性的,以在提交该事务之前防止该推测性存储数据传递越过该高速缓存分级结构中的预定层级的高速缓存之外到达至少一个另外层级的高速缓存;并且该装置包括用于将高速缓存的数据排出到持久性存储器的构件,其中响应于检测到有可能导致存储在该至少一个另外层级的高速缓存中的状态丢失的排出触发事件,该用于排出的构件被配置为执行排出操作来扫描该高速缓存分级结构的子集以识别脏高速缓存行并且将与该脏高速缓存行相关联的数据写入到该持久性存储器,该高速缓存分级结构的该子集包括该至少一个另外层级的高速缓存,其中在该排出操作中,该用于排出的构件被配置为确保防止该预定层级的高速缓存中存储标记为推测性的推测性存储数据的脏高速缓存行被排出到该持久性存储器。

至少一些示例提供了一种方法,该方法包括:处理事务,该事务包括在事务开始指令与事务结束指令之间推测性地处理的指令,针对该事务,在不存在该事务被中止的情况下,在到达该事务结束指令之前防止提交该推测性地处理的指令的结果;响应于在事务内处理的存储指令而将推测性存储数据写入到包括至少两级高速缓存的高速缓存分级结构,其中该推测性存储数据被标记为推测性的,以在提交该事务之前防止该推测性存储数据传递越过该高速缓存分级结构中的预定层级的高速缓存之外到达至少一个另外层级的高速缓存;以及响应于检测到有可能导致存储在该至少一个另外层级的高速缓存中的状态丢失的排出触发事件而执行排出操作来扫描该高速缓存分级结构的子集以识别脏高速缓存行并且将与该脏高速缓存行相关联的数据写入到持久性存储器,该高速缓存分级结构的该子集包括该至少一个另外层级的高速缓存,其中当执行该排出操作时,防止该预定层级的高速缓存中存储标记为推测性的推测性存储数据的脏高速缓存行被排出到该持久性存储器。

本技术的另外的方面、特征和优点将从结合附图阅读的示例的以下描述中显而易见,在这些附图中:

图1示意性地示出了使用持久性存储器的数据处理系统的示例;

图2示出了设置有事务性存储器支持的处理电路的示例;

图3示出了在事务内推测性地处理的指令的示例;

图4示出了使用基于锁的方法来执行图3的操作的另选示例;

图5示出了一级数据高速缓存的高速缓存行的示例;

图6是示出事务的处理的流程图;

图7是示出由一级数据高速缓存处理探听请求的流程图;

图8示出了响应于排出触发事件而执行排出操作的方法;

图9示出了用于执行排出操作来扫描高速缓存分级结构的子集以识别脏高速缓存行并且将脏高速缓存行写入到持久性存储器的排出电路的示例,其中高速缓存分级结构的子集排除一级数据高速缓存;

图10示出了另选示例,其中在排出操作中扫描的高速缓存分级结构的子集包括一级数据高速缓存;并且

图11是示出执行排出操作的方法的流程图。

数据处理装置可以具有支持硬件事务性存储器的处理电路,其提供如先前所述的支持事务的处理的硬件电路逻辑。处理电路可以支持事务的处理,该事务包括在事务开始指令与事务结束指令之间推测性地处理的指令,并且处理电路可以在不存在事务被中止的情况下,在到达事务结束指令之前防止提交推测性地处理的指令的结果。处理电路可以访问包括至少两级高速缓存的高速缓存分级结构。响应于在事务内处理的存储指令,处理电路可以将推测性存储数据写入到高速缓存分级结构,其中推测性存储数据被标记为推测性的,以在已提交事务之前防止推测性存储数据传递越过高速缓存分级结构中的预定层级的高速缓存之外到达至少一个另外层级的高速缓存。在事务保持待决的同时防止推测性存储数据传递越过预定层级的高速缓存之外有助于在已提交事务之前防止推测性存储数据变得对在其它处理器内核(其与具有处理电路的内核共享至少一个另外层级的高速缓存)上执行的线程可见,使得事务的结果被其它线程原子地感知。

一旦已提交事务,那么随后可允许预定层级的高速缓存中先前被标记为推测性的任何存储数据被写回到高速缓存分级结构中的另外层级的高速缓存或主存储器。这可能在提交事务之后的一段时间内发生,因为预定层级的高速缓存的高速缓存行被逐出以让位给其它数据,所以在提交事务之后,可能存在一段时间,期间在事务中生成的数据的仅一部分已被写回到主存储器,但由事务生成的数据的其它部分尚未被写回。在为事务性存储器提供硬件支持的典型系统中,这不是问题,因为尽管对于临时周期,存储在主存储器中的数据可仅反映由事务作出的更新的部分并且因此不提供事务的效果的原子视图,但这仅持续有限周期,并且同时从其它线程对事务中所涉及的地址的访问将命中高速缓存分级结构的较高层级(或触发对与其它内核相关联的高速缓存的探听),使得那些其它线程看到由已提交事务生成的最新数据。另外,在支持硬件事务性存储器的典型系统中,通常已使用易失性形式的存储器存储装置(诸如动态随机存取存储器(DRAM))来实现主存储器,并且因此即使仅在存储数据的与事务相关的一部分已被写回到主存储器的周期中发生意外复位事件的电力故障,该电力故障或复位也将导致保存在主存储器中的状态丢失,并且因此当系统随后在电力故障之后再次通电或响应于复位事件而复位到已知状态时,事务的任何部分效果将丢失并且因此这仍不会导致事务的部分效果对其它线程的任何长期可见性,原子性因此得以保持。

然而,处理系统越来越多地使用持久性存储器(PM),其中使用非易失性存储器来提供用于存储正在处理电路上执行的进程的工作数据的随机存取存储器的至少一部分。这与传统系统形成对比,在传统系统中,非易失性存储器存储装置通常仅可使用受限于批量传输并且相对较慢的输入/输出(I/O)机构来访问。使事务性存储器能够与PM结合地使用可能是有用的,因为事务性存储器功能性对于确保关于PM的故障原子性可能是有用的(即使针对顺序程序,而不是在存在多个并行线程的情况下)。由于PM的引入,任何顺序程序可被认为在PM中具有并发观察器(恢复观察器),其方式类似于并发线程或另一个处理器内核可被认为是由先前讨论的并行线程/内核示例中的事务生成的状态的并发观察器。可能期望确保由顺序代码部分引起的对PM的更新被原子地实现以确保故障原子性。事务性存储器可以是实现这一点的方便方式。

然而,典型的事务性存储器系统并不倾向于与PM良好合作。当使用PM时,有可能响应于从高速缓存分级结构的高速缓存行逐出或写回而将数据写入到PM。这意味着,与仅经由I/O端口提供非易失性存储器的系统不同,在提交事务之后的一段时间内,可以用来自已提交事务的存储数据逐渐更新PM。由于PM是非易失性的,因此如果在该时段期间发生电力故障或意外复位,那么一旦系统在电力已恢复或复位已执行之后恢复处理,PM可能正在存储事务的部分结果,这冒着丢失原子性的风险。因此,当用PM替换或补充易失性存储器时,支持事务性存储器的现有系统将不会以即插即用方式工作。

用于解决该问题的一种技术是需要,当处理事务时,需要在PM中做出在事务的处理中所涉及的硬件日志跟踪地址,使得如果发生复位或电力故障,那么在从该故障恢复时,硬件日志可用于识别需要对PM中的数据做出什么改变,以展现响应于该事务而做出的改变或者实施由该事务导致的尚未排出到PM的剩余改变。然而,此类硬件日志带来性能和功率消耗成本。在一些示例中,在指令集架构中提供专用指令,用于允许事务请求在事务仍保持待决的同时将数据传播越过预定层级的高速缓存之外。相对于不支持PM的设计,此类技术需要高速缓存、存储器控制器和/或指令集架构中的重大改变,并且因此可能难以实现。

在下面的示例中,装置包括排出电路,该排出电路检测有可能导致存储在至少一个另外层级的高速缓存(在高速缓存分级结构的预定层级的高速缓存之外的高速缓存,在该预定层级的高速缓存处,与待决事务相关联的推测性存储数据被标记为推测性的)中的状态丢失的排出触发事件。响应于检测到排出触发事件,排出电路执行排出操作。排出操作包括扫描高速缓存分级结构的子集以识别脏高速缓存行并且将与脏高速缓存行相关联的数据写入到PM。在用于排出操作的扫描中所涉及的高速缓存分级结构的子集至少包括至少一个另外层级的高速缓存,其在用于事务的推测性存储数据被标记的点之外。在排出操作中,排出电路确保防止预定层级的高速缓存中存储标记为推测性的推测性存储数据的脏高速缓存行被排出到PM。

因此,提供某种电路以响应于检测到有可能导致状态丢失的排出触发事件而扫描高速缓存分级结构以识别可写入到PM的任何脏行。这可以比上述对高速缓存、存储器控制器和/或ISA的改变更容易在硬件中实现,并且避免了在PM中实现事务地址的硬件日志的性能成本。这使得即使主存储器的一部分被实现为PM,也能够实现支持硬件事务性存储器的系统,但是需要更少的附加开发努力来使硬件事务性存储器特征与PM兼容。另外,这种方法使得针对现有硬件事务性存储器系统写入的软件能够在使用PM的系统上未经改变地执行,因为不需要重新编译该软件以包括附加指令用于在仍待提交的事务内强制写入到PM。

在一个示例中,在排出操作中由排出电路扫描的高速缓存分级结构的子集可以排除预定层级的高速缓存,该预定层级的高速缓存是与事务相关联的推测性存储数据在该处被标记为推测性的高速缓存,以防止该数据传递越过预定层级的高速缓存之外。在一些系统中,可能不必要扫描预定层级的高速缓存以便确保由已提交事务生成的任何数据被排出到PM。

例如,当分级结构中在预定层级的高速缓存之后的下一层级的高速缓存是包含性高速缓存时,这种方法可能是适合的,其中在预定层级的高速缓存中高速缓存的所有地址也被分配了下一层级的高速缓存中的高速缓存条目。在这种情况下,与预定层级的高速缓存之后的下一层级的高速缓存中的高速缓存行相关联的状态可以足以确定在预定层级的高速缓存中是否存在可能需要被排出到存储器的任何数据,使得对预定层级的高速缓存本身的扫描是不必要的。

通过从在排出操作中执行的扫描中排除预定层级的高速缓存,这减少了执行扫描操作所花费的总时间并且因此节省了电力。这在基于来自备用电源的电力来执行排出操作(如下文进一步讨论)的具体实施中可能是特别有用的,因为在这种情况下,减少执行排出操作所花费的总时段可以使得能够使用具有较小能量容量的备用电源。

另选地,对于其它具体实施,由排出分级结构扫描的高速缓存分级结构的子集可以包括预定层级的高速缓存。例如,如果在预定层级的高速缓存之后的下一层级的高速缓存是排他性高速缓存或非包含性高速缓存,那么可以使用这种方法,使得在预定层级的高速缓存中高速缓存的条目不一定也具有在下一层级的高速缓存中高速缓存的对应条目。如果高速缓存分级结构的已扫描子集包括预定层级的高速缓存,那么当排出电路扫描预定层级的高速缓存以识别脏高速缓存行时,排出电路可以防止标记为推测性的脏高速缓存行被排出到PM。因此,当扫描预定层级的高速缓存时,那么仅非推测性高速缓存行可以被允许排出到PM。这防止了尚未提交的事务的部分结果在PM中变得可见,从而为事务提供了原子性保证。

在一些具体实施中,用于控制将数据写入到存储器的存储器控制器可以具有用于对等待写入到PM的数据进行排队的写入队列。以与高速缓存分级结构类似的方式,当发生排出触发事件时,在存储器控制器写入队列中仍可能存在尚未被写回到PM的一些数据,并且因此排出触发事件也可能导致存储器控制器写入队列丢失其状态。如果在提交较早事务之后,数据的仅与该事务相关联的一部分已被写入到PM,并且存储器控制器写入队列中的一些数据尚未被写入,那么这可能再次对原子性造成风险。因此,响应于排出触发事件,排出电路还可以使得存储在存储器控制器写入队列中的待决写入数据写入到PM。如果使用易失性存储器存储装置来实现存储器控制器写入队列,那么这种方法可能是有用的。

然而,在其它系统中,存储器控制器写入队列本身可以使用非易失性形式的存储装置,并且在这种情况下,不必要扫描存储器控制器写入队列以识别待写入到PM的数据。

在一些具体实施中,可以使用易失性形式的存储技术来实现高速缓存分级结构中的所有高速缓存,并且因此在排出操作中执行的扫描覆盖高速缓存分级结构的末级高速缓存可能是有用的。

然而,在其它示例中,高速缓存分级结构的末级高速缓存(以及可选地一个或多个更高层级的高速缓存)可以使用PM来实现。在这种情况下,排出操作可以包括将脏高速缓存行从至少一个另外层级的高速缓存排出到末级高速缓存,使得可能不必要将数据一路排出到主存储器。因此,上文讨论的PM可以包括高速缓存分级结构的末级高速缓存。另外,如果使用PM来实现高速缓存分级结构上的末级高速缓存,那么不必要在排出操作中扫描末级高速缓存,因为它将在排出触发事件之后保留其数据,并且因此不会对在事务中生成的存储数据的原子性造成丢失风险。因此,当使用PM来实现高速缓存分级结构的末级高速缓存时,在排出操作中扫描的高速缓存分级结构的子集可以排除末级高速缓存。相似地,如果使用PM来实现分级结构中比末级高速缓存层级更高的高速缓存,那么该高速缓存也可以从高速缓存分级结构的已扫描子集中被排除。

排出触发事件可以是有可能导致存储在高速缓存分级结构的至少一个另外层级的高速缓存中的状态丢失的任何事件。例如,排出触发事件可以是复位事件,其可以在对处理系统的复位输入被断言时发生。例如,当用户按下断电或重启按钮时,系统可以被复位。复位输入还可以响应于指示已发生不可恢复的错误的一些类型的中断或异常而被断言。响应于复位事件,可以将存储元件(诸如处理电路的触发器)复位到某一默认状态(取决于特定存储元件而为二进制零或二进制一)。当高速缓存内的存储元件被复位时,这可能导致状态丢失。因此,当复位事件发生时,在复位存储脏数据的对应存储元件之前,执行排出操作以扫描高速缓存分级结构的子集并且将与脏高速缓存行相关联的数据写入到PM可能是有用的。

当在用于向处理电路供电的主电源上检测到掉电时,排出触发事件的另一个示例可以是断电事件。断电事件可以是当电力突然中断时的事件,其可能导致易失性存储电路失去其状态。断电事件还可以是用于节省能量的计划断电事件,诸如进入睡眠或休眠模式,例如通过对高速缓存和内核进行功率门控以节省能量。不管断电事件是计划的还是未计划的,断电事件都冒着在高速缓存分级结构的至少一个另外层级的高速缓存中的数据丢失的风险。通过响应于排出触发事件而执行排出操作,这保留了由已提交事务生成的结果,以确保当系统随后再次通电时的原子性。

另外,排出操作防止违反事务排序要求。例如,当较旧的已提交事务未被持久性存储到PM时,可能不允许较新的已提交事务被原子地持久性存储,因此通过在检测到排出触发事件时执行排出操作,这确保了较旧的已提交事务的未完成的写回被传播到PM,从而避免了排序违反。

排出电路和至少一个另外层级的高速缓存可以耦合到备用电源输入,以用于在排出操作期间提供备用。备用电源输入可以与用于向处理电路供应电力的主电源输入分开。主电源输入还可以在正常操作期间向高速缓存分级结构供应电力,但是在排出操作期间,如果主电源不可用,那么可以另选地从备用电源输入向高速缓存分级结构供应电力。通过提供备用电源输入,即使当断电事件已发生从而使主电源中断时,这也可以提供用于执行排出操作的能量。备用电源输入可以是包括处理电路和排出电路的集成电路上的引脚,通过该引脚从备用电源(诸如电池或电容器)供应电力。电池或电容器本身可以不是实现在权利要求中限定的装置的集成电路的一部分,因为电池或电容器可以在制造/供应链的下游步骤中耦合到备用电源输入,所以当包括处理电路、高速缓存、排出电路和备用电源输入的装置被制造或供应给客户时,可能不存在电池或电容器。

备用电源对于支持上述排出电路不是必需的,因为即使没有备用电源,当复位事件作为如上文讨论的排出触发事件发生时,将仍有可能执行排出操作。然而,提供备用电源输入对于允许系统也响应于断电事件而执行排出操作可能是有用的。例如,备用电源可以是电池或超级电容器,其可以在足够长的时段内供应一定量的电力,以支持针对排出操作执行的扫描和写回操作。电池或超级电容器所需的特定充电容量可以取决于高速缓存的大小和扫描/写回操作的预期延迟,因此可以随具体实施而变化。

当使用备用电源时,那么从高速缓存分级结构的已扫描子集中排除预定层级的高速缓存可能是特别有用的,因为这可以允许更便宜的电池或电容器用作备用电源,而不需要通常被提供作为用于大型服务器的备用电源的相对昂贵的不间断电源(UPS)。因此,将装置设计为从分级结构的已扫描子集中排除预定层级的高速缓存可以有助于降低实现备用电源的总成本。

相似地,在其中存储器控制器写入队列也受到排出操作以将数据从存储器控制器写入队列排出到PM的示例中,那么存储器控制器写入队列也可以耦合到备用电源输入以允许在排出操作期间向存储器控制器写入队列供应备用电力。

预定层级的高速缓存还可以耦合到备用电源输入,以使得即使在主电源中已发生断电事件,也能够向预定层级的高速缓存供应电力。这不仅在预定层级的高速缓存是如先前讨论的第二具体实施中的高速缓存分级结构的已扫描子集的一部分的情形下是有用的,而且即使当由排出电路扫描的高速缓存分级结构的已扫描子集排除如先前描述的第一示例中的预定层级的高速缓存时,向预定层级的高速缓存供应备用电力也可能是有用的。这可以被看作是反直觉的。然而,即使不扫描预定层级的高速缓存本身,也有可能将下一层级的高速缓存内的高速缓存行标记为“经修改但已陈旧”,以指示该高速缓存行已相对于存储器中的数据的对应副本进行了修改,但与该高速缓存行相关联的数据的最新版本实际上可以存储在预定层级的高速缓存中。在一些具体实施中,“经修改但已陈旧”的高速缓存行可以被标记为脏且无效(脏,因为其不同于存储器中的数据的底层副本,且无效,因为对应地址的有效数据存在于预定层级的高速缓存中)。然而,其它具体实施可以提供识别经修改但已陈旧的行的不同方式(例如,经修改但已陈旧的高速缓存行仍可以被标记为有效,但可以存在指示其为经修改但已陈旧的行的单独标记或一致性状态指示标识)。当至少一个另外层级的高速缓存的扫描识别经修改但已陈旧的高速缓存行时,那么排出电路可以触发要发出到预定层级的高速缓存的探听请求以请求与经修改但已陈旧的高速缓存行相关联的更新的数据,并且响应于接收到更新的数据,可以将更新的数据写入到PM。由排出电路触发探听请求可以由排出电路直接执行,或间接执行(例如,扫描给定层级的高速缓存可以使得该高速缓存在其中行被识别为经修改但已陈旧的情况下发出探听,因此排出电路本身可以不需要直接发出探听请求)。

因此,即在排出操作中不扫描使预定层级的高速缓存本身,向该预定层级的高速缓存提供备用电力也可能是有用的,以允许该预定层级的高速缓存对从高速缓存分级结构中的另外层级的高速缓存发出的任何探听请求作出响应,该探听请求由在该另外层级的高速缓存中执行的扫描操作触发。

如果预定层级的高速缓存接收到此类探听请求,那么预定层级的高速缓存可以返回探听响应,此类探听请求指定与预定层级的高速缓存中标记为推测性的推测性存储数据(以表示其为与仍待提交的事务相关联的数据)相关联的探听目标地址,探听响应指示与探听目标地址相关联的数据在预定层级的高速缓存内不可用(即使该数据事实上可用,但该数据正被防止传播到另外层级的高速缓存以确保尚未提交的事务的存储数据被其它线程原子地查看)。

预定层级的高速缓存中的高速缓存行可以各自与排他性指示标识相关联。给定高速缓存行的排他性指示标识指示对应数据是否为待决事务的推测性存储数据。当给定高速缓存行的排他性指示标识具有第一值时,预定层级的高速缓存防止给定高速缓存行中的推测性存储数据在预定层级的高速缓存之外可见,并且当给定高速缓存行的排他性指示标识具有第二值时,允许给定高速缓存行中的推测性存储数据传播到另外层级的高速缓存。

排他性指示标识可以不是与用于跟踪事务性处理的预定层级的高速缓存中的高速缓存行相关联的唯一类型的元数据。预定层级的高速缓存也可以存储工作集跟踪指示标识,以将存储在预定层级的高速缓存中的高速缓存行标记为与在事务内访问的工作地址集相关联。这对于跟踪在事务内访问的地址与由其它线程访问的地址之间的冲突可能是有用的,使得如果检测到该事务与其它线程之间的地址冲突,那么该事务可以被中止,这可能冒着丢失原子性的风险。

预定层级的高速缓存可以是高速缓存分级结构中存储此类排他性指示标识和/或工作集跟踪指示标识的任何高速缓存。在一些系统中,与事务相关联的跟踪可以在高速缓存分级结构中的二级高速缓存或另外的高速缓存处执行。

然而,在实施过程中,如果预定层级的高速缓存是一级数据高速缓存(其是当由处理电路执行加载/存储操作时访问的第一层级的高速缓存),那么这可能是最简单的。

预定层级的高速缓存可以是专用高速缓存,其专用于给定处理器内核中的处理电路并且不能被其它处理器内核直接访问(尽管在一些场景中这些其它处理器内核可以探听对于第一内核而言是专用的一级高速缓存)。

在高速缓存分级结构中的预定层级的高速缓存之外的下一层级的高速缓存是包含性高速缓存的情况下,上文讨论的技术可能是特别有用的。这意味着在预定层级的高速缓存中高速缓存的任何地址也将具有在下一层级的高速缓存中为该地址分配的条目。当下一层级的高速缓存是包含性的时,这意味着可以从下一层级的高速缓存的扫描中识别尚未被写回到PM的预定层级的高速缓存中的任何脏数据,因此不必需在高速缓存分级结构的已扫描子集中包括预定层级的高速缓存,从而通过减少高速缓存分级结构中需要被扫描的高速缓存行的数量来实现电力节省,因此减少了在执行排出操作时消耗的电力。

持久性存储器可以包括任何形式的存储器,对于该存储器,存储器的内容可以在电力循环或其它重新启动之后保持可用。例如,“持久性存储器”可以包括非易失性存储器,诸如磁心存储器、闪存存储器、磁阻随机存取存储器(MRAM)、铁电RAM(F-RAM)、相变RAM(PCRAM)、电阻式RAM(ReRAM)、相关电子RAM(CeRAM)和固有为非易失性的其它存储器技术。此外,“持久性存储器”可以包括自动备用到非易失性存储器(诸如闪存存储器)并在通断电循环之后重新加载的主存储器。例如,非易失性双列直插存储器模块(NVDIMM-N)将DIMM、DRAM、闪存存储器和小电源组合在同一模块中。

PM可以是可按字节寻址的存储器。即,PM可以支持对数据的各个字节的访问,而非仅支持对较大数据块的访问。例如,对于映射到PM的存储器地址范围,可以由处理电路在该范围内生成的存储器地址的每个不同的二进制值可以对应于PM内的数据的不同字节(需注意,即使处理电路请求访问PM内的仅单个字节,一些硬件具体实施仍有可能从PM返回更大的数据块并且高速缓存该更大的块,预计处理电路稍后有可能需要该块的其它部分)。相比之下,通过输入/输出端口可访问的大多数非易失性存储装置可以是可按块寻址的,支持仅以比PM更粗的粒度进行访问(例如,以512字节的块进行访问,作为一个示例)。传统上,非易失性存储装置已仅用于数据的大容量存储或程序代码的离线存储,而不是存储在程序代码的处理期间定期更新的工作数据。相比之下,随着PM技术(诸如MRAM或PCRAM)的开发,提供可按字节寻址的PM变得可行,这为使用PM来将常规工作数据存储在处理器的主随机存取存储器内开辟了机会,但这引入了与将PM与如上文讨论的支持事务性存储器结合相关联的问题,该问题可以使用先前描述的排出电路来解决。

PM可以包括至少一个片外PM模块和/或充当一个或多个缓冲器的至少一个片上PM模块。例如,缓冲器可以包括片上高速缓存、高速暂存存储器或存储器控制器或互连器内的缓冲器。

图1示意性地示出了包括处理器内核104的数据处理系统100的示例。每个内核104可以执行程序指令以对存储在寄存器106中的操作数执行数据处理操作。可以从1级指令高速缓存(L1I$)108提取为供内核104执行而提取的指令。L1I$108是高速缓存分级结构的一部分,该高速缓存分级结构还包括1级数据高速缓存(L1D$)110、在未命中L1I$108或L1D$110时访问的2级高速缓存(L2$)112以及在处理器内核104之间共享的共享3级高速缓存(L3$)118。1级高速缓存108、110和L2$112专用于单个内核。由给定内核104执行的加载/存储指令触发对该内核的L1D$110的访问。如果请求未命中L1D$,那么向该内核的L2$112或向共享L3$118作出请求,或者如果请求未命中任何高速缓存,那么向存储器120、124、128作出请求。

在该示例中,L1D$110是写回式高速缓存,使得当处理器内核104写入到在L1D$110中有效的地址时,那么数据被更新并且被标记为脏,并且不立即被写回到L2$112或另外层级的高速缓存或存储器,除非用于该地址的数据从L1D$110被逐出或由另一个内核请求,或者遇到用于写回的某个其它触发器。另选地,一些系统可以支持将地址空间的特定区域定义为直写(write-through)并且将其它区域定义为写回(write-back)的能力,并且在这种情况下,对与写回区域中的地址相关联的高速缓存行的写入可以被标记为脏并且不立即被写回到存储器,并且对与直写区域中的地址相关联的高速缓存行的写入可以在更新L1D$112时触发对L2$110或其之外的写回。

而且,在该示例中,L1D$110是写入分配的高速缓存,这意味着当先前未高速缓存在L1D$中的数据由处理器内核104从L2$112或下级存取时,那么不但将数据返回到内核104,而且还将返回的数据分配到L1D$110中。

L2$112专用于单个内核。L2$112是包含性高速缓存,这意味着在给定内核104的1级高速缓存108、110之一中高速缓存的任何地址在该内核的L2$112内也具有对应条目。2级高速缓存112在由用于连接相应内核104的互连器114的一致性控制电路116管理的一致性域内。一致性控制电路116可以实现一致性协议(例如,基于探听或基于目录的协议)以确保当给定地址的数据被一个内核更新时,那么随后如果其它内核访问相同地址它们将看到更新的数据。在一些示例中,共享L3$118也可以充当探听过滤器,其可以至少部分地跟踪哪些地址被高速缓存在特定内核104的专用高速缓存110、112、108中,以有助于减少探听由其它内核写入时高速缓存的开销(例如,这允许对从探听过滤器118获知的不存储给定地址的数据的高速缓存的探听可以被消除)。一致性控制电路116可以使用任何已知的一致性协议来管理一致性。在该示例中,L3$118被示出为在互连器内提供,但在其它示例中,L3$118可以是与互连器分开的块。另外,有可能将探听过滤器实现为与L3$118分开的结构。

可经由互连器114访问的可按字节寻址的存储器包括易失性存储器120(在该示例中为动态随机存取存储器(DRAM)),其访问由DRAM存储器控制器122控制。另外,可按字节寻址的存储器包括持久性存储器(PM)124,其可为先前描述的PM的形式中的任一者。提供PM存储器控制器126以用于控制对PM 124的访问。PM是可按字节寻址的非易失性存储器存储装置,这意味着存储在PM中的数据的各个字节可以由处理器内核104独立地寻址。

互连器118也可以支持对经由输入/输出(I/O)控制器130访问的外部存储装置128(诸如,外部闪存存储器驱动器)的访问。不同于可按字节寻址的存储器120、124,外部存储装置128仅可以以大于一个字节的地址块粒度(例如,每块可为(例如)512个字节)成批访问。尽管DRAM 120或PM 124可以被频繁地访问并且用于存储在处理器内核104上执行的程序的主计算处理期间持续不断地被访问的工作数据,但是可以提供外部存储装置128以用于在正在进行的代码处理期间被不定期地访问的文件(诸如程序代码、图像数据或其它文件)的长期离线存储。访问外部存储装置128时的性能可能比访问DRAM 120或PM 124慢得多。

DRAM 120是易失性存储装置,因此当发生电力故障或者发生用于将装置100的存储元件复位到已知状态的复位事件时,那么存储在DRAM 120中的任何状态可能丢失。PM124和外部存储装置128是非易失性的,并且因此即使发生电力故障或复位(复位事件可能不清除PM 124的内容)也可以保持它们的状态。虽然图1的示例示出了系统具有DRAM 120,但这并非必需的,并且在其它示例中,可以使用PM 124来实现存储器空间的整个可按字节寻址的部分。相似地,提供外部存储装置128不是必需的。另外,在一些具体实施中,也可以使用PM 124来实现共享的L3$118以提供用于L3$118中的数据的非易失性存储装置。

图2更详细地示出了用于硬件事务性存储器(HTM)支持的处理器内核104的元件。处理器内核104具有用于实施指令以执行数据处理操作的处理逻辑4。例如,处理逻辑4(处理电路)可以包括用于执行各种类型的处理操作的执行单元,诸如用于实施算术或逻辑运算(诸如加法、乘法、AND、OR等)的算术/逻辑单元(ALU);用于对浮点操作数执行运算的浮点单元;或者用于对包括多个数据元素的矢量操作数执行矢量处理的矢量处理单元。处理器内核104包括一组架构寄存器6,其被提供用于存储由处理逻辑4执行的指令的操作数以及用于存储所执行的指令的结果。处理器内核104还具有指令解码器8,其对从L1I$108提取的指令进行解码以生成用于控制处理逻辑4或数据处理装置104的其它元件以执行相关操作的控制信号。处理器内核104还包括加载/存储单元12以执行加载操作(响应于由指令解码器8解码的加载指令)以将数据值从L1D$110或另外的高速缓存112、118,主存储器120、124或外部存储装置128加载到架构寄存器6中,并且执行存储操作(响应于由指令解码器8解码的存储指令)以将数据值从架构寄存器6存储到高速缓存110、112、118,存储器120、124或外部存储装置128。

装置104也具有事务性存储器支持电路20,其提供用于支持硬件事务性存储器(HTM)的各种资源。事务性存储器支持电路20中的HTM资源支持由处理逻辑4处理事务,其中事务是一系列指令,处理逻辑4在事务已完成之前不会提交推测性地执行的指令的任何结果。事务性存储器支持电路20可以包括例如:推测性结果存储装置22,其用于存储事务的推测性结果;地址跟踪电路24,其用于跟踪由事务访问的地址;冲突检测电路26,其用于检测由事务进行的数据访问与由其它线程进行的数据访问之间的冲突,使得当检测到冲突时事务可以被中止;以及恢复状态存储电路28,其用于存储在事务开始时来自架构寄存器6的架构状态数据的快照,使得当事务被中止时可以恢复该状态以重写事务的推测性结果。尽管在图2中单独地指示地址跟踪电路24,但如下文讨论的,在一些具体实施中(如在下文示出的图5的示例中),地址跟踪电路24可以至少部分使用L1D$110来实现,其包含哪些地址在针对事务而跟踪的读取集或写入集中的指示。相似地,推测性结果存储装置22也可以与L1D$110结合,因为存储在L1D$中的数据可以被标记为推测性的以指示其在已提交对应事务之前不会被提交。

在由处理逻辑4处理事务期间,一些推测性地执行的指令(例如,用于将数据存储到高速缓存110、112、118或存储器120、124的存储指令)的结果被临时存储在推测性结果存储装置22(例如,L1D$110)中,以便一旦事务已完成(假设事务未被中止)就提交结果。当冲突检测电路26确定地址的读取集中的地址(例如,存储器中已受到由事务中的指令触发的读取访问的位置的地址)已被事务之外的指令写入时,可以触发事务的中止。在中止的情况下,恢复状态存储装置28用于将架构寄存器6的状态恢复到其在事务处理开始之前的状态。

有可能嵌套事务,使得在遇到对应于先前事务开始指令的事务结束指令之前接收到另外的事务开始指令,并且同时较早事务仍待决且尚未被中止。嵌套深度寄存器可以跟踪事务的当前嵌套深度,以区分当没有事务已开始时、当仅单个事务已开始时、或者当另外的嵌套事务已在先前事务内开始时的情况。当事务尚未开始时,嵌套深度可以是0。响应于第一事务开始指令,嵌套深度可以递增到1。如果另外的嵌套事务开始,那么嵌套深度可以再次递增到2,依此类推。在提交事务时,可以递减嵌套深度。因此,当每个相应嵌套事务提交时,嵌套深度逐渐解开,直到所有事务已提交并且嵌套深度再次回到0。在一些具体实施中,嵌套事务可以被处理为一个大事务,使得响应于最外事务的事务开始指令而执行事务开始操作,并且响应于最外事务的事务结束指令而执行事务提交操作。这可以简化电路具体实施,因为不需要针对例如每个嵌套事务维持多组恢复状态。在这种情况下,一旦提交了最外事务,就可以提交内部嵌套事务。

图3示出了使用事务性存储器支持电路20和处理逻辑4在给定线程内执行事务的示例。事务是由事务开始指令(tstart)和事务结束指令(tend)界定的程序代码部分。如图3所示,响应于事务开始指令,捕获架构寄存器6中的当前架构状态,并且将该状态存储在恢复状态存储电路28中。处理逻辑4开始执行tstart指令之后的后续指令的推测性执行,并且当执行这些指令时,由这些指令访问的地址由地址跟踪电路24跟踪,并且冲突检测电路26检测所跟踪的地址与响应于其它线程而使用加载/存储单元12进行的访问的地址之间的冲突(或所跟踪的地址与由其它内核104访问的地址之间的冲突—可以基于由互连器114响应于从其它内核104发出的存储器访问而发送的探听请求来检测此类冲突)。事务内的指令的至少一些推测性结果存储在推测性结果存储电路22内。例如,在事务保持待决的同时,响应于存储指令STR而存储在高速缓存中或存储到存储器的值可以被保持在推测性结果存储装置22中(例如,L1D$110,其中高速缓存行标记为推测性的)。如果到达事务结束指令(tend)而同时没有发生中止事件,那么响应于事务结束指令,提交推测性结果(例如,清除L1D$110中与该事务相关联的高速缓存行上的推测性指示)。在提交事务之后,可以允许将存储在推测性结果存储装置22中的该线程的任何结果写入到存储器系统的除L1D$110之外的部分,并且可以丢弃或允许重写恢复状态28,因为不再需要将架构状态倒回到遇到事务开始指令之前的点。

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

图3示出了可以如何使用事务开始和结束指令在事务性模式中执行待执行的特定一组处理操作。如图4所示,同一组处理操作也可以使用基于锁的机制在非事务性模式中执行。在这种情况下,在启动由锁管理的关键代码部分之前,至少一个锁检查指令40检查存储器中由锁地址#addLock识别的锁变量,并且检查该锁变量是否指示另一个线程已持有该锁。如果另一个线程持有该锁,那么在该锁被释放之前,该处理不前进到锁检查指令40之外。一旦确定该锁可用,那么就通过将给定值(例如,二进制1)写入到锁地址#addLock来声明该锁。例如,锁检查指令40可以使用原子比较和交换指令来实现,该原子比较和交换指令对存储在指定地址处的当前值进行比较以确定该锁是否被持有,并且如果该锁未被声明则更新锁变量以声明该锁。另选地,锁检查可以用一系列多指令来实现,以读取该锁、测试该锁的值并且如果该锁已被声明则使处理推迟,或者如果该锁当前未被声明则通过更新锁变量来声明该锁。在完成由该锁保护的代码部分之后,一旦不再需要对由该锁保护的资源的排他性访问,另一个指令42就可以释放该锁。例如,由该锁保护的资源可以是由在中间代码部分期间访问的各种地址识别的数据位置。

如上所述的基于锁的方法在例如如果使用事务性模式则可能发生频繁异常中止的情况下可能是有用的。如果在事务期间确实发生频繁中止,则被写入以使用事务性存储器的代码可以默认被写回到基于锁的系统,以便允许指令序列完成。然而,当基于事务性存储器的代码序列的执行成功并且事务被提交时,这通常可以比基于锁的系统更有效。

图5示出了支持用作HTM资源20的地址跟踪电路24和推测性结果存储装置22的特定处理器内核104的L1D$110的一部分的示例。L1D$110包括多个高速缓存行140。每个高速缓存行(或高速缓存条目)存储对应存储器地址的高速缓存的数据156以及可以用于识别哪个地址使其数据高速缓存在对应高速缓存行中的标签值154。单个高速缓存行104中的数据154可以高速缓存行粒度存储,高速缓存行粒度可以大于字节大小的粒度,其中各个数据项可以由处理器内核104以字节大小的粒度来请求,因此高速缓存行中的数据字段156可为多个字节宽,并且标签154可以对应于该数据块中的第一字节的地址(尽管各个字节可以由内核140单独地寻址)。每个高速缓存行140中的有效字段142指示该高速缓存行是否保持有效数据。每个高速缓存行140也包括一致性状态字段144,其用于指示与对应高速缓存行相关联的一致性状态,该一致性状态字段可以由一致性控制器116用于管理高速缓存在相应内核的专用高速缓存中的数据之间的一致性。例如,一致性状态144可以指示对应高速缓存行中的数据被标记为脏还是干净,其中脏数据是这样的数据:其相对于存储在底层存储系统中的对应地址的数据已修改,使得拥有该特定L1D$110的内核负责在该数据从L1D$110被逐出时将该数据写回到存储器。干净数据是与存储在存储器中的底层数据一致的数据(或者其可以不同于存储器中的底层数据,但是其中该数据也被高速缓存在另一个内核104的专用高速缓存中并且该内核负责写回该数据,因此具有被标记为“干净”的经修改数据的内核本身不负责写回)。因此,一般来讲,脏数据是在失效或从高速缓存中逐出时需要被写回的数据,而干净数据是在失效或从高速缓存中逐出时不需要被写回但可以简单地被丢弃的数据。一致性协议也可以支持其它形式的一致性状态,诸如指示数据是专用于单个内核还是与另一个内核共享。一致性状态的特定定义可以取决于所用的协议。

每个高速缓存行也包括用于支持事务性存储器功能性的一些字段146、148、150、152。通过将排他性字段146设定为预定值(例如,1)而将由在事务内执行的存储指令存储到L1D$110的数据标记为推测性的。不与仍待决的事务相关联的高速缓存行具有设定为不同值(例如,0)的排他性字段。当为在待决事务内执行的存储操作分配高速缓存行时,识别该特定事务的事务标识符也被分配到高速缓存行中并且被存储在事务标识符(TXID)字段148内。每个高速缓存行也包括写入集指示标识150和读取集指示标识152,二者分别指示与对应高速缓存行140相关联的地址是用于在TXID字段148中识别的事务的写入集还是读取集的一部分。在待决事务内执行加载操作时,设定读取集字段152以指示该地址在事务期间被读取,并且针对在待决事务内执行的存储操作,设定写入集指示标识150以指示该地址在事务期间被写入。

排他性字段146用于控制对高速缓存的访问,使得在事务内存储到高速缓存的推测性数据对于在执行该事务的同一内核或不同内核上执行的其它线程是不可访问的。因此,在对L1D$110做出指定除在TXID字段148中指定的事务标识符之外的事务标识符(或者不指定任何有效事务标识)的存储器访问请求时,将检测到高速缓存未命中。另外,当互连器114响应于对来自不同内核的对应地址的访问而探听L1D$110时,那么即使高速缓存具有带有对应于该地址的标签154的对应高速缓存行,如果该高速缓存行在排他性字段146中被标记为排他性的,那么返回指示该数据不可用的探听响应以确保仍待提交的事务内的推测性结果对其它线程不可用。

读取集指示标识150和写入集指示标识152用于跟踪在L1D$110中访问的地址并且用于支持冲突检测,使得L1D$110和由一致性控制器116提供的一致性机制可以提供对应于地址跟踪电路24和冲突检测电路26的功能性。可以基于从L2$112和互连器114接收到的探听请求来检测对与读取或写入集内的地址相关联的数据进行读取或写入的尝试,该探听请求可以由另一个内核处的事件触发。如果接收到探听请求,其指示可能存在对被标记为在事务的写入集150内的地址的数据进行读取的尝试,其中对应高速缓存行仍被标记为排他性的,那么这可以指示潜在冲突并且可以触发事务的中止,从而使得与对应事务ID相关联的排他性高速缓存行中的任一者失效以丢弃推测性结果。另外,中止可以触发在事务开始时保存的任何恢复状态的恢复。相似地,在另一个内核处尝试写入被标记为在仍待决的事务的读取集或写入集内的地址可以生成中止。由其它内核尝试读取被标记为在待决事务的读取集内但未被标记为在写入集内的地址不需要触发中止。

图6是示出事务的处理的流程图。在步骤200处,由给定处理器内核104执行事务开始指令,并且这使得在步骤202处捕获事务的恢复状态。例如,寄存器6中的当前值可以被存储到备用存储位置,使得如果事务需要被中止则当前值稍后仍可用。还有可能通过改变用于识别哪些物理寄存器对应于由指令识别的架构寄存器的寄存器映射来捕获恢复状态,以允许在实际上不需要在存储元件之间传送任何数据的情况下执行对恢复状态的捕获,因为重新映射随后可以使得对架构状态的后续更新在与先前存储该状态的位置不同的存储位置中执行。应当理解,存在可以捕获恢复状态的多种方式,但是一般来讲,执行操作以确保如果必要的话,寄存器6的内容可以倒回到其在事务开始指令时所具有的状态。

在步骤204处,处理器内核104开始事务的指令的推测性执行。

在步骤206处,确定在事务处理期间是否已遇到过用于将数据写入到存储器系统的存储指令。如果是,那么在步骤208处,将推测性存储数据写入到L1D$110,并且更新分配有该数据的高速缓存行140以将该高速缓存行的写入集指示标识150设定为指示对应地址为事务的写入集的一部分,更新TXID字段148以指示正在执行的事务的标识,并且将排他性指示标识146设定为指示该高速缓存行中的数据为推测性存储数据,在已提交事务之前应防止该推测性存储数据传递越过L1D$110之外到达另外的高速缓存112、118或存储器。如果没有遇到存储指令,那么省略步骤208。

在步骤210处,处理器内核确定是否已遇到过加载指令(加载指令是用于将数据从存储器系统传送到寄存器6的指令)。如果是,那么在步骤212处,从高速缓存分级结构或存储器系统获得用于加载的目标地址的数据,并且将其分配到L1D$110中(如果其尚未存在于L1D$110中)。为对应于所访问的地址的高速缓存行140设定读取集指示标识152,并且还将所执行的事务的事务标识符分配给该高速缓存行140的TXID字段148。如果没有遇到加载指令,那么省略步骤212。

在步骤214处,处理器内核104确定是否已发生任何中止事件。这可以在以下情形下发生:如果接收到探听请求,其指示存在另一个内核尝试读取设定有写入集指示标识150的地址(该写入集指示标识指示该地址在待决事务的写入集内),或者尝试写入由写入/读取集指示标识152指示为在待决事务的读取集或写入集内的地址。另外,如果在与事务中所涉及的线程相同的内核上执行的另一个线程尝试写入在读取集或写入集中包括的地址,或者读取在写入集中包括的地址,则可以触发中止。另外,中止可以出于非冲突相关原因而触发,诸如由于异常的发生、由于执行不允许在事务内执行的指令的尝试,或者基于资源约束而触发,诸如在以下情形下:L1D$110的所有高速缓存行140已被分配用于存储标记为在待决事务的写入集或读取集内的数据,并且当前事务随后尝试访问需要分配到L1D$110中的另外的地址,其中该分配不可能在不逐出标记为在事务的读取或写入集内的另一行的情况下进行。应当理解,这并不是可能导致事务的中止的所有事件的详尽列表。

当发生事务中止事件时,那么在步骤216处中止事务,并且恢复在步骤202处捕获的恢复状态,使得当恢复程序执行时,那么处理器状态与从未执行过事务时将呈现的状态一致。标记为排他性的、使事务标识符148被设定为与被中止事务的事务ID匹配的高速缓存行140失效,并且可以清除这些行中的排他性指示146(或者另选地,在发生非事务相关高速缓存行填充以将非推测性数据分配给对应高速缓存行140的稍后时间,可以发生排他性指示的清除)。可选地,中止状态信息可以被记录在例如事务中止信息寄存器或可以在其中记录关于事务中止的原因的另一个存储位置中。该信息可以由软件读取以确定在事务的中止之后如何恢复,从而例如有助于软件区分可能再次发生的中止的原因与可能已发生过一次但在重复事务时可能不会发生的原因。此类中止状态信息可以由软件用于确定是否继续尝试执行作为事务的操作或者是否使用如图4所示的基于锁的方法来切换到回退代码。

如果没有发生异常中止事件,那么在步骤218处确定是否已执行事务结束指令。如果是,那么在步骤220处提交事务的任何推测性结果。L1D$110中用已提交事务的事务ID148标记的高速缓存行240被更新以清除其排他性指示标识146,使得这些行不再被标记为推测性的。这意味着这些行现在对在同一内核104上执行的其它线程可见,并且可以由互连器114探听,使得其可以变得对于在其它内核104上操作的处理器是可访问的。另外,在提交事务时,处理器内核4现在可以允许丢弃或重写在步骤202处捕获的事务的任何恢复状态。

图6的方法可以循环通过步骤206、210、214、218,直到这些事件中的一者发生。虽然这些步骤在图6中被顺序地示出,但是在其它示例中,这些步骤可以以不同的次序执行或者可以全部或部分地并行执行,使得不同的检查同时进行。

图7是示出由L1D$处理探听请求的流程图。在步骤250处,L1D$接收探听请求(例如,其来自L2$112)。探听请求可以作为在另一个处理器内核104上触发存储器访问的结果而发出,并且可以指定探听地址。探听请求可以请求L1D$110返回以下中的一者:探听地址的数据是否被有效地高速缓存在L1D$中的指示、与L1D$110中的探听地址的数据相关联的一致性状态144和/或由探听请求指定的地址的数据的脏值被有效地高速缓存在L1D$内(如果数据是脏的)。可以提供不同类型的探听请求以触发不同形式的响应。还有可能接收可以请求在L1D$内针对给定地址使数据失效的探听请求(此类探听请求可以是事件的示例中的一者,其在其中的数据响应于探听而失效的高速缓存行被标记为对待决事务是排他性的时触发事务中止)。

因此,在图7的步骤250处,L1D$接收指定探听目标地址的探听请求,该探听请求需要某种形式的探听响应。在步骤252处,L1D$110确定探听目标地址是否由有效高速缓存行140(为其设定有效指示142的高速缓存行140)的标签字段154指定。如果探听目标地址未被有效地高速缓存在L1D$内,那么在步骤254处返回指示与探听目标地址相关联的数据不可用的探听响应。

如果L1D$确实包括具有对应于探听目标地址的标签154的有效高速缓存行140,那么在步骤256处,L1D$确定对应于探听目标地址的有效高速缓存行是否被标记为排他性的146。如果否,那么在步骤258处向L2$112或互连器114返回指示与探听目标地址相关联的数据可用的探听响应。例如,探听响应可以指示数据的一致性状态(诸如数据是否是脏的)并且/或者(如果数据是脏的)还可以返回与该地址相关联的脏数据值。另一方面,如果在步骤256处证实对应于探听目标地址的有效高速缓存行被标记为排他性的,那么再次在步骤254处返回指示与探听目标地址相关联的数据不可用的探听响应。这防止与尚未被中止或提交的待决事务相关联的推测性数据在L1D$110之外变得可用。这有助于维持在事务内执行的操作所需的原子性保证。

典型的HTM方案已被设计用于不具有PM 124的系统。此类现有HTM方案通常假设存储器是易失性的(诸如DRAM 120),并且因此在事务提交之后,随着从执行事务的内核104的L1D$110的稍后高速缓存逐出触发由事务写入到L1D$110的存储数据的写回,在一段时间内将易失性存储器120中的数据更新为事务的现在提交的结果是可接受的。因此,将存在一段时间,其中由事务写入的地址中的一些可能已在存储器120中更新为在事务中计算的新值,但已在事务中写入的其它地址尚未在易失性存储器120中更新。尽管在易失性存储器120中暂时存在事务的结果的非原子视图,但这不是问题,因为对这些地址的访问将命中高速缓存分级结构的较高层级,并且因此返回从完整的已提交事务产生的正确值。另外,当使用易失性存储器(例如,DRAM)120时,这意味着即使在DRAM 120仅用提交的事务的结果部分地更新的时段期间发生电力故障或复位事件,DRAM 120中和高速缓存分级结构中的数据也将丢失或复位,并且因此在电力循环或复位之后恢复时,在易失性存储器120或高速缓存分级结构中将不存在表示该事务的部分结果的任何存储的数据。

然而,随着使用PM 124作为可按字节寻址的随机存取存储器的系统的开发,包含PM 124意味着在电力故障或复位事件之前写入到PM 124的状态在从断电事件或复位恢复之后仍可见。这在一些场景中可能是有益的,因为恢复数据仍在PM中可以允许后续处理比在数据已丢失的情形下更快地恢复,并且重复在电力故障或复位事件之前执行的处理可能不太必要。

然而,当PM 124与支持HTM的内核104结合使用时,那么大多数现有HTM方案不与PM一起即插即用地工作,就如同在提交事务之后当事务的仅部分结果已被写回PM 124时的时段期间发生电力故障或复位事件,那么这意味着在从电力故障或复位恢复之后,在存储在PM 124中的数据中可见事务的结果的非原子视图,这破坏了HTM方案所需的保证。换句话讲,由于现有HTM系统仅关注原子可见性而不关注原子耐久性,因此现有HTM可以在可见性方面保证并发原子性(通过其它并发线程),但可能无法保证电力故障原子性(关于持久性存储器,即,在电力循环之后恢复线程可以从持久性存储器观察到什么)。换句话讲,现有HTM仅涉及“ACID”的原子性(A)、一致性(C)和隔离度(I)部分,而不涉及事务的耐久性(D)。

用于应对这一点的一些机制可以包括允许高速缓存行在硬件事务内刷新,或者提供用于跟踪在PM 124内的事务内访问的地址的硬件日志机制,但是这将需要对高速缓存和存储器控制器进行硬件改变和/或指令集架构改变,并且可能需要重新编译为不支持PM的HTM系统编写的代码以考虑这些改变。

图8至图10示出了用于解决该问题的另选技术,其需要对ISA或高速缓存110、112、118和存储器控制器126的硬件进行较少改变,并且不需要在事务内访问的地址被记录到PM124。该技术允许解决上述问题,而不需要对已为不具有PM 124的支持HTM的系统编写的软件进行任何改变。

图8示出了示出对排出触发事件作出响应的方法的流程图,该排出触发事件可以是例如断电事件或复位事件。如图9所示,装置可以设置有排出电路170,该排出电路接收指示是否已发生排出触发事件的排出触发信号174。当在图8的步骤280处检测到排出触发事件时,在步骤282处,排出电路174执行排出操作来扫描高速缓存分级结构的子集以识别脏高速缓存行并且将脏高速缓存行写入到PM 124(同时确保防止L1D$中标记为推测性的任何高速缓存行被排出到PM 124)。

如图9的示例中所示,排出电路170可以耦合到从备用电源(诸如电池或电容器)供应电力的备用电源输入176,该备用电源可以在用于在正常操作期间向处理器内核104和高速缓存供电的主电源中发生电力故障时使用。在该示例中,排出电路170以及L1D$110、L2$112和L3$118耦合到备用电源输入176(为了简明起见,备用电源输入176与高速缓存之间的连接在图中未示出,但将在实施过程中提供)。另外,存储器控制器126可以包括同样耦合到备用电源输入176的待决写入队列(WQ)178。在正常处理期间,从主电源向处理器内核104,高速缓存110、112、118以及存储器控制器WQ 178和PM 124供应电力。如果检测到主电源中的电力故障,那么使用备用电源来支持正在执行的排出操作。

因此,当排出触发信号174指示已检测到排出触发事件(例如,主电源中的电力故障或复位事件)时,排出电路170触发待执行的排出操作,该排出操作包括扫描高速缓存分级结构的子集以识别脏高速缓存行并且将脏高速缓存行写入到PM 124。在图9的示例中,在排出操作中执行的扫描应用于存储器系统的排出扫描区域172,该排出扫描区域包括L2$112、L3$118和存储器控制器写入队列178。在图9的示例中,L1D$110从排出扫描区域中被排除。

针对排出扫描区域172内的存储结构,当排出触发器发信号通知排出触发事件时,排出电路扫过这些存储结构112、118、178的每个存储位置(例如,高速缓存行或写入队列条目)并且检查这些位置是否包括脏数据,并且如果位置存储脏数据,那么将该脏数据写回到PM 124以保存它(需注意,在存储器控制器写入队列条目的情况下,写入队列178的所有条目都可以被认为是脏的)。这意味着如果这些脏数据值中的任一者是由最近提交的事务生成的,那么将确保该事务的完整结果被写回到PM 124以确保原子性。备用电源输入176确保即使在正常操作中使用的主电源已发生故障的情形下也存在足够的电力来执行该排出操作。

在图9的示例中,由于L2$112是包含性高速缓存,因此L1D$110中的脏条目也将在L2$112中具有对应条目,因此不必要对L1D$110执行扫描操作。通过从排出扫描区域172中排除L1D$,这减少了执行排出操作所花费的总时间,并且因此备用电源不需要具有更大的容量以处理排出操作,这允许使用更便宜形式的备用电源,诸如上文提及的电池或电容器。另外,这使得排出电路170更简单,因为它不需要检查L1D$中的脏行是否是未提交事务的一部分并且跳过排出此类行(如下文讨论的图10的示例中)。另外,处理器内核104不需要耦合到备用电源,因为备用电源仅旨在提供足以允许执行排出操作的相对有限的电力量,并且不需要提供足够的电力来允许处理器内核继续执行程序。

尽管L1D$110从排出扫描区域中被排除,但是L1D$110连接到备用电源输入176,使得它可以对从L2$112发出的针对L2$中标记为脏的地址的探听请求作出响应,针对该地址,在L1D$110中存在经修改的数据值。如果L1D$包括在排出触发事件时针对待决事务仍被标记为排他性的146任何高速缓存行140,那么将由L1D$返回指示数据不可用的探听响应(如图7的步骤256和254中所述),并且因此该脏数据将不被排出到PM 124。尽管在尚未提交的事务内待决的任何处理的结果因此将在电力循环或复位之后丢失,但这不是问题并且实际上是优选的,因为这将确保之后在PM 124中看到事务的原子视图,其中任何给定事务使其结果全部传播到PM 124或根本看不到。另一方面,如果存在先前被标记为排他性的任何高速缓存行140以指示事务的推测性存储数据,但事务现在已被提交并且因此排他性指示标识146被清除,那么在排出操作期间从L2$112发送的探听请求将触发来自L1D$110的探听响应,其可以提供最新数据并且随后该数据可以被写回到PM 124以确保处理器事务的完整结果全部传播到PM 124,使得在从排出触发事件恢复之后,将看到事务的结果的原子视图。尽管需要一些额外的电力来允许L1D$110对此类探听请求作出响应,但所消耗的电力比在L1D$自身被逐行扫描以识别脏数据的情形下少得多,因此图9所示的方法可以有益于减少实现备用电源的成本并且降低排出电路170的复杂性。

因此,图9所示的方案提供备用能量源以允许在电力故障时将L2$、L3$和存储器控制器写入待决队列中的高速缓存行排出到PM。内核104和L1D$110不在扫描域中,仅已扫描域172中的L2$与PM之间的脏行在电力故障时被排出到PM。将脏高速缓存行排出到PM由处理器中的专用有限状态机电路170来处理,因此内核104可以在检测到电力故障时被断电,同时备用能量开始启用以用排出电路170将已扫描域172中的高速缓存行排挤到PM 124。尽管不在已扫描域172中,但L1数据高速缓存仍通电,因为包含性L2$112中的已陈旧行将通过探听上述L1D$110来提取新数据。因此,L1D$110在已扫描域172中是有效的,但是由于L2是包含性的,所以不需要额外提供备用能量来实际上逐行扫描L1D$。当在提交事务之前发生电力故障时,因为L1D$110不在已扫描域中,所以L1D$110中的脏行(针对部分执行的TX标记为推测性的)不能被排出,在这个意义上与不能使它们对其它并发线程可见(并发原子性)相同,因为为这些行设定了排他性指示标识146。一旦使一个线程中的事务对另一个线程(即,并发观测器)可见,那么由于当与已提交事务相关联的不再是推测性的行从L1D$110被逐出时自然发生的写回,或者在由于由排出电路170执行的排出操作而导致的电力故障或复位时,可以确保该事务也变得持久(或对持久性观测器而言从PM可见)。这是因为(1)如果内核1中的线程请求内核0的L1D$110中的高速缓存行,那么高速缓存行将从L1D$110跨越到与内核0和内核1相关联的L2$112,并且因此将在排出扫描区域172内,以及2)如果同一内核0上的线程请求内核0的L1D$110中的行,那么该行不需要从内核0的L1D$110跨越到L2$112,但是在这种情况下,当执行排出操作时,排出电路将在110中拉入更新的高速缓存行。这意味着与HTM一起运行的应用(在易失性DRAM上)将不需要代码改变来与PM一起工作,从而极大地简化了与启用PM的使用相关联的编程挑战。

图10示出了图9所示的示例的另选方法。如图9所示,提供了排出电路170以响应于排出触发事件而执行排出操作,但是这次L1D$110被包括在排出扫描区域172中。这种方法可以用于使用非包含性L2$112的系统,以确保将由L1D$内的已提交事务产生的任何脏数据排出到PM。通过这种方法,当直接扫描L1D$时,可能不需要L2$向L1D$发出探听,并且替代地可以单独地扫描L1D$110和L2$112以识别脏数据。另外,在该示例中,当L1D$110由排出电路170扫描时,那么设定有将数据标记为推测性的排他性指示标识146的任何高速缓存行140将不被排出到PM 124。在其它方面,图10所示的方法与图9中的相同(不同在于图10中排出电路170可能稍微更复杂,因为其包括用于在扫描L1D$110时检查L1D$110中的脏行是否是未提交事务的一部分并且如果是,那么跳过排出此类脏行的电路逻辑——在图9中将不需要该电路逻辑)。

在图9和图10所示的两个示例中,存储器控制器写入队列178被包括在排出扫描区域172内,以确保如果对在已提交事务内生成的写入数据的任何待决写入请求在排出触发事件时仍在写入队列178中待决,那么它们全部被传播到PM 124以确保在从排出触发事件恢复时在PM 124内存在整个数据集与由事务生成的原子结果一致。需注意,在其它示例中,存储器控制器写入队列178可以使用PM来实现以提供非易失性存储,并且在这种情况下,存储器控制器写入队列178不需要在排出扫描区域172内。相似地,如果使用PM来实现末级高速缓存诸如L3$118,那么该末级高速缓存将不需要在排出扫描区域172内。另外,如果使用PM来实现末级高速缓存118,那么当执行排出操作时,从较高层级的高速缓存110、112排出的脏行可能无法一直被写入到主存储器PM模块124,而是可以被写回到末级高速缓存118。

虽然图9和图10仅示出了与多个内核104相关联的单个排出电路170,但是在诸如图1的多核系统中,每个内核104可以与此类排出电路170相关联。另外,在一些具体实施中,排出电路170的单独实例可以与关联于特定内核104的每个高速缓存级110、112、118相关联,而不是被认为形成与内核整体相关联的单个排出电路170。

图11是更详细地示出在图8的步骤282处执行的排出操作的流程图。图11所示的步骤示出了针对排出扫描区域172内的单个存储结构110、112、118或178的扫描操作。图11的方法可以针对排出扫描区域172内的存储结构中的每一者并行地或顺序地单独执行。为了简明起见,图11仅示出了用于扫描这些结构中的一者的步骤。

在步骤300处,排出电路170扫描正被扫描的存储结构的下一行(其可以是高速缓存110、112、118的行或存储器控制器写入队列178中的条目)。在步骤302处,排出电路170确定存储结构的已扫描行是否是脏的。针对高速缓存,这可以基于与已扫描的高速缓存行相关联的一致性状态指示标识144(或脏指示标识)来确定。针对存储器控制器写入队列178,该队列中的所有待决条目可默认被认为是脏的。如果已扫描行不是脏的,那么在步骤304处,排出电路170确定该行不需要被排出到PM 124,并且在步骤320处,确定存储结构的所有行是否都已被扫描,并且如果是,那么在步骤322处,扫描结束。如果行仍等待被扫描,则该方法返回到步骤300以扫描存储结构的下一行。

另一方面,如果在步骤302处确定已扫描行是脏的,则在步骤306处,排出电路170确定已扫描行是否有效。如果是,那么在步骤308处,排出电路170确定已扫描行是否在L1D$110内并且具有被设定为将高速缓存行标记为排他性的排他性指示标识146,从而指示该高速缓存行中的数据156是待决事务的推测性存储数据。如果是,则在步骤304处,L1D$的高速缓存行140不被排出到PM 124,因为该行仍是推测性的并且不应在对应事务已提交之前被传播到下游高速缓存或PM。另一方面,如果在步骤306处确定为有效的已扫描的高速缓存行不在L1D$中,或者其在L1D$110中但未被标记为排他性的,那么在步骤310处,已扫描的高速缓存行被排出到PM。如果被扫描的结构是高速缓存110、112、118,那么排出电路170控制高速缓存生成写回请求以将数据从已扫描的高速缓存行写回到PM 124。相似地,如果该行在存储器控制器写入队列178中,那么处理待决写入请求以将对应数据写入到PM 124。

应当理解,在诸如图9的一些实施方案中,其中L1D$从排出扫描区域中被排除,那么步骤308处的回答将总是为否,并且因此实际上在此类实施方案中,当已扫描的高速缓存行是脏的且是有效的时,该方法可以直接从步骤306前进至步骤310。在这种情况下,不需要在步骤308处检查条件。还应当理解,在实施过程中,步骤308可以不被实现为对行是否在L1D$中的显式检查,而是在L1D$110在排出扫描区域172内的一些具体实施中,排出电路170可以包括对应于L1D$110的第一组扫描逻辑以及与其它高速缓存或存储器结构相关联的第二组扫描逻辑,针对L1D$110,第一组扫描逻辑检查行是否是脏的、有效的和非排他性的,并且当满足所有这些要求时触发将行排出到PM 124,第二组扫描逻辑则省略了关于高速缓存行的排他性的检查,并且如果行是脏的且是有效的,则简单地将数据写回到存储器。

如果在步骤306处确定存储结构的扫描行是脏的但是无效的,那么该方法前进至步骤312(这可以在L2$112或L3$118是包含性高速缓存并且包括与存储在L1D$110中的脏数据相对应的高速缓存行的示例中发生,其中L2$112或L3$118中的对应条目被标记为无效且脏以发信号通知L2$112或L3$118$没有保持最新数据但是在L1D$中的其它地方存在将需要被写回到存储器的数据)。在步骤312处,排出电路170确定该行是在L2$112还是L3$118中。如果该行在L3$118中,那么在步骤313处,不将该行排出到PM 124,并且该方法前进至步骤320以确定是否所有行都已被扫描。

如果在步骤312处确定已扫描行在L2$112中,那么在步骤314处向L1D$110发送探听请求以请求数据的最新副本,并且在步骤316处确定是否已从L1D$返回包括脏数据的探听响应。另选地,在一些示例中,步骤314可以不需要排出电路170的显式动作。在一些具体实施中,可以经由L2$112发出对L1D$110的所有探听,因此在这种情况下,排出电路170可以类似于DMA主控器起作用,其在步骤300处简单地尝试读取L2$112中的所需行,并且如果确定该行是脏的,那么这将使得L2$112向L1D$110发出探听请求以拉入脏数据。

不管对L1$110的探听请求是由L2$112发送还是由排出电路170发送,如果所探听的高速缓存行被标记为非排他性的,那么可以由L1D$返回包括脏数据的探听响应,但如果该行被标记为排他性的,那么其仍与尚未提交的待决事务相关联,并且因此对应探听响应将指示数据不可用。如果从L1D$110接收到的探听响应指示数据不可用(或以其它方式不返回脏数据),那么在步骤313处,不将L2$的已扫描行排出到PM,并且该方法随后返回到步骤320以确定是否存在任何更多行待扫描。相比之下,如果来自L1D$的探听响应提供脏数据,那么在步骤318处将从L1D$110接收的脏数据排出到PM,并且该方法再次返回到步骤320。最后,在扫描了存储结构的所有行之后,该方法在步骤322处结束,并且随后可以将备用电源断电(假设待扫描的所有其它存储结构也已完成)。

在图11的示例中,在L2$112中的高速缓存行是脏的(步骤302)且是无效的(步骤306)情况下,该高速缓存行被识别为经修改但已陈旧。然而,其它示例可以使用不同技术来指示高速缓存行是否经修改但已陈旧。更一般地,如果在扫描至少一个另外层级的高速缓存时识别出经修改但已陈旧的高速缓存行,则可以发出在步骤314发送的探听请求。

在本申请中,字词“被配置为…”用于意指装置的元件具有能够执行所限定的操作的配置。在该上下文中,“配置”意指硬件或软件的互连的布置或方式。例如,该装置可以具有提供所限定的操作的专用硬件,或者可以对处理器或其他处理设备进行编程以执行该功能。“被配置为”并不意味着装置元件需要以任何方式改变以便提供所限定的操作。

虽然本文已结合附图详细描述了本发明的示例性实施方案,但应当理解,本发明并不限于那些精确的实施方案,并且在不脱离所附权利要求书所限定的本发明的范围的前提下,本领域的技术人员可在其中实现各种变化和修改。

相关技术
  • 用于高速缓存持久二级存储器数据的技术
  • 具有支持存储器操作的虚拟行的非易失性存储器
  • 用于非易失性存储器设备的电压生成器及其操作方法
  • 用于执行内部处理的存储器设备及其操作方法
  • 用于存储器内操作的设备和方法
  • 冲刷涉及持久性存储器的高速缓存行
  • 存储器侧高速缓存内容的持久性高速缓存
技术分类

06120115983525