缓存行状态的制作方法

文档序号:17398261发布日期:2019-04-13 00:59阅读:174来源:国知局
缓存行状态的制作方法

本发明涉及缓存存储器和控制数据处理系统中的缓存存储器的方法。



背景技术:

已知具有缓存存储器的数据处理系统。与访问存储器在数据处理系统的主存储器中的相同数据相比,缓存存储器可以更快且更高效地访问存储器在其中的常用数据。

与主存储器相比,缓存存储器通常具有有限的大小,因此在任何给定时间,仅存储器在主存储器内的数据的子集也存储器在缓存存储器内。

期望提供更高效地使用其可用存储器空间的缓存存储器。



技术实现要素:

根据本公开的第一方面,提供了一种控制缓存存储器的方法,所述缓存存储器包括缓存行,所述缓存行被配置为存储数据条目,这些数据条目表示当存储器访问指令包括对应于与缓存行相关联的标签的存储器标识符时可以从缓存存储器取回的数据。与所述缓存行相关联的所述标签包括与独立缓存行相关联的独立标签部分,以及可以与多个缓存行相关联的可共享标签部分,所述独立标签部分包括指向可共享标签存储器位置的指针,该可共享标签存储器位置包括可共享标签部分。

所述方法包括:允许重复使用所选的可共享标签存储器位置,并且因此将包括在其中的第一可共享标签部分更新为第二可共享标签部分。识别与独立标签部分相关联的一个或多个缓存行,所述独立标签部分包括指向所选的可共享标签存储器位置的指针;并且为每个所述标识的缓存行设置给定的缓存行状态,其中所述给定的缓存行状态:

a)允许关于在设置所述给定缓存行状态之前接收的存储器访问指令继续使用缓存行;并且

b)禁止关于在设置给定缓存行状态之后接收的存储器访问指令使用缓存行。

在一些实例中,所述方法包括在设置所述给定状态之前设置较早的缓存行状态,所述较早的缓存行状态防止所述所选的可共享标签存储器位置被重复使用。所述方法可以包括:在向数据存储器发送存储器访问指令以取回用于作为所述缓存行的一部分存储的数据之前为缓存行设置所述较早的缓存行状态。

在一些实例中,所述方法包括在设置所述给定状态之前和在向数据存储器发送存储器访问指令以取回用于作为所述缓存行的一部分存储的数据之后为缓存行设置中间缓存行状态。所述中间缓存行状态允许重复使用所述选择的可共享标签存储器位置。所述中间缓存行状态可以是第一中间缓存行状态,并且所述方法可以包括在基于对所述数据存储器的所述存储器访问指令将数据作为所述缓存行的一部分存储在所述缓存存储器中之后为所述缓存行设置第二中间缓存行状态。所述第二中间缓存行状态允许重复使用所述选择的可共享标签存储器位置。

在一些实例中,所述给定缓存行状态包括第一给定缓存行状态和第二给定缓存行状态之一。所述方法可以包括:为下述所识别的缓存行设置所述第一给定缓存行状态:针对所识别的缓存行对应的存储器访问指令已经被发送到数据存储器以取回作为每个相应缓存行的一部分进行存储的相应的数据;并且为下述所识别的缓存行的每一个设置所述第二给定缓存行状态:针对所识别的缓存行各个数据作为每个相应缓存行的一部分被存储在所述缓存存储器中。

在一些实例中,所述方法包括在所述给定状态之后设置后一个缓存行状态,所述后一个缓存行状态允许重复使用所述缓存行。所述方法可以包括:确定依赖于具有所述给定缓存行状态的每个所识别的缓存行的相应数量的指令;并且为所识别的相应数量的从属指令为零的缓存行的每一个设置所述后一个缓存行状态。

在一些实例中,所述方法当允许关于在设置所述给定缓存行状态之前以及在重复使用所述选定的可共享标签存储器位置之前接收的存储器访问指令继续使用缓存行时包括:锁定所述缓存行;获取缓存存储器中的缓存行的索引;并且将索引和存储器访问指令的标识符作为条目存储在缓存中。

所述方法可以进一步包括:将所述存储器访问指令中继到所述数据存储器以取回用于作为缓存存储器的一部分存储在所述缓存存储器中的数据;在所述缓存存储器处接收所述数据;识别所述缓冲器中与所述存储器访问指令的标识符相对应的条目;从所述缓冲器中的条目获取所述缓存存储器中缓存行的索引;基于所述索引访问所述缓存存储器中的缓存行;并且将所述数据作为所述缓存行的一部分进行存储。

在一些实例中,所述方法在重复使用所选的可共享标签存储器位置之前包括:接收对未存储在缓存存储器中的数据的请求;分配缓存行以将所述数据存储器在缓存存储器中;向所述数据存储器发送存储器访问指令以取回用于作为所述缓存行的一部分存储的数据;使所述存储器访问指令的标识符与所述缓存存储器中的所述缓存行的索引相关联。

在一些实例中,所述方法包括:在缓存存储器处接收与提交给数据存储器的存储器访问指令相关联的数据之后,基于存储器访问指令的标识符获得所述的缓存行的索引;并且将表示数据的数据条目作为缓存存储器中的所述缓存行的一部分进行存储。

在一些实例中,所述方法包括:接收与由存储器在所识别的缓存行之一中的数据条目表示的数据相对应的存储器访问指令;以及基于具有给定缓存行状态的所述缓存行来发信号通知缓存未命中。

在一些实例中,所述方法包括,对于缓存存储器的每个缓存行,在数据结构中存储:第一数据值,表示相应的缓存行是否与所选的可共享标签存储器位置相关联;第二数据值,表示相应的缓存行是否与未决的存储器访问指令相关联。

在一些实例中,所述方法包括确定与所选的可共享标签存储器位置相关联的缓存存储器的多个缓存行。

在一些实例中,所述方法包括:接收刷新指令以清除存储在所述缓存存储器中的数据;为缓存存储器的每个缓存行设置给定的缓存行状态;根据每个缓存行确定多个指令;并且响应于确定用于缓存存储器中的缓存行的子集的依赖于每个缓存行的指令的数量为零,清除作为缓存行的子集中的每个缓存行的一部分存储的数据。

根据本公开的第二方面,提供了一种缓存存储器,所述缓存存储器被配置为执行第一方面的任何所述方法。

