一种数据处理方法与流程

文档序号:13219385阅读:254来源:国知局
技术领域本发明涉及处理器领域,特别涉及缓存一致性非统一内存访问。

背景技术:
多处理器系统通过系统总线连接,构成的缓存一致性非统一内存访问(CacheCoherency-NonUniformMemoryAccess,CC-NUMA)系统,CC-NUMA系统本质上是一个分布式共享内存多处理器系统。每个处理器拥有自己的私有缓存(Cache),并挂载有内存。由于现有处理器和内存控制器的紧耦合关系,处理器在访问不同地址空间内存时,访问速度和带宽不一致。也就是说如果访问的是自己的内存,访问速度比较快,如果访问的是挂载在其他处理器的内存,那么速度相对较慢。现有CC-NUMA系统中,使用统一的数据粒度解决数据一致性问题,例如一般常见的缓存行的颗粒度是64字节(byte)。大多数情况下,程序实际需要使用的数据是远远小于64字节的,以8字节为例,这8字节的数据存储在内存中,那么按照粒度的数值,从内存中读出的是64字节的数据,然后经过一系列的缓存一致性处理,CPU(缓存和内核)最终收到这64字节数据。这64字节的数据包含了程序需要使用的8字节数据,但是,解决64字节数据的缓存一致性问题并返回给特定的CPU(请求数据者)所需的时间远远大于8字节数据的相应时间。现有技术中,处理器核心在运行程序时,等待数据的时间相对过长。

