用于线程本地存储数据访问的私有高速缓存的制作方法

文档序号:20274829发布日期:2020-04-03 19:30阅读:226来源:国知局
用于线程本地存储数据访问的私有高速缓存的制作方法

本申请涉及计算机体系结构,更具体地,涉及具有用于线程本地存储(tls)类型的数据访问的私有高速缓存的中央处理单元(cpu)以及由这种cpu利用私有高速缓存执行的数据访问方法。



背景技术:

诸如基于x86架构设计的cpu之类的商用cpu通常在cpu内核与主存储器(例如,动态随机存取存储器(dram))之间采用分层高速缓存结构。高速缓存结构可以包括多个级别的高速缓存,范围从快速但较小的(即,低存储容量)较低级别的高速缓存到慢速但较大的(即,高存储容量)较高级别的高速缓存。cpu通过多级别高速缓存来执行数据访问(例如,从存储器中加载/读取数据或将数据存储/写入到存储器)以减少延时并提高数据访问速度。例如,当cpu执行读取/加载操作时,cpu首先在最低级别的高速缓存中查找数据的副本。如果找到了副本(也称为“命中”),则cpu从最低级别的高速缓存中获取副本,而无需访问较高级别的高速缓存或主存储器。如果在最低级别的高速缓存中也找不到该副本(也称为“未命中”),则cpu在下一个更高级别的高速缓存中查找副本,并在所有级别的高速缓存中重复该过程。如果在所有级别的缓存中均未找到该数据,则cpu从主存储器中获取数据。

在多级高速缓存中,最后一级高速缓存(llc)通常在x86体系结构中位于第三级,因此它也可以称为l3高速缓存。llc通常具有几十兆字节(mb)的大小,并且与较低级别的高速缓存(例如,一级(l1)和二级(l2)高速缓存)相比,会导致相对长的访问延时。在现有的商用(例如,现成的)多内核cpu中,llc通常被分成较小的片,并在多个cpu内核之间分布和互连。例如,每个片连接到一个内核。单个数据以分布的方式跨多个片存储,因此跨多个内核存储。这种设计允许整个llc容量由多个内核共享。但这也会增加llc的命中延时并增加功耗。这是因为cpu内核必须经历多跳才能从连接到其他内核的llc片中获取同一数据的一部分,而不管数据是否为单个内核专用。多跳会导致延时和功耗,考虑到在数十万个cpu始终运行的数据中心环境中的累积效应,这是很重要的。



技术实现要素:

在一些方面,本公开涉及cpu。cpu可以包括多个内核。cpu还可以包括与多个内核互连的llc。llc可以包括共享部分和私有部分。共享部分可以被多个内核共享。私有部分可以连接到多个内核中的第一内核,并且可以专门分配给第一内核。第一内核可以被配置为发起数据访问请求以访问存储在llc中的数据。第一内核还可以被配置为基于与数据访问请求相关联的注释来确定数据访问请求是否是线程本地存储(tls)类型的访问请求。另外,第一内核可以被配置为基于确定数据访问请求是tls类型的访问请求来将数据访问请求路由到私有部分,并且基于确定数据访问请求不是tls类型的访问请求来将数据访问请求路由到共享部分。

在一些其它方面,本公开涉及由包括多个内核的cpu执行的访问与所述多个内核互连的llc中存储的数据的方法。该方法可以包括发起数据访问请求以及基于与数据访问请求相关联的注释来确定数据访问请求是否是tls类型的访问请求。该方法还可以包括响应于确定数据访问请求是tls类型的访问请求,将数据访问请求路由到llc的私有部分。私有部分连接到第一内核,并且专门分配给第一内核。该方法还可以包括当响应于确定数据访问请求不是tls类型的访问请求,将数据访问请求路由到llc的共享部分。共享部分由多个内核共享。

在其他方面,本公开涉及一种数据处理系统。该数据处理系统可以包括存储数据的存储器和包括多个内核的处理器。处理器可以通过多个高速缓存联接到存储器。多个级别的高速缓存可以包括llc。llc可以包括共享部分和私有部分。共享部分可以被多个内核共享。私有部分可以连接到多个内核中的第一内核,并且可以专门分配给第一内核。第一内核可以被配置为发起数据访问请求以访问存储在llc中的数据。第一内核还可以被配置为基于与数据访问请求相关联的注释来确定数据访问请求是否是tls类型的访问请求。另外,第一内核可以被配置为基于确定数据访问请求是tls类型的访问请求来将数据访问请求路由到私有部分,并且基于确定数据访问请求不是tls类型的访问请求来将数据访问请求路由到共享部分。