根据本公开的第三方面,提供了一种数据处理系统,所述数据处理系统包括:处理器,被配置为输出存储器访问指令;以及缓存存储器,包括缓存控制电路,所述缓存控制电路被配置为执行第一方面的任何所述方法。

附图说明

图1示出了根据实例的包括主存储器和缓存存储器的数据处理系统的示意图。

图2示出了图示根据实例的控制缓存存储器的方法的流程图。

图3示出了根据实例的包括在缓存存储器中的缓存行的示意性状态过渡图。

具体实施方式

在本说明书中,出于解释的目的,阐述了某些实例的许多具体细节。说明书中对“实例”或类似语言的指代意味着结合该实例描述的特定特征、结构或特性至少包括在该实例中,但不一定包括在其他实例中。还应当注意,为了容易解释并理解实例的基本概念,示意性地描述了某些实施例,其中省略和/或必然简化某些特征。

图1示意性地示出了包括处理器110、主存储器120和缓存存储器130的数据处理设备100。缓存存储器130设置在处理器110和主存储器120之间,并且可以用于存储或缓存存储在主存储器120中的数据的子集125。处理器110可以是能够读取并执行程序指令的处理器核。与主存储器120相比,缓存存储器130可以是更小、更快的存储器,并且可以提供更快和/或更高效的访问(例如,使用更少的能量)缓存存储器130中缓存的任何给定数据(与从主存储器120访问给定数据相比)。

缓存存储器130可以是被配置为存储从主存储器120取出的可执行指令的指令缓存、用于存储从主存储器120取出的数据的数据缓存、能够执行这两个功能的缓存或者作为存储器管理单元(mmu)的一部分的转译后备缓冲器(tlb)。本文中使用的术语“数据”通常包括特定缓存存储器130被配置为存储的任何类型的数据,例如用于指令缓存的可执行指令,或用于tlb的虚拟到物理地址转译。缓存存储器130可以是“只读的”。

在一些实例中,缓存存储器130可以是用于图形处理系统的纹理缓存,例如用作图形管线的一部分。在这样的实例中,缓存存储器可以被配置为存储例如代表纹理空间中的一个或多个纹理元素或“纹素”的纹理数据。

缓存存储器130被分成多个块,被称为“缓存行”或“缓存块”140、150。缓存行140、150可以在缓存存储器130中被索引,并且包括用于存储从主存储器120传输或复制的数据145、155的存储器空间。

在已知的缓存存储器系统中,每个缓存行140、150与对应于(例如,至少部分匹配)表示数据存储器(例如,主存储器120)中到该特定缓存行的位置的存储器标识符(例如,存储器地址)的标签相关。标签可以与缓存行140、150一起存储器或者被包括作为它们的一部分,或者可以与缓存行分开存储在例如标签存储器中,该标签存储器可以被包括在缓存存储器130或物理分离且分立的存储器中。

在可替代的命名中,在主存储器120和缓存存储器130之间传输的数据(例如,在固定大小的块中)可以被称为缓存行或缓存块,并且缓存存储器130可以存储“缓存条目”,其中每个缓存条目包括复制的数据(缓存行)和标签。

处理器110,在读取或写入主存储器120中的位置之前,例如,作为存储器访问指令(比如存储器访问请求)的一部分,可以首先检查缓存存储器130以查找与主存储器位置相对应的内容(即数据)。

如果在缓存存储器120中找到数据,则可能发生“缓存命中”,如果不是,则可能发生“缓存未命中”。在缓存命中的情况下,可以直接从缓存存储器130读取数据。

在缓存未命中的情况下,可以以速度和效率为代价从主存储器120读取数据,并且还可以将数据存储在缓存存储器130中以便随后更快地访问。可以向缓存存储器130提供替换策略以确定应该从缓存存储器130中移除哪个缓存行140、150(其可能已经包含数据145、155),以便腾出空间用于从主存储器中取出并存储在缓存存储器130中的新数据。存在许多已知的缓存替换策略的实例,比如最近最少使用、轮询调度(roundrobin)和(伪)随机搜索。

缓存存储器130可以包括缓存控制器,例如缓存控制电路。缓存控制器可以从处理器110接收存储器访问指令,并且可以处理这些指令以在缓存存储器130中搜索数据。缓存控制器还可以在缓存命中的情况下取回存储的数据,并将所述数据传送到处理器110。在缓存未命中的情况下,缓存控制器可以提交另外的存储器访问指令,例如将从处理器110接收的存储器访问指令中继到主存储器120,以取回所述数据并将其传送到处理器110。在替代实例中,缓存控制器可以在缓存存储器130的外部并且耦合到缓存存储器。

如所描述的,缓存存储器130的标签可以用于将主存储器120的存储器位置映射到缓存行,在该缓存行处,存储在主存储器120的所述存储器位置的数据已被(或将被)复制并存储在缓存存储器130中。

例如,主存储器120可以包括存储器位置,每个存储器位置由m位存储器标识符表示。所述存储器标识符的最低有效k位(例如,存储器地址)可以对应于缓存存储器130的索引,其中每个索引对应于特定的缓存行。地址的剩余(m-k)位可以对应于标签。因此,索引和给定缓存行的标签的串联可以对应于表示主存储器120中的存储器位置的特定存储器标识符。

当检查缓存存储器130的给定数据时,例如,作为存储器访问指令的一部分,存储器标识符的最低有效k位可以被映射到缓存存储器130的索引。可以将标识符的剩余(m-k)位与缓存存储器130的映射索引处的缓存行的标签进行比较。如果标签匹配,并且缓存行有效(即,包括可以由标志值指示的存储的数据),则可以从缓存存储器130读取给定数据。

迄今在已知系统的上下文中描述的这种标签(其中每个缓存行与相应的标签相关联)在本文中可称为“扁平标签”。如上所述,在已知的缓存存储器130和用于操作它们的方法中,扁平标签可以用于将存储器标识符的一部分(它作为整体表示例如在主存储器120中的存储器位置)映射到与扁平标签相关联的缓存行。存储器标识符的剩余的最低有效部分可以由缓存行的索引提供。

在本文描述的实例中,并且与扁平标签相反,标签可以以独立标签部分160、165(与缓存存储器130的每个缓存行140、150分开)和可共享标签部分170(可在两个或更多个缓存行之间共享)的形式存储,其中指针数据将独立标签部分与可共享标签部分相关联。