技术实现要素:
本发明提供一种数据处理方法,可以减少处理器核心等待数据的时间。第一方面,本发明提供一种数据处理方法,应用于缓存一致性非统一内存访问CC-NUMA系统,CC-NUMA包括第一处理器和第二处理器,所述第一处理器和所述第二处理器通过总线连接,所述第一处理器包括第一内核、第一缓存以及第一译码器;所述第二处理器包括第二家乡代理、第二缓存,所述第二家乡代理和第二内存连接,包括:第一内核发送第一请求,所述第一请求携带待读数据的地址;所述第一缓存接收所述第一请求,从所述第一译码器中查询到所述地址指向所述第二内存,发送第二请求给所述第二家乡代理,所述第二请求所请求的数据包括至少两部分数据,第一部分包括所述待读数据,所述至少两部分数据总的大小等于缓存行的大小;所述第二家乡代理接收到所述第二请求后,提供最新的第一部分数据给所述第一缓存;然后分别提供最新的其余部分数据给所述第一缓存,所述包括至少两部分数据在所述第二内存中地址相邻;所述第一缓存从所述第一部分数据中获取所述待读数据并发送给所述第一核心,以及缓存所述最新的所述至少两部分数据。第一方面的第一种可能实现方案中,提供最新的第一部分数据给所述第一缓存;然后分别提供最新的其余部分数据给所述第一缓存,具体包括:从所述第二内存中读出第一部分数据的目录信息,按照目录信息记录的数据状态,如果第二内存所存储的第一部分数据是最新的第一部分数据,则所述第二家乡代理发送最新的第一部分数据给所述第一缓存,否则,查找拥有最新的第一部分数据的缓存,将拥有最新的第一部分数据的缓存中的第一部分数据发送给所述第一缓存;然后对于其余各部分数据:从所述第二内存中读出目录信息,按照目录信息记录的数据状态,如果第二内存所存储的这部分数据是最新的数据,则所述第二家乡代理发送最新的这部分数据给所述第一缓存,否则,查找拥有最新的这部分数据的缓存,将拥有最新的这部分数据的缓存中的这部分数据发送给所述第一缓存。第一方面的第二种可能实现方案中,提供最新的第一部分数据给所述第一缓存;然后分别提供最新的其余部分数据给所述第一缓存,具体包括:向除了第一缓存之外的所有缓存发送第一部分数据的查询请求,将拥有最新的第一部分数据的缓存中的第一部分数据发送给所述第一缓存;然后对于其余各部分数据:向除了第一缓存之外的所有缓存发送这部分数据的查询请求,将拥有最新的这部分数据的缓存中的这数据发送给所述第一缓存。第一方面的第三种可能实现方案中,所述第一部分数据是所述待读数据。第一方面的第四种可能实现方案中,所述第一部分数据大于等于所述待读数据,且是8字节的最小整数倍;所述缓存行的大小是64字节。第二方面,本发明提供一种数据处理方法,应用于缓存一致性非统一内存访问CC-NUMA系统,CC-NUMA包括第一处理器和第二处理器,所述第一处理器和所述第二处理器通过总线连接,所述第一处理器包括第一内核、第一缓存以及第一译码器;所述第二处理器包括第二家乡代理、第二缓存,所述第二家乡代理和第二内存连接,包括:第一内核发送第一请求,所述第一请求携带待读数据的地址;所述第一缓存接收所述第一请求,从所述第一译码器中查询到所述地址指向所述第二内存,发送第二请求给所述第二家乡代理,所述第二请求所请求的数据包括至少两部分数据,第一部分包括所述待读数据,所述至少两部分数据总的大小等于缓存行的大小;所述第二家乡代理接收到所述第二请求后,提供最新的第一部分数据给所述第一缓存;然后分别提供最新的其余部分数据给所述第一缓存,所述包括至少两部分数据在所述第二内存中地址相邻;所述第一缓存将所述最新的第一部分数据发送给所述第一核心,以及缓存所述最新的所述至少两部分数据。第二方面的第一种可能实现方案中,提供最新的第一部分数据给所述第一缓存;然后分别提供最新的其余部分数据给所述第一缓存,具体包括:从所述第二内存中读出第一部分数据的目录信息,按照目录信息记录的数据状态,如果第二内存所存储的第一部分数据是最新的第一部分数据,则所述第二家乡代理发送最新的第一部分数据给所述第一缓存,否则,查找拥有最新的第一部分数据的缓存,将拥有最新的第一部分数据的缓存中的第一部分数据发送给所述第一缓存;然后对于其余各部分数据:从所述第二内存中读出目录信息,按照目录信息记录的数据状态,如果第二内存所存储的这部分数据是最新的数据,则所述第二家乡代理发送最新的这部分数据给所述第一缓存,否则,查找拥有最新的这部分数据的缓存,将拥有最新的这部分数据的缓存中的这部分数据发送给所述第一缓存。第二方面的第二种可能实现方案中,提供最新的第一部分数据给所述第一缓存;然后分别提供最新的其余部分数据给所述第一缓存,具体包括:向除了第一缓存之外的所有缓存发送第一部分数据的查询请求,将拥有最新的第一部分数据的缓存中的第一部分数据发送给所述第一缓存;然后对于其余各部分数据:向除了第一缓存之外的所有缓存发送这部分数据的查询请求,将拥有最新的这部分数据的缓存中的这数据发送给所述第一缓存。第二方面的第三种可能实现方案中,所述第一部分数据是所述待读数据。第二方面的第四种可能实现方案中,所述第一部分数据大于等于所述待读数据,且是8字节的最小整数倍;所述缓存行的大小是64字节。本发明实施例,第二请求所请求的数据包括至少两部分数据,优先返回最新的第一部分数据给第一缓存,其中第一部分所请求的是第一核心运行需要的数据。因此可以减少第一核心的等待时间。附图说明为了更清楚地说明本发明实施例的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,下面描述中的附图仅仅是本发明的一些实施例,还可以根据这些附图获得其他的附图。图1是本发明CC-NUMA实施例结构示意图;图2是本发明数据处理方法实施例流程图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。如图1所示,本实施例中所涉及的CC-NUMA系统由多个处理器和内存组成。处理器例如是CPU。处理器内部包括内核、缓存、家乡代理以及译码器。缓存分别和内核、家乡代理、地址译码器连接。家乡代理也可以称为内存归属代理,用于管理和CPU直接连接的内存。如果其他CPU要访问本CPU的内存,需要由本CPU的内存中转。每个处理器挂载有内存,家乡代理和挂载的内存连接,内存用于存储数据。内核是处理器的核心部件,具有运算能力,可以运行程序,是数据的需求方。缓存保存有临时性数据,以供内核使用。内核访问缓存的速度高于访问内存的速度。家乡代理可以对挂载的内存数据进行读写。地址译码器,记录有地址和家乡代理的对应关系,在获知一个数据的地址的情况下,使用地址译码器可以查询到对应的家乡代理,而这个家乡代理所挂载的内存存储有这个地址所代表的数据。处理器挂载内存,是指直接连接并且可以从中读取数据,可选的,还可以对挂载的内存进行管理。内存例如是随机访问内存(random-accessmemory,RAM)。使用总线可以连接多个处理器,例如英特尔公司的X86处理器使用的快速通道互连(QPI)总线。通过总线,一个处理器可以对其他处理器挂载的内存间接进行访问。处理器访问直接挂载的内存速度较快,访问其他处理器挂载的内存的速度较慢。在图1的架构中,第一处理器包括第一内核、第一缓存、第一地址译码器以及第一家乡代理,第一家乡代理和第一内存连接。第二处理器包括第二内核、第二缓存、第二地址译码器以及第二家乡代理,第二家乡代理和第二内存连接。缓存可以通过QPI总线访问其他处理器的家乡代理。第三处理器包括第三处理器内核、第三处理器缓存、第三处理器地址译码器以及第三处理器家乡代理,第三处理器家乡代理和第三处理器内存连接。图1只是示例,在其他实施例中,可以有更多的处理器,例如4个或者8个甚至更多。在处理器数量较多时,可以在处理器间设置中转器。下面对本发明实施例一种数据处理方法进行详细说明。步骤21,第一内核发送数据读请求给第一缓存,本实施例把第一内核需要的数据称为待读数据。第一内核的数据需求来自于它所运行的程序。读请求中携带有待读数据的地址。请求的数据小于缓存行(cacheline)的大小。本实施例将这个请求称为第一请求。通常情况下,第一内核是出于运行程序的目的,而需要使用待读数据。本实施例中,待读数据小于缓存行数据。例如待读数据是8字节(Byte),而缓存行(cacheline)的大小是64字节。第一请求所请求的数据量是8字节。步骤22,第一缓存使用待读数据的地址查询第一缓存是不是存储有待读数据。如果有,就直接返回待读数据给第一内核,结束本方法。如果没有,就发送查询请求给第一地址译码器,进入步骤23。步骤23,第一缓存通过使用第一地址译码器查询地址所对应的家乡代理。并通过QPI总线发送第二读请求给查询到的家乡代理。本实施例中,假设和地址对应的家乡代理是图1中的第二家乡代理。第二家乡代理管理和第二CPU直连的内存。第二请求所请求的数据包括几个部分,且这几部分数据的大小的总和等于缓存行的大小。其中,第一部分包括了所述待读数据。由于这几部分数据的大小的和等于缓存行的大小,因此可以兼容现有设计。本实施例中,第一部分数据包含了第一请求所请求的数据,而且是8字节的倍数,例如最小的倍数。如果第一请求所请求的数据不超过8字节,则第一部分数据是8字节;如果第一部分数据大于8字节、不超过16字节,则第一部分数据的数据是16字节;以此类推。使用缓存行的大小减去第一部分数据长度,即可得到其余部分数据的长度。示例一:一共分成两部分,第一部分数据时8字节,缓存行长度是64字节,那么第二部分数据的长度是56字节。示例二:每8字节一个部分,缓存行长度是64字节,那么包括第一部分在内一共有8个部分。在其他实施例中,也可以保持第一部分数据的长度和待读数据相同。而现有技术中,第一缓存发送给第二家乡代理的请求中,请求的数据量是一个整体,没有分成两个部分,其大小和缓存行相同,也是64字节。第一地址译码器存储有地址映射表存储,地址映射表记录了数据的地址和数据的存储位置的映射关系。具体而言,存储的是地址和家乡代理的映射关系,家乡代理直接挂载的内存中存储有和地址对应的数据。步骤24,第二家乡代理收到第二请求后,从其挂载的内存2中读取第一部分数据的目录信息。按照目录信息记录的数据状态,提供最新的第一部分数据给第一缓存。然后,家乡代理2按照各个其余部分数据的目录信息,提供最新的其余部分数据给第一缓存。这几个部分数据在第二内存中的地址相邻。第二家乡代理优先提供最新的第一部分数据,然后再提供最新的其余各部分数据。各部分数据对应有一个内存中的地址段,这些地址段可以拼接成一个连续的地址段。第二内存中存储有第一部分数据,但可能是较早版本的数据,而不是最新的第一部分数据。例如第二内存中的第一部分数据被其他处理器读取并修改,那么最新的第一部分数据将存在于其他处理器的缓存中。第二家乡代理提供最新的第一部分数据给缓存有以下两种种方式。(1)如果最新的第一部分数据存储在第二内存中,则第二家乡代理直接从第二内存中读取最新的第一部分数据,然后由第二家乡代理通过QPI总线把数据发送给第一缓存。(2)如果最新的第一部分数据不存储在第二内存中,说明最新第一部分数据存储在其他处理器的缓存中。那么第二家乡代理查询拥有最新第一部分数据的缓存的ID,并向这个缓存发出指令,有三种可选指令,下面分别说明。本实施例中,假设拥有最新第一部分数据的缓存是第三处理器的第三缓存,将第三缓存中的第一部分数据发送给所述第一缓存的方案如下:(2.1)指令第三缓存把最新的第一部分数据发送给第一缓存。(2.2)指令第三缓存把最新的第一部分数据发送给第二家乡代理,第二家乡代理把最新的待数据缓存到第二内存中,并发送最新第一部分数据给第一缓存。(2.3)相当于前两种指令的结合,既指令第三缓存把最新的第一部分数据发送给第一缓存,又指令第三缓存把最新的第一部分数据发送给第二家乡代理,第二家乡代理把最新的待数据缓存到第二内存中。一般而言,家乡代理中记录有目录。第二家乡代理使用第一部分数据的部分地址作为标签,在目录中查询第一部分数据的状态位以及存储位置。从而可以确认第二内存中是否存储有最新第一部分数据;以及确认如果第二内存中没有存储最新第一部分数据时,存储有最新第一部分数据的缓存。例如,目录中记载数据是否处于M(modified,修改态)、E(Exclusive,独占态)、S(Share,共享态)、I(Invalid,无效态)或者A(Any/Unkown,任意态/未知态)等状态。例如:M状态的数据是脏(dirty)的,表示待读数据已修改过,没有写回内存,因此和内存的不一致。因此第二内存中存储的不是最新的待读数据。E状态的数据是干净(clean)的,其他缓存没有对齐进行修改过,因此和内存的一致。内存中存储的是最新的待读数据。其他状态不再详述。此外,在有些情况下,家乡代理中的目录记录的状态,可能是不准确的。例如,记录为某个处理器的cache中针对某段数据为E态,但是实际上已降级为S态但是未来得及通知其家乡代理。因此,根据目录发送消息到各处理器的家乡代理查询实际状态,是维护缓存一致性工作中常见的动作。也因为如此,一种可选的方案是:即使由目录确认内存中存储的是最新待读数据时,也可以使用方式(2)提供地方方案,向其他处理器的缓存查询待最新的待读数据。此外,也可能家乡代理中没有目录,在这种场景下,可以向所有其他缓存发起查询操作。也就是说,相当于在有目录中的情况下,目录中记录的各个其他缓存均为未知态。其他缓存是指除了发起者以外的缓存,本实施例中发起者是第一缓存。上面介绍了如何获得最新的第一部分数据。对于其余各个部分,获得其最新数据的方案与之类似,因此这里不再详述。这里所说的优先提供最新的第一部分数据,并不是指要把查询到最新的第一步数据并发送给第一核心后,才能开始查找最新的其余各部分数据。这里指的是在各个期间中,当提供最新的第一部分数据和提供最新的其他部分数据产生冲突时,优先处理第一部分数据。或者说,如果提供任一最新的其他各部分数据的过程中,会影响到提供最新的第一部分数据的效率时,优先提供最新的第一部分数据。从本步骤可以看出,本实施例中,第二家乡代理会优先第一部分数据给第一缓存;然后再提供提供其余部分数据数据。因此第一部分数据可以更快的到达第一缓存。而其余部分数据并没有太高的时效性的要求,可以延迟到达第一缓存,用于暂存在第一缓存中,供将来使用。这几部分数据加起来,和现有技术中第一缓存最终获得的的数据相同。但是现有技术中,待读数据到第一缓存的速度太慢。而本发明分成几个部分以后,待读数据所在的第一部分数据优先到达第一缓存,减小了第一缓存的等待时间,从而减小了第一核心的等待时间。步骤25,第一缓存接收最新的第一部分数据,从中提取最新的待读数据发送给第一核心,把最新的第一部分数据进行暂存。第一缓存接收最新的其余部分数据,把最新的其余部分数据进行暂存。第一核心收到最新的待读数据后,即可使用这部分数据继续运行程序。应用本发明实施例,先查第一部分数据(例如8比特),后查其余字节数据状态,对于避免复杂冲突场景有一定好处。举例来说,第一部分数据是共享态,而其余字节有部分是修改态,那么整个64byte是修改态。那么该第一部分数据就可以从第二处理器直接返回给请求者(第一缓存),而不需要向其他处理器发送任何数据。另一方面,多个处理器的家乡代理同时请求同一地址的数据时,容易产生冲突。冲突场景的解决,是缓存一致性协议设计中最复杂和最耗时的场景。将数据的颗粒度,从64字节减小为8字节,可以降低发生冲突的概率;为保证缓存命中率,本发明又兼容64字节的设计,最终缓存在第一缓存中的数据仍然和现有技术一样是64字节,也就是说最终完成64字节数据的一致性访问。步骤25中,本发明实施例中第一缓存发送给第一核心的数据是第一核心真正需要的数据。而现有技术中,即使第一核心需要的数据小于64字节,第一缓存发送给第一核心的始终是64字节数据。因此,现有技术中,第一缓存发送给第一的数据更多,而且第一核心需要从中选出实际需要的数据,增加了系统的复杂性。步骤25中“第一缓存接收最新的第一部分数据,从中提取最新的待读数据发送给第一核心”还可以有一种替换方式,那就是第一缓存不提取最新的待读数据,直接把第一部分数据发送给第一核心。第一核心收到后,从中提取最新的待读数据。最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1