本公开的另外的目的和优点将在下面的详细描述中部分地进行阐述,并且部分地将根据该描述显而易见,或者可以通过本公开的实践而获知。本公开的目的和优点将通过所附的权利要求中特别指出的要素和组合来实现和获得。

应当理解,前面的一般描述和下面的详细描述仅是示例性和说明性的,并且不限制所要求保护的本发明。

附图说明

构成本说明书的一部分的附图示出了多个实施例,并且与说明书一起用于解释所公开的原理。

图1是根据本申请的一些实施例的具有多个内核的示例性cpu的示意图。

图2是根据本申请的一些实施例的包括私有部分和共享部分的示例性llc片的示意图。

图3示出了根据本申请的一些实施例的指示tls类型的数据访问的示例性注释。

图4示出了根据本申请的一些实施例的转换后备缓冲器(tlb)条目或页表条目中的示例性tls提示位。

图5示出了根据本申请的一些实施例的示例性llc选择器。

图6示出了根据本申请的一些实施例的llc条目中的示例性tls标识位。

图7是根据本申请的一些实施例的访问存储在llc中的数据的示例性方法的流程图。

图8示出了根据本申请的一些实施例的示例性数据处理系统。

具体实施方式

现在将详细地参考本发明的示例性实施例,其示例在附图中示出。在适当的情况下,在所有附图中使用相同的附图标记指代相同或相似的部件。

如背景技术部分所述,在商用x86cpu中,llc的整个存储容量在多个内核之间共享。在这种设计中,专用于单个内核的私有数据访问速度不必要地缓慢,并且由于访问信号必须经历多跳,因此还会消耗额外的功率。本申请中公开的解决方案提供了针对tls数据的本地llc高速缓存,该tls数据最有可能甚至被保证对单个内核是私有的。tls类型的数据访问也代表了大多数私有数据访问。因此,通过减少内核之间的互连业务,所公开的解决方案可以通过减少数据访问延时来提高cpu性能,并降低功耗。

图1是根据本申请中公开的一些实施例的示例性cpu100的示意图。cpu100可以包括多个内核,例如内核a、b、...、h。其他实施例可以包括少于或多于八个内核。cpu100也可以被称为多内核cpu。多内核cpu是指具有两个或更多个独立的实际处理单元的单个计算组件,每个独立的实际处理单元称为内核。与单内核cpu相似,cpu内核可以读取并且执行程序指令,例如添加、移动数据、分支等。多内核cpu的一个好处是它可以同时在不同的内核上运行多个指令,从而提高了适用于并行计算的程序的整体速度。这样的程序可以通过多线程技术实现并行计算,其中,可以在多个内核上同时执行一小序列编程指令(称为“线程”)。

程序指令和数据可以存储在存储器中,例如包括动态随机存取存储器(dram)的计算机系统的主存储器。诸如cpu100这样的cpu可以从存储器读取指令和数据,执行指令和/或基于指令来处理数据,和/或将执行结果或处理后的数据写回到存储器中。然而,存储器的运行速度通常比cpu的运行速度慢得多。因此,如果每个数据访问操作(诸如读取/加载和写入/存储)均来自存储器,则cpu必须等待数据访问操作完成,以便处理数据或继续执行下一条指令,这会导致巨大的延时。为了减轻该程序的负担,在cpu和存储器之间添加了多个级别的高速缓存,范围从小型(就存储容量而言)的但是更靠近cpu端的快速的较低级别的高速缓存到更接近存储器端的大型(就存储容量而言)但是速度较慢(但速度比主存储器的速度更快)的高速缓存。

图1示出了这种高速缓存层次结构的示例。参照图1,三个级别的高速缓存被提供给cpu100。最低级别的高速缓存被称为l1(附图标记112),可以被分成两部分:用于高速缓存指令的指令高速缓存l1i和和用于缓存数据的数据高速缓存l1d。在其他实施例中,l1高速缓存可用于高速缓存指令和数据这二者,而无需将高速缓存分为两部分。尽管可以在其他实施例中使用这种分离设计,但是更高级别的高速缓存通常不被分离。下一级别称为级别2高速缓存或l2高速缓存,在图1中用参考数字114表示。如图1所示,l1和l2高速缓存均专用于其相应的内核110,并且在内核之间不被共享。在硬件实现中,l1高速缓存112可以被构建在cpu芯片本身上,而l2高速缓存可以被构建在cpu芯片上或者被提供为单独的芯片。因此,图1中所示的示意图应被理解为示出了组件之间的功能或逻辑关系,而不是这些组件的物理布置或硬件实现。