每个缓存行140、150可以被映射到缓存存储器130外部的不同存储器位置(例如,在主存储器120中)。可共享标签部分170可以包括对于两个或多个相应的缓存行标记相同的两个或更多个存储器标识符的一部分。独立标签部分160、165可以包括对于所述两个或更多个缓存行140、150不同的存储器标识符的相应剩余部分。

指针数据将独立标签部分与可共享标签部分相关联,即,以便为缓存存储器130中的每个缓存行生成标签,即对应于所描述的已知系统中的扁平标签。每个独立标签部分160、165可以包括指针,例如指针数据,该指针指向包括可共享标签部分170的可共享标签存储器位置。例如,可共享标签存储器位置可以是包含在可共享标签存储器内的多个可共享标签存储器位置之一。每个可共享标签存储器位置可以具有用于每个可共享标签部分的单独索引和存储器区域。因此,给定的独立标签部分160、165的指针可以通过对应于或匹配可共享标签存储器中的所述可共享标签部分的索引,将所述独立标签部分160、165与特定可共享标签部分170相关联。可共享标签存储器可以包括在缓存存储器130中,或者可以在缓存存储器外部。例如,可共享标签存储器可以存储在与独立标签部分160、165和/或相关联的缓存行140、150分开且不同的存储器中,或者存储在多级缓存存储器的另一个缓存级别中。

以这种方式,可以组合单独的可共享和独立标签部分160、165、170以形成标签,这些标签中的每一个能够以与扁平标签相同的方式起作用(例如,当检查缓存存储器130的给定数据时),作为存储器访问指令的一部分。每个可共享标签部分170可以存储在一个位置,即,给定的可共享标签存储器位置,并且因此与将可共享标签部分170作为扁平标签的一部分存储在缓存存储器的每个缓存行中(如同在已知的缓存存储器系统中)相比,可以节省存储器区域。

但是,分别存储可共享和独立标签部分可能意味着新的存储器访问指令,即,遵循使得从数据存储器复制数据并将其存储在缓存存储器中的先前的存储器访问指令,可能基于与新指令中包含的存储器标识符匹配的相关标签将缓存行误标识为缓存命中。例如,不同的过程可以更新存储在可共享标签存储器位置中的可共享标签部分。

例如,已清除其存储的数据或“被无效”并且因此可覆写的缓存行将以其他方式导致与缓存行相关联的可共享标签部分也“被无效”(因此也是可覆写的)。然而,与另一个未被无效的缓存行相关联的独立标签部分仍然可以指向包括可共享标签部分的相同可共享标签位置,该可共享标签部分现在对于该缓存行是“错误的”。因此,在存储器访问请求之后可能发生不正确的缓存命中,并且可能向例如提交存储器访问请求的处理器提供错误的数据。在这种情况下反而会发生缓存未命中,并且应该反而从数据存储器(例如主存储器)取出存储器访问指令中请求的数据。然后,新获取的数据可以存储在不同的缓存行中,这些缓存行可以通过指向包括正确的可共享标签部分的可共享标签存储器位置(可以是“错误的”缓存行之前指向的可共享标签存储器位置)的相关联的独立标签部分与正确的可共享标签部分相关联。

解决该问题的一个选项可以是不允许重复使用可共享标签位置,即不允许更新存储在其中的可共享标签部分,直到指向它们的所有缓存行都处于无效状态。然而,这可能是低效的,因为缓存行可以被指令锁定,即防止被无效,因此可共享标签存储器位置也可以有效地被锁定,即防止被重复使用。

另一个选项可以是使指向可共享标签存储器位置(每当指向它的缓存行之一被无效时)的所有缓存行无效。然而,这也可以是低效的,并且可以使得对于每个缓存行系统,使用可共享标签部分比使用已知的完整标签低效。

本文中描述的实例涉及识别可共享标签位置可以“被释放”以供重复使用的点,即使指向可共享标签位置的缓存行可能仍由指令使用(例如,它被锁定以供其他指令使用,或者在缓存行已经被分配以存储所述数据之后等待来自主存储器的数据)。本实例允许重复使用可共享标签存储器位置,但是可以在重复使用之后选择性地防止指令访问可共享标签存储器位置。例如,新指令在尝试访问指向可共享标签存储器位置(在被重复使用之前)的任何独立标签部分(和相关联的缓存行)时可能不被允许访问重复使用的可共享标签存储器位置。如果新指令寻址在重复使用可共享标签存储器位置之后已分配的缓存行,则新指令可以访问重复使用的可共享标签存储器位置。因此,本实例可以降低错误缓存命中的可能性。在某些情况下,完全阻止了错误缓存命中。

图2示出了说明控制包括缓存行的缓存存储器的方法200的流程图。如所描述的,这样的缓存行被配置为存储数据条目,这些数据条目表示当存储器访问指令包括对应于与缓存行相关联的标签的存储器标识符时可以从缓存存储器取回的数据。

如本文所述,与所述缓存行相关联的所述标签包括与独立缓存行相关联的独立标签部分,以及可以与多个缓存行相关联的可共享标签部分。

给定的独立标签部分可以与相关联的缓存行一起存储或者被包括作为它的一部分,或者可以被单独存储到例如在标签存储器或标签内存(可以被包括在缓存存储器中或物理上分离的且离散的存储器中)中的所述缓存行。在任何情况下,每个独立标签部分可以被认为在功能上是相应的缓存行的一部分。

如上所述,独立标签部分包括指向可共享标签存储器位置的指针,该可共享标签存储器位置包括可共享标签部分。

方法200涉及:在框210处,允许重复使用所选的可共享标签存储器位置,并且因此将包括在其中的第一可共享标签部分更新为第二可共享标签部分。允许重复使用所选的可共享标签存储器位置可以包括在所选的可共享标签存储器位置处重复使用存储器空间,例如将包括在其中的第一可共享标签部分更新为第二可共享标签部分,其中第二可共享标签部分如所描述的那样发挥作用。可替代地,允许重复使用所选的可共享标签存储器位置可以包括将其释放以供重复使用,例如有效地将可共享标签存储器位置标记为可用于存储新的(例如,第二)可共享标签部分。

方法进一步涉及:在框220,识别与独立标签部分相关联的一个或多个缓存行,独立标签部分包括指向所选的可共享标签存储器位置的指针。例如,可以分别检查独立标签部分的指针以确定它们是对应于还是匹配所选的可共享标签存储器位置。对于那些确实对应的指针,因此识别相关联的一个或多个缓存行。

方法进一步涉及:在框230,为每个识别的缓存行设置给定的缓存行状态。给定的缓存行状态:

a)允许关于在设置所述给定缓存行状态之前接收的存储器访问指令继续使用缓存行;并且

b)禁止关于在设置给定缓存行状态之后接收的存储器访问指令使用缓存行。

禁止所识别的缓存行被“新的”存储器访问指令(即,在设置给定缓存行状态之后接收的)使用可以减少由于试图访问存储器在这些行中的数据的这种存储器访问指令而导致的错误缓存命中的可能性。在某些情况下,防止了这种错误的缓存命中。尝试访问给定状态中的缓存行的数据的任何新指令可以分配新的缓存行以及可能新的可共享标签存储器位置。

例如,方法200可以进一步包括:接收与由存储器在所识别的缓存行之一中的数据条目表示的数据相对应的存储器访问指令;以及基于具有给定缓存行状态的所述缓存行来发信号通知缓存未命中。

缓存行状态或给定缓存行的状态可以由包括在缓存行中的状态数据表示,例如作为与缓存行相关联的独立标签部分的一部分。状态数据可以包括用于指示缓存行处于什么状态的数据。例如,在缓存行可以处于有效状态(在存储数据时)以及无效状态(在不存储数据时)的简单已知情况下,状态数据可以包括具有两个可能值的位;有效和无效状态各一个。在本文描述的实例中,其中缓存行可以是多个状态中的一个状态,状态数据可以包括具有至少与可能的缓存行状态一样多的可能值的位串。在某些命名中,这种状态数据可称为“标志(flag)”。

在一些实例中,方法200可以包括在设置所述给定状态之前设置较早的缓存行状态。较早的缓存行状态可以防止重复使用所述选择的可共享标签存储器位置。例如,可以为已分配(即,映射到存储器位置)的缓存行设置较早的缓存行状态,但是在数据存储器的存储器访问指令已经被发送以取回用于存储在所述缓存行中或作为所述缓存行的一部分的数据之前。数据存储器可以是以下各项中的一个或多个:被包括在缓存存储器中的不同缓存级别;另一个缓存存储器;主存储器;以及二级存储器。

当该较早的缓存行状态中的缓存行(可以称为“已分配的”状态)时,与缓存行相关联的可共享标签部分可用于将存储器访问指令提交给数据存储器。例如,可共享标签部分可以与独立标签部分(与缓存行相关联)组合或串联以与对应于数据存储器中的存储器位置的(至少一部分)存储器标识符(例如,存储器地址)对应。存储器标识符可以被包括在数据存储器的存储器访问指令中。防止重复使用所选的可共享标签存储器位置可以允许通过使用当前存储在所选的可共享标签存储器位置中的可共享标签部分将存储器访问指令发送到数据存储器,因此,在缓存行和数据存储器中的存储器位置之间给出正确的映射。

在某些情况下,可以在缓存存储器处接收给定的存储器访问指令,但是可共享标签存储器位置中的任何一个都不可重复使用,使得不能分配可共享标签部分。在这种情况下,可以停止指令流,直到可以分配可共享标签存储器位置,例如变得可重复使用。可替代地,可以在重试给定的存储器访问指令之前处理指令流中的其他存储器访问指令。

在一些实例中,方法200可以包括在设置所述给定状态之前和在向数据存储器发送存储器访问指令以取回用于作为所述缓存行的一部分存储的数据之后为缓存行设置中间缓存行状态。中间缓存行状态可以允许重复使用所选的可共享标签存储器位置,如先前参考图2中所示的方法200的框210所描述的。

例如,当处于可称为“请求”状态的中间缓存行状态时,给定缓存行可能正在等待从数据存储器取回数据并作为给定缓存行的一部分存储。由于已经提交了对数据存储器的存储器访问指令,因此可能不需要与给定缓存行相关联的可共享标签部分来提交另一个存储器访问指令,因此可以重复使用存储它的可共享标签存储器位置。重复使用可共享标签存储器位置可以“触发”图2中所示的方法200的框220、230,即,与包括指向所选可共享标签存储器位置的指针的独立标签部分相关联的缓存行被设置为给定缓存行状态。

在一些实例中,中间缓存行状态是第一中间缓存行状态,并且该方法可以包括在将数据作为缓存行的一部分存储在缓存存储器中之后,为给定缓存行设置第二中间缓存行状态。例如,可以基于对数据存储器的存储器访问指令取回数据。因此,直到重复使用可共享标签存储器位置,处于请求状态的给定缓存行可以等待从数据存储器中取回数据,并且当取回到所述数据时,给定的缓存行可以被设置为第二中间缓存行状态(可以被称为“有效”状态)。当缓存行处于有效状态时,可以当发送到缓存存储器的存储器访问指令包括与缓存行相关联的标签对应的存储器标识符时从缓存存储器取回作为缓存行的一部分存储的数据。第二中间缓存行状态(有效状态)还可以允许重复使用与可用状态的缓存行相关联的独立标签部分所指向的可共享标签存储器位置。如参考第一中间缓存行状态所描述的,重复使用可共享标签存储器位置可以“触发”图2中所示的方法200的框220、230。

在其他实例中,在图2中示出的方法200的框230处,为每个识别的缓存行设置的给定缓存行状态可以包括第一给定缓存行状态和第二给定缓存行状态之一。方法200可以涉及为下述每个识别的缓存行设置第一给定缓存行状态:针对所识别的缓存行对应的存储器访问指令已经被发送到数据存储器以取回作为每个相应缓存行的一部分进行存储的相应的数据。可以为下述每个识别的缓存行设置第二给定缓存行状态:针对所识别的缓存行各个数据作为每个相应缓存行的一部分被存储在缓存存储器中。例如,可以在等待从数据存储器中取回数据以便作为所述缓存行的一部分存储的那些识别的缓存行与存储从数据存储器取回的数据的那些识别的缓存行之间进行圈定。例如,第一给定缓存行状态可以被称为“请求延迟无效”状态,并且第二给定缓存行状态可以被称为与上述请求并有效状态并行的“延迟无效”状态。当从数据存储器请求的数据被取回并为缓存行的一部分存储时,缓存行可以从请求延迟无效状态过渡到延迟无效状态。

在一些情况下,响应于重复使用与缓存行相关联的可共享标签存储器位置,缓存行可以从有效状态过渡到延迟无效状态。