下一级高速缓存称为级别3高速缓存或l3高速缓存。在图1中,l3高速缓存是最后一级高速缓存(llc)。在一些实施例中,llc可以处于甚至更高的级别,例如级别4(“l4”)。在本申请中公开的解决方案也适用于级别4llc或更高级别的llc。

llc的大小可能为几十兆字节(mb),远大于l2高速缓存的大小。参照图1,llc116可以被分成较小的片,每个片附接到单个内核。例如,llc片118附接到内核a110。为了简单起见,在下文中,cpu内核通常称为内核110,它可以是cpu100的任何内核,而不必是内核a。类似地,l1和l2高速缓存通常分别称为112和114。对于llc,参考数字116是指整个llc,而参考数字118是指llc片,它可以是llc116的任何片,而不必是附接到内核a的片。如本文所用,术语“附接”是指逻辑上分配给。例如,在图1中,llc片118在逻辑上被分配给内核a,其可以包括通过信号线连接到内核a。虽然图1中的llc片被单独绘制以附接到不同的内核,但是整个llc可以被实现为单个芯片,其存储容量在逻辑上分为多个片。

llc116可以包括私有部分和共享部分。参照图1,如每个llc片中所示,私有部分被表示为p0、p1、p2、...、p7,而共享部分被表示为s0、s1、s2、...、s7。共享部分在多个内核之间被共享。例如,共享部分可以在多个内核之间分布和互连。共享部分可以是高速缓存线交错的。因此,当数据结构d被存储在llc116的共享部分中时,d被存储在8个高速缓存行(d0至d7)中,并且在所有8个llc片之间分配和交织。如果内核a需要读取存储在共享部分s4中的d4,则读取操作必须经历多跳(例如,s0-s1-s2-s3-s4-s3-s2-s1-s0的往返行程)来获取d4。如果d是内核a专用的,例如,仅内核a执行的线程需要d,而其他内核则不需要,则将d存储在共享部分中效率不高。

另一方面,llc的私有部分连接到单个内核,并且专门分配给该内核。例如,在图1中,私有部分p0连接到内核a,并且仅存储内核a的数据。私有部分也可以称为本地llc片。尽管私有缓存在访问私有数据方面是高效的,但是商用cpu(诸如x86cpu)由于以下几个原因而避免使用私有高速缓存:首先,在私有部分或本地llc片中高速缓存数据通常是利用llc存储容量的低效方式,因为一些线程可能需要大的高速缓存容量,而另一些线程可能没有充分利用高速缓存空间;其次,私有高速缓存还会造成数据一致性问题,因为同一数据可能具有分别存储在多个本地llc片中的多个版本。因此,由于商用cpu被设计为处理各种各样的任务,因此私有高速缓存的优点远远超过了私有高速缓存的缺点。

然而,在数据中心环境中,由于要权衡取舍,诸如省略私有高速缓存,因此旨在实现通用性的商用cpu并不是最佳选择。这是因为数十万或数以百万计的24小时不间断运行的cpu放大了多跳数据访问操作所导致的延时增加和功耗增加的次要缺点。因此,为了满足性能和功耗要求,首选定制cpu,而不是现成的cpu。一种定制是包括私有高速缓存技术,以加快私有数据的数据访问速度,同时保持共享高速缓存提供的优势。

图2示出了示例性的llc分片118,其包括私有部分210和共享部分220。私有部分210专门分配给所连接的内核(内核a)。代替在共享部分中使用高速缓存线交错设计,所有高速缓存线212(k0、k1、k2、...、k7)对于私有部分210是本地的,而仅高速缓存线d0对于共享部分220是本地的。因此,对于内核a私有的数据结构可以完全存储在私有部分210中,并且可以被内核a访问,而无需遍历如上所述在共享llc部分的上下文中的多跳。