在一些实例中,图2的方法200可以包括在所述给定状态之后设置稍后的缓存行状态,后一个缓存行状态允许重复使用缓存行。例如,后一个缓存行状态可以称为“无效”状态,从而发信号通知具有后一个缓存行状态的给定缓存行是空的或没有存储的数据,因此可用于存储对应于缓存存储器外部的存储器位置的数据。在一些命名中,使缓存行过渡到无效状态并清除其存储的数据可以被称为“驱逐”缓存行,使得处于无效状态的缓存行被称为已“被驱逐”。

在其他实例中,图2的方法200可以包括确定依赖于具有所述给定缓存行状态的每个所识别的缓存行的相应数量的指令。指令可以是由耦合到缓存存储器的处理器可执行的操作,该操作依赖于存储在数据存储器(例如主存储器)中的数据。如上所述,存储在数据存储器中的这种数据也可以存储在缓存存储器中。因此,该方法可以涉及确定有多少这样的指令或操作依赖于所识别的缓存行(即,与包括指向已经被重复使用的所选可共享标签存储器位置的指针的独立标签部分相关联的那些缓存行),这些缓存行具有给定缓存行状态,例如处于所请求的延迟无效状态和/或延迟无效状态。

在实例中,缓存存储器的每个缓存行具有与其相关联的使用指示符,每个缓存行存储依赖于相应缓存行的相应数量的指令。使用指示符可以称为“参考计数器”。例如,给定缓存行的参考计数器可以在查询给定缓存行时递增,并且可以在已经读出存储在给定缓存行中的数据时递减。以这种方式使用使用指示符或参考计数器可以用于识别在任何一个时间正在使用哪些缓存行,例如其各自的参考计数器是非零的。因此可以锁定这种缓存行以防止对这些行的任何改变;进一步描述如下。

使用指示符还可以允许“非活动”缓存行(例如其参考计数器等于零的缓存行)被驱逐以便分配给新请求的存储器位置。例如,方法200可以包括为每个识别的相应数量的从属指令(参考计数器)为零的缓存行设置后一个缓存行状态(无效状态)。如前所述,可以以多种方式选择要被驱逐(设置为无效状态)的非活动缓存行,例如使用(伪)随机搜索,或者通过缓存行列表顺序搜索,或者通过跟踪并识别最近最少使用的非活动缓存行。

在一些实例中,图2的方法200涉及,当允许关于在设置所述给定缓存行状态之前以及在重复使用所述选定的可共享标签存储器位置之前接收的存储器访问指令继续使用缓存行时,锁定所述缓存行。锁定给定缓存行可以通过锁定指令来实施,该锁定指令可以将缓存行的状态更新为锁定(例如,缓存行可以处于有效状态并被锁定)。当被锁定时,可以不驱逐缓存行,使得由缓存行存储的数据在缓存存储器中保持可用于处理器。

存储在缓存存储器中的标签(以指针关联的单独且可共享标签部分的形式)可以用于确定表示包括要存储器在缓存行中的数据的存储器位置的存储器标识符(例如,存储器地址)。存储器标识符的这种确定可以异步完成。例如,指令可以一次分配多个缓存行。在实例中,后台进程扫描所分配的缓存行并一次一个地发出相应的存储器访问指令(例如,内存请求)。通常可以快速发出这样的请求。

如果重复使用给定的可共享标签存储器位置(由与给定的锁定的缓存行相关联的独立标签部分指向),则给定的锁定的缓存行(以及具有指向给定可共享标签存储器位置的独立标签部分的任何其他锁定缓存行)可以被映射到不同的存储器位置,因此易受错误的缓存命中的影响。

因此,方法200可以涉及进一步锁定关于在设置所述给定缓存行状态之前以及在重复使用所述选定的可共享标签存储器位置之前接收的存储器访问指令使用的给定的缓存行,获取缓存存储器中的缓存行的索引,并将索引和存储器访问指令的标识符作为条目存储在缓存中。缓存行的索引可以称为其“行id”,并且可以等于它占用的缓存存储器的行号。缓冲器可以是包括在缓存存储器中的临时存储器,用于存储将给定存储器访问指令链接到给定缓存行的数据条目。

缓冲器中(例如,通过个体标识符)表示的存储器访问指令可能不再需要访问与给定缓存行相关联的可共享标签存储器位置,以将存储器访问指令中继到数据存储器。相反,存储在缓冲器中的行id与存储器访问指令一起可以将存储器访问指令映射到缓存存储器中的相应缓存行。

在一些实例中,方法200可以涉及:将存储器访问指令中继到数据存储器以取回作为缓存存储器中的给定缓存行的一部分存储的数据;并随后在缓存存储器处接收数据。然后,方法200可以包括识别缓冲器中与存储器访问指令的标识符相对应的条目。例如,可以在缓冲器中查找存储器访问指令(例如,基于匹配的存储器标识符),并且可以从匹配的条目中读取适当的给定缓存行的链接索引。可以从缓冲器中的条目获得缓存行的索引(在缓存存储器中),并且可以基于所述索引来访问缓存存储器中的相应缓存行以存储数据。

在其他实例中,图2的方法200可以包括在重复使用所选的可共享标签存储器位置之前接收对未存储在缓存存储器中的数据的请求。例如,对数据的请求可以是由处理器发送的存储器访问指令的一部分。如果数据未存储在缓存存储器中,则可能发生如所描述的缓存未命中。因此,方法200可以包括:分配缓存行以将所请求的数据存储在缓存存储器中;并且向数据存储器(例如,主存储器)发送存储器访问指令以取回作为分配的缓存行的一部分存储的数据。当分配缓存行时,其状态可以被更新为较早的缓存行状态或分配状态,如实例中所述。方法200可以进一步包括使存储器访问指令的标识符(发送到数据存储器)与缓存存储器中的所述缓存行的索引(例如缓存行的行id)相关联。存储器访问指令的标识符可以包括具有单独对应于存储器访问指令的值的数据,并且可以称为“请求id”。

然后,方法200可以包括:在缓存存储器处接收与提交给数据存储器的存储器访问指令相关联的数据之后,基于存储器访问指令的标识符获得所分配的缓存行的索引。然后,表示数据的数据条目可以作为分配的缓存行的一部分存储在缓存存储器中。因此,当存储器访问指令(例如,内存请求)被提交给数据存储器时,缓存行索引(行id)可以与存储器访问指令标识符(请求id)一起使用,以将从数据存储器取回的数据写入到缓存存储器的正确分配的缓存行。

一旦发出与给定缓存行相关联的一个或多个存储器访问指令并且已经获得给定缓存行的行id,即使数据尚未存储(加载)在给定的缓存行中,也可以重复使用可共享标签存储器位置(例如,更新其中包括的可共享标签部分),并且存在保持缓存行被锁定的锁定指令。一旦数据被加载到缓存行中,指令就可以使用在查找时获得的id从缓存存储器中读取数据,即使可共享标签存储器位置已被重复使用并包含新的可共享标签部分。

在一些实例中,图2的方法200可以包括:对于缓存存储器的每个缓存行,在数据结构中存储:第一数据值,表示相应的缓存行是否与所选的可共享标签存储器位置相关联;第二数据值,表示相应的缓存行是否与未决的存储器访问指令相关联。例如,数据结构可以包括数据阵列,在缓存存储器中每个缓存行,在阵列中具有一行,并且具有用于每个缓存行的第一和第二数据值的阵列的两列。

将这些第一和第二数据值存储在每个缓存行的数据结构中可以允许缓存存储器或包括缓存存储器的数据处理系统的另一个组件保持跟踪哪些缓存行仍然需要可共享标签存储器位置的内容(即包含在其中的可共享标签部分)以向数据存储器(例如主存储器)发出它们的存储器访问指令(例如,内存请求)。例如,与未决存储器访问指令相关联的缓存行可以处于分配状态,因此可以取决于可共享标签存储器位置内容(即,当前存储在其中的可共享标签部分)。与给定可共享标签存储器位置相关联的数据结构可以显示是否存在取决于可共享标签存储器位置的任何缓存行,例如,与缓存行相关联的独立标签部分包括指向可共享标签存储器位置的指针。

对于每个缓存行,数据结构的第一数据值可以表示缓存行是否与所选的可共享标签存储器位置相关联的“真”或“假”逻辑状态。例如,在位图中,这些状态可以分别对应于第一位的1和0值。数据结构的第二数据值可以表示缓存行是否与未决存储器访问指令相关联的“真”或“假”逻辑状态。类似地,在位图中,这些状态可以分别对应于第二位的1和0值。

数据结构(例如位图)可以通过逻辑功能“减少”到独立值,该独立值指示是否存在首先指向相关联的可共享标签存储器位置并且其次是处于分配状态的缓存行。减少逻辑功能(可以称为“减少”功能)可以贯穿数据结构的每一行(与给定的可共享标签存储器位置相关联)以确定是否存在具有第一和第二数据值的行,每个数据值表示“真”逻辑状态,例如位图中的[11]。如果数据结构中存在至少一个这样的行,例如,如果减少逻辑功能的输出是“真”,这可以指示缓存存储器中存在指向给定可共享标签存储器位置并且处于分配状态的缓存行。因此,基于该指示,基于减少逻辑功能的输出为“真”,可以不允许给定的可共享标签存储器位置被重复使用。

在替代实例中,方法200可以包括确定与所选的可共享标签存储器位置相关联的缓存存储器的多个缓存行。例如,这可以涉及保持每个可共享标签存储器位置的更新计数器,以跟踪取决于给定可共享标签存储器位置的缓存行的数量。当与缓存行相关联的新的独立标签部分指向相应的可共享标签存储器位置时,计数器可以递增。当与指向相应可共享标签存储器位置的独立标签部分相关联的缓存行从分配状态310过渡到请求状态320时,计数器可以递减。该实施方式在缓存存储器中可能是高效的,其中缓存行被逐个分配。

在实例中,图2的方法200包括接收刷新指令以清除存储在缓存存储器中的数据。方法200可以包括在接收到刷新指令之后,为缓存存储器的每个缓存行设置给定的缓存行状态。因此,在给定的缓存行状态(例如(请求)延迟无效状态)中,可以关于在设置所述给定缓存行状态之前接收的存储器访问指令继续使用缓存存储器中的每个缓存行,但是,可以禁止关于在设置给定缓存行状态之后接收的存储器访问指令进行使用。因此,可以创建有效的内存屏障,因为在刷新指令之后在缓存存储器处接收的存储器访问指令(例如内存请求)不能访问(缓存命中)在刷新指令之前请求的数据。

在实例中,在接收到刷新指令之后,处于分配状态的缓存行保持在分配状态。基于刷新指令,可以不刷新(例如清除或清空)这些缓存行。由于这些缓存行的存储器访问指令(例如内存请求)尚未发布到数据存储器,例如主存储器,当处于分配状态时,它们最终将从数据存储器接收的数据对应于来自内存屏障之后的数据(即刷新指令)。因此,该数据可以对于在内存屏障之后接收的任何后续存储器访问指令是有效的。在可以刷新内存屏障之前,数据已经被存储在缓存存储器中,例如在处于有效状态的缓存行中。类似地,在内存屏障之前已经请求的数据,例如通过处于请求状态的缓存行,也可以被刷新,因为通过这些缓存行可以接受在内存屏障之前的旧的数据。

在刷新指令之后为缓存存储器的每个缓存行设置给定缓存行状态之后,方法200可以涉及确定取决于每个缓存行的指令的数量。如前所述,这可以通过使用对应于每个缓存行的参考计数器来完成。响应于确定用于缓存存储器中的缓存行的子集的依赖于每个缓存行的指令的数量为零,方法200可以包括清除作为缓存行的子集中的每个缓存行的一部分存储的数据。例如,当接收到刷新指令并且缓存行被更新为给定的缓存行状态,例如更新为(请求)延迟无效状态时,缓存存储器中的一些缓存行可能没有具体取决于它们(即,他们存储的数据)的待处理的指令。因此,可以基于刷新指令清除该缓存行子集,因为任何新指令可以不访问存储在这些缓存行中的数据。对于缓存存储器中的剩余缓存行,当依赖于剩余缓存行的指令的数量达到零时,可以清除其中存储的数据。