通常,虽然很难确定cpu内核专用的数据类型,但是一些类型的数据最有可能是私有的。例如,线程本地存储(tls)类型的数据最有可能对cpu内内核上运行的每个线程都是私有的,并且众所周知,它代表了大多数私有数据。因此,本申请的实施例公开了一种cpu高速缓存访问解决方案,其中cpu内核将所有错过l2高速缓存的tls类型的数据访问请求路由到llc的私有部分或本地片,而将非tls访问路由到llc的共享部分。通过将很可能或者甚至保证对单个cpu内核上运行的线程是私有的tls类型的数据访问请求路由到与该cpu内核连接并专门分配给该cpu内核的llc的私有部分,由于减少了llc命中延时并减少了互连业务,因而能够实现更高的性能和更低的功耗。

在虚拟存储器地址空间中,不同的片段具有清晰的软件语义,到目前为止,cpu高速缓存设计人员基本上忽略了这些语义。tls数据被设计为线程私有的,并且不应与其他线程共享。然而,在硬件级别,tls数据已与其他虚拟存储器区域中的共享数据相同。例如,在高速缓存行交错的共享llc中,tls数据已分布在所有llc片上。实际上,由于虚拟存储器信息在虚拟到物理转换完成后被弃用,现有的cpu无法区分对llc的tls访问和非tls访问。

在软件语言中,tls是供程序员使用的,用于存储线程私有的数据或全局数据的本地副本,以减少同步开销。tls在不同语言中的支持方式有所不同,一些语言使用注释来支持tls,而其他语言使用api或特定的类来支持tls。图3示出了c11和c++11中支持tls的示例。在c11中,通过包含头文件<threads.h>来支持tls。然后,可以使用注释“thread_local”将变量指定为tls类型。在c++11中,注释“thread_local”已经作为关键字而被诟病。编译器可以使用加载/存储指令随附的这些程序语言注释来区分tls类型的数据访问和非tls类型的数据访问。

可以使用另一种方法来代替或补充上述软件语言指令注释方法。此方法要求转换后备缓冲器(tlb)条目或页表条目具有tls提示的额外位,如图4所示。在页错误处理程序中,内核可以检查错误的虚拟地址。如果是tls访问,则在新的页表项中将tls提示位设置为“1”。否则,tls提示位将被设置为“0”。注意,在图4中,tls提示位可以被放置在任何合适的位置。

当存储器操作错过l2高速缓存时,cpu内核将访问llc以获取数据。可以提供llc选择器以基于访问请求是否是tls类型的请求来选择适当的片。图5示出了示例性llc选择器510。如上所述,可以基于与请求相关联的注释来确定tls类型的访问请求,并且注释可以包括由与加载指令或存储指令相关联的程序语言指定的指令注释,以及tlb/页表条目中的tls提示位。在后一种情况下,每个加载/存储操作都可以从tlb获取tls提示位,并将其携带到llc选择器510。选择器510可以通过将散列函数520应用到访问请求的地址部分,选择共享部分作为路由数据访问请求的目的地。另选地,选择器510可以通过选择本地llc片作为目标llc片路由数据访问请求,来选择私有部分作为目的地。

在线程迁移过程中(诸如,由于操作系统(os)作业重新调度而导致的线程迁移),可以从llc的私有部分中删除或清除高速缓存的tls数据,以避免高速缓存一致性问题。这可以由os作业调度程序完成。例如,在作业调度时,os可能决定将线程t从内核x移动到另一个内核y。就在os作业调度程序将线程t从内核x的等待队列拉到内核y的就绪队列之前,os作业调度程序可以刷新分配给内核x的本地llc片。

本申请还公开了以下方法,以避免具有超过64个内核的cpu的错误命中。对于具有n个内核的cpu,llc选择器可以使用高速缓存行偏移量以上的logn位来将存储器请求路由到llc。高速缓存行标记中不需要这些logn位。当页面大小为4kb时,当n>64时,可能会发生错误命中。

当n<=64时,假定页面大小为4kb,logn位不与页码交叠。由于保证tls地址与任何非tls地址具有不同的页码,因此tls高速缓存行将不会与同一llc片中的任何非tls高速缓存行具有相同的标签。因此,不会发生错误命中。