例如,当接收到刷新指令时,给定的缓存行可以具有2的参考计数,即依赖于缓存行的两个指令。如果在接收到刷新指令时数据已经被加载到给定的缓存行中,即缓存行处于有效状态,则其缓存行状态将被更新为给定的缓存行状态(延迟无效状态)。在延迟无效状态下,没有对缓存存储器的新指令可以访问给定的缓存行,但是依赖于缓存行的这两个指令(在刷新指令之前在缓存存储器中接收的)仍然可以访问给定的缓存行和存储器在其中的数据。一旦这些指令中的第一个从缓存行读取数据,从属指令的数量(以及参考计数器)将减少到1。一旦这些指令中的第二个从缓存行读取数据,从属指令的数量(以及参考计数器)将减少到0,因此存储在缓存行中的数据可以按照刷新指令被清除。因为,在延迟无效状态下,新指令无法访问给定的缓存行,从属指令的数量最终应该达到零,从而允许清除存储在缓存行中的数据。

总的来说,响应于刷新指令,所有缓存行最终可以过渡到无效状态300,而处于延迟无效状态350的那些缓存行首先将从属指令的数量减少到零。

因此,使用这些方法可以高效地进行缓存刷新:刷新可以在独立缓存周期内发生,并且对存储器区域和性能几乎没有影响(因为新的缓存存储器访问指令可以在刷新指令之后立即开始到达)。

本文中描述的方法实例可以由被配置为这样做的缓存存储器执行,例如,参考图1描述的缓存存储器130的实施方式。例如,用于控制缓存存储器的任何方法可以由被包括作为缓存存储器的一部分的缓存控制器(例如缓存控制电路)执行。缓存存储器可以被包括作为数据处理系统的一部分,该数据处理系统还包括被配置为输出存储器访问指令的处理器,如参考图1所描述的。数据处理系统还可以包括耦合到缓存存储器的主存储器。

图3示出了根据本文中所述的实例的包括在缓存存储器中的缓存行的示意性状态过渡图(std)。图3的std包括缓存存储器中的缓存行的可能的缓存行状态,如以上分别参照图1和图2在数据处理系统100和方法200示例中所描述的。可能的缓存行状态或缓存行的状态通过箭头连接在图3的std中,箭头示出了状态之间的可能过渡。箭头(过渡)由可能导致相应过渡的可能事件标记。

允许缓存行被重复使用的后一个缓存行状态,如上面的方法200实例中所述,在图3中示出为std的无效状态300。如所描述的,无效状态300可以指示处于该状态的给定缓存行是空的或没有存储的数据,因此可用于存储数据,例如对应于缓存存储器外部的存储器位置。

还如上所述,可以分配处于无效状态300的缓存行,例如,缓存行被映射到缓存存储器外部的存储器位置。存储器位置可以是缓存存储器外部的数据存储器(例如,主存储器)中的位置。因此,当无效状态300中的缓存行在已经被分配到缓存存储器外部的存储器位置时可以过渡到分配状态310,如图3所示。当在缓存存储器处接收存储器访问指令(请求未存储器在缓存存储器中的数据)时,例如通过处理器,可以发生这种缓存行的分配。例如,在这种情况下可能发生缓存未命中,并且一旦从数据存储器(例如主存储器)取出所请求的数据,就可以分配缓存行来存储所请求的数据。当分配给定的缓存行时,可以更新与给定缓存行相关联的独立标签部分以与存储器标识符(例如存储器地址)的(至少一部分)相对应,从而表示存储要取出的数据的数据存储器中的存储器位置。包括在独立标签部分内的指向可共享标签存储器位置的指针也可以被更新,例如指向可共享标签存储器位置,该可共享标签存储器位置包括对应于存储器标识符的可共享标签部分。可以更新可共享标签部分以与存储器标识符相对应。

如所描述的,分配状态310可以对应于较早的缓存行状态,因此根据本文中描述的实例,可以防止重复使用所选的可共享标签存储器位置。例如,所选的可共享标签存储器位置可以由与分配状态310中的给定缓存行相关联的独立标签部分指向。

从分配状态310,缓存行可以过渡到请求状态320,该请求状态可以与(第一)中间缓存行状态相对应,如以上实例中所述。在与缓存行相关联的存储器访问指令已经提交给数据存储器之后,可能发生这种过渡。因此,在请求状态320中,给定缓存行可能正在等待从数据存储器取回数据并作为给定缓存行的一部分进行存储。如上所述,当给定缓存行处于请求状态320时,可以允许重复使用与缓存行相关联的可共享标签存储器位置,例如,可以更新其中包括的可共享标签部分,或者可以指示可共享标签存储器位置为可用于重复使用(实际上是可共享标签存储器位置的“无效”状态)。

在实例中,当给定缓存行过渡到请求状态320时,如前所述,其索引(行id)可以存储在具有相关存储器访问指令的标识符的缓冲器中,该相关存储器访问指令请求来自缓存存储器外部的数据存储器的数据。可以基于存储器访问指令标识符(例如,请求id)容易地访问该缓冲器,因此例如当从数据存储器取回所请求的数据时,可以在从数据存储器接收到响应时容易地取回相关联的缓存行的索引(行id)。

当已经取回到与存储器访问指令相关联的数据时,一旦数据已被存储器为缓存行的一部分并且如果可共享标签存储器位置尚未被重复使用,则关联的缓存行可以从第一中间缓存行状态(即,请求状态320)被更新到第二中间缓存行状态(有效状态330)。将数据作为缓存行的一部分存储可以被称为“加载缓存行”,因此图3的std示出了从请求状态320到有效状态330的过渡,如标记为“缓存行加载”。

当缓存行处于有效状态时,可以当发送到缓存存储器的存储器访问指令包括与缓存行相关联的标签对应的存储器标识符时从缓存存储器取回作为缓存行的一部分存储的数据。处于有效状态330的缓存行可以过渡回到无效状态300,例如,如果缓存行被无效或被驱逐,如前所述。可替代地,可以重新分配缓存行并且缓存行直接过渡到分配状态310。这些可能的过渡在图3的std中示出。有效状态330还可以允许重复使用与有效状态中的缓存行相关联的独立标签部分指向的可共享标签存储器位置。

如果在已经取回数据并将其作为缓存行的一部分存储之前已经重复使用与请求状态320中的缓存行相关联的可共享标签存储器位置,则可以将缓存行更新为请求的延迟无效状态340。所请求的延迟无效状态340可以对应于以上方法200实例中描述的(第一)给定缓存行状态。在实例中,所请求的延迟无效状态340中的给定缓存行可以仅由由上述缓冲器中的标识符表示并且通过缓存行的索引与给定缓存行相关联的存储器访问指令来使用。

当从数据存储器请求的数据被取回并作为缓存行的一部分存储(例如,缓存行被加载)时,缓存行可以从请求延迟无效状态340过渡到延迟无效状态350,该延迟无效状态可以对应于上述方法200实例中描述的(第二)给定缓存行状态,如图3的std所示。在延迟无效状态350中,缓存行可以由存储器访问指令使用,但仅是在缓存行处于请求延迟无效状态340中之前接收的那些指令。如上所述可以禁止在设置第一给定缓存行状态(例如,缓存行过渡到所请求的延迟无效状态340)之后接收的存储器访问指令。因此,可以创建内存屏障,并且可以通过在内存屏障之前接收的相关存储器访问指令来读取延迟无效状态350中的缓存行,直到依赖于缓存行(其参考计数器)的指令的数量达到零。此时,缓存行可以过渡回到无效状态300以重复使用。

在一些实例中,缓存行可以在独立周期中从请求状态320直接过渡到延迟无效状态350,如图3的std所示。例如,如果重复使用与请求状态320中的缓存行相关联的可共享标签存储器位置并且在同一周期中加载缓存行,则缓存行可以进行该直接过渡。

如果在缓存行存储数据时重复使用与缓存行相关联的可共享标签存储器位置(通过包括在与缓存行相关联的独立标签部分中的指针数据),则缓存行可以从有效状态330过渡到延迟无效状态350。在延迟无效状态350中,缓存行可以由存储器访问指令使用,但仅是在缓存行过渡到延迟无效状态350中之前接收的那些指令。如上所述可以禁止在缓存行过渡到延迟无效状态350之前接收的存储器访问指令。因此,可以创建内存屏障,并且可以通过在内存屏障之前接收的相关存储器访问指令来读取延迟无效状态350中的缓存行,直到依赖于缓存行(其参考计数器)的指令的数量达到零。此时,缓存行可以过渡回到无效状态300以重复使用,例如,重新分配以最终存储新的数据。

图3的std还示出了无效状态300和延迟无效状态350之间的过渡。这可以简化状态更新逻辑。实际上,进行该过渡的任何缓存行将例如在随后的缓存周期中(因为其参考计数器为零)过渡回到无效状态300。

图3的std还示出了到无效状态300的重置过渡。该过渡可以对应于重置指令以重置或重启系统。

图3的std可以被认为表示“状态机”,即一种系统,由此缓存存储器中的每个缓存行可以在给定时间处于一定数量的状态之一,并且可以基于事件在状态之间过渡。

在替代实例中,可以例如并行地实施两个状态机。第一状态机可以包括四个“主要状态”:无效、分配、请求和有效。第二状态机可以包括两个“辅助状态”:正常和延迟无效。因此,第一状态机的主要状态可以由两位的位串表示,该位串具有分别对应于四种可能状态的四个可能值。辅助状态可以由具有两个可能值的一个位表示。因此,如前所述,给定缓存行的状态数据可以包括用于发信号通知给定缓存行的主状态的第一部分(例如,两位串)以及用于发信号通知缓存行的辅助状态的第二部分(例如,一个位)。

组合主状态和辅助状态可以给出“组合状态”,其等同于先前描述并在图3的std中示出的状态。例如,表示{有效,正常}主状态和辅助状态的组合的缓存行的状态数据可以等效于先前描述并在图3中示出的有效状态330。作为另一实例:主状态和辅助状态组合{有效,延迟无效}可以等同于先前描述并在图3中示出的延迟无效状态350。

当重复使用可共享标签存储器位置时,与指向重复使用的可共享标签存储器位置的独立标签部分相关联的所有缓存行可以从正常的辅助状态过渡到延迟无效。该过渡可能导致整体状态过渡:请求320到请求延迟无效340;有效330到延迟无效350;此前已描述并在图3中示出。

因为,在所描述的实例中,可以不重复使用给定的可共享标签存储器位置,如果与指向给定可共享标签存储器位置的独立标签部分相关联的任何缓存行处于分配状态,则可能不会达到组合状态{分配,延迟无效}。因此,相应的整体状态未在图3的std中表示。

在该实施方式中,图3中所示的从无效状态300到延迟无效状态350的过渡实际上可以对应于从组合状态{无效,正常}到{无效,延迟无效}的过渡。以这种方式,在重复使用可共享标签存储器位置时更新状态可能是简单的。例如,可以认为辅助状态的功能类似于当重复使用相关联的可共享标签存储器位置时从正常翻转到延迟无效的过渡。这还可以描述为什么在以上所述并在图3的std中示出的独立状态机实施方式实例中无效状态300过渡到延迟无效状态350。

以上实施例应被理解为说明性实例。设想了进一步的实施例。例如,除了从数据存储器(例如主存储器)取出数据之外,本文中描述的缓存存储器实例可以替代地或另外存储由处理器或数据处理系统的一个或多个其他部分(例如,集成电路或“芯片”的一个或多个组件)直接生成的数据。

在缓存存储器位于处理器和数据存储器(例如主存储器)之间的实例中,可以存在缓存层次结构。例如,可以在处理器和数据存储器之间分层地布置缓存存储器的多个缓存级别。另外或可替代地,数据存储器可以包括具有分层布置的多个存储器级别的存储器层次结构,例如基于缓存层次结构。

在实例中,提到了“缓存存储器外部”的存储器位置。在某些情况下,这些存储器位置实际上可以是被包括在缓存存储器中的其他缓存中的位置,例如在多级或分层缓存存储器中。因此,在一些实例中,可以在缓存存储器内的缓存之间发送存储器访问指令。

此外,本文中描述的处理器可以包括能够生成并提交指令(例如请求)到缓存存储器的任何类型的回路或电路。

应当注意,附图仅仅是示意性的,并且例如,在实践中示出的同一图中的功能单元可以共享重要的硬件回路,即使它们可以示意性地示出为单独的单元。还应当理解,附图中的每个级、元件和单元等可以根据需要实施,并且将相应地包括例如用于执行相关的操作和功能的适当的电路和/或处理逻辑等。

应当理解,关于任何一个实施例描述的任何特征可以被单独使用,或者与所描述的其他特征组合使用,并且还可以与任何其他实施例的一个或多个特征组合使用,或者与任何其他实施例的任何组合一起使用。此外,在不脱离所附权利要求的范围的情况下,也可以采用上面未描述的等同物和修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1