当n>64时,logn位开始与页码交叠。由于在高速缓存行标签中未使用交叠位,因此一些tls地址可能与非tls地址具有相同的标签,从而导致llc命中不正确。为了解决此问题,可以在llc标记中添加tls标识位,以区分tls地址和非tls地址。图6示出了添加到llc条目的标签部分中的示例性tls标识位。该tls标识位还可以帮助实现选择性的高速缓存刷新。例如,当线程迁移时,仅刷新旧高速缓存片中的tls行,同时保持非tls行。

图7是根据一些公开的实施例的访问存储在llc中的数据的示例性方法700的流程图。方法700可以由具有llc的cpu(诸如cpu100)执行,该llc包括私有部分和共享部分。在步骤710中,cpu100可以发起数据访问请求。例如,cpu100的内核a可以发起存储器操作以读取/写入数据。该请求可以遍历l1高速缓存,然后遍历l2高速缓存。一旦请求错过l2高速缓存,就可以将请求引导到llc。在步骤720中,cpu100可以基于与该请求相关联的注释来确定数据访问请求是否是tls类型的请求。例如,注释可以包括指令注释,诸如由c11或c++11提供的“thread_local”说明符。在另一个示例中,注释可以在页表条目或tlb目中包括tls提示位。基于确定数据访问请求是tls类型的请求(步骤720之后的“是”分支),cpu100可以将该请求路由到llc的私有部分。例如,在步骤730中,选择器510可以选择本地llc片作为路由数据访问请求的目的地,使得llc的私有部分(例如,210)被选择来接收该请求。另一方面,基于确定数据访问请求不是tls类型的请求(步骤720之后的“否”分支),cpu100可以将该请求路由到llc的共享部分。例如,选择器510可以使用基线散列函数(例如,520)来将请求路由到llc的共享部分(例如,220)。

图8示出了示例性数据处理系统800。系统800可以包括具有多个内核(例如,内核a810a、内核b810b等)的处理器。处理器可以通过多个级别的高速缓存(例如,l1高速缓存820a/820b、l2高速缓存830a/830b、llc840等)与存储器850联接。llc840可以包括私有部分842和共享部分844。如上所述,私有部分842可以包括各自连接到相应内核并且专门分配给该内核的各个片,而共享部分可以由多个内核共享。每个内核可以根据例如方法700利用llc840来执行数据访问操作。

该说明书已经描述了具有用于线程本地存储(tls)类型的数据访问的专用高速缓存的多内核cpu以及由这种cpu利用专用高速缓存执行的数据访问方法。阐述了所说明的步骤以解释所示出的示例性实施例,并且可以预期,正在进行的技术开发将改变执行特定功能的方式。因此,在此呈现这些示例是出于说明而非限制的目的。例如,与公开的实施例一致,本文公开的步骤或过程不限于以所描述的顺序执行,而是可以以任何顺序执行,并且可以省略一些步骤。此外,为了便于描述,在此已经任意限定了功能构件的边界。只要适当执行指定的功能及其关系,就可以限定其他边界。基于本文所包含的教导,替代方案(包括本文描述的等同物、扩展、变化、偏差等)对于相关领域的技术人员将是显而易见的。这样的替代方案落入所公开的实施例的范围和精神内。

虽然本文描述了所公开原理的示例和特征,但是在不脱离所公开实施例的精神和范围的情况下,可以进行修改、改编和其他实现。同样,词语“包括”、“具有”、“含有”和“包含”以及其他类似形式在含义上是等同的并且是开放式的,因为这些词语中的任何一个之后的一个或多个项目均不意味着是此类项目的详尽清单,或者仅限于所列项目。还必须注意,如本文和所附的权利要求中所使用的,单数形式“一个”、“一种”和“该”包括复数引用,除非上下文另外明确指出。

可以使用硬件、软件、固件或其任意组合来实现本申请的实施例,以允许专用设备执行上述功能。本文所述的一个或更多个步骤、操作、功能和模块可以由存储在一个或更多个存储设备中并由一个或更多个硬件处理器设备执行的固件指令或代码来实现。示例性硬件处理器设备包括配置或制造为执行数据处理和/或逻辑操作的逻辑门电路、设计和制造为执行特定功能的集成电路(ic)、可编程门阵列(pga)、现场可编程门阵列(fpga),等等。

多个功能模块可以被集成到单个物理设备中,或者可以设置在单独的物理设备中。

本公开和示例旨在仅被视为示例性的,所公开的实施例的真实范围和精神由所附的权利要求指示。

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