利用多级指针维护乱序数据的方法、装置、介质及设备与流程



1.本公开涉及数据处理领域,具体地涉及一种利用多级指针维护乱序数据的方法、装置、介质及设备。


背景技术:



2.在并行计算场景,为提高执行并行度,硬件会将软件交付的任务(以波前wavefront为单位)乱序执行。为监控任务完成状态,通常在任务之间插入必要的事件(event),这就需要以合理的方式记录任务和事件之间的相互次序关系。当某事件之前的所有任务都已执行完毕时,硬件需要将该事件尽快返还给软件。软件收到后,得以确定截至该事件之前,所有任务都已结束(并不保证该事件之后的任务执行状况)。
3.为同时支持任务的乱序执行和事件的按序输出,传统上采用了一种爬虫(crawler)的架构。该架构包括从下到上的一系列记录条(entry),每条可记录1个波前或1个事件。任务输入时,波前和事件按时间次序从下到上依次写入记录条。当某个波前完成时,将该完成波前的id(该波前在计算单元的地址),与所有有效记录条的波前id都进行比较,若与某有效记录条比对一致,则该有效记录条湮灭(collapse):即在下一周期,所有位于该有效记录条位置以上的有效记录条,统统下移(down shift)一格。一旦发现最下面的有效记录条为事件,则代表其之前的所有波前均已湮灭,该事件可以输出,交还给软件。
4.例如,以w代表波前, e代表事件,软件交付次序为w_0,w_1,e_0,w_2,e_1,图1为传统爬虫架构记录过程的一个例子。如果软件收到硬件交回的e_0,即代表w_0和w_1已执行完毕;若收到交回的e_1,即代表w_0,w_1,w_2均已执行完毕。
5.所有的波前和事件,都在输入时被定义为属于某个队列(queue)。软件只关注在同一个队列内,是否该事件之前的所有波前已执行完毕。不同队列之间互不干扰,也即a队列的事件,并不必保证b队列波前的完成情况。
6.传统的爬虫架构存在如下缺点:1)性能上,无法支持事件按队列输出(per-queue-event-ordering)。传统爬虫要求所有事件只能从最下面的记录条输出,队列之间会互相堵塞,降低效率。图1中,w_2执行完毕,但e_1被其下方(之前)的波前和事件阻挡,不能输出,即为一个堵塞的例子。堵塞会降低效率;2)时序上,上层的记录条需要关注它位置以下所有的记录条,是否发生湮灭,一旦有湮灭即需做下移。位置越高的记录条,需关注的条数越多,组合逻辑层次越深,时序越差,不利于提高时钟频率;3)功耗上,若某记录条发生湮灭,位置高于其位置的所有有效记录条都必须在下一周期完成下移,大量寄存器同时翻转,对功耗不利。而且越下层的记录条,历史越久,越容易湮灭,对功耗是双重打击;4)面积上,因为可能在一周期内发生多个记录条的下移,只能采用寄存器实现,无法使用静态随机存储器(sram),大大增加成本。
7.因此,如何提供一种高效的维护乱序数据的方法,成为亟待解决的问题。


技术实现要素:



8.本公开的目的在于,针对现有技术中存在的问题,提供一种利用多级指针维护乱序数据的方法、装置、介质及设备,提高乱序处理数据的性能并降低存储成本。
9.根据本公开的一个方面,包括如下步骤:s0、接收输入数据,s1、判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,s2、响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段,:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入,preempt,表示本行是否为引导替宿主所占,q_oldest,表示本行事件是否为所属队列中最早的事件,next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址,next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址,wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为其宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件;波前若为宿主的第一个从属,则为引导,否则为普通波前;s3、响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址。
10.在一些实施例中,所述字段的大小具体为:所述event_id,大小为6bit,所述q_id,大小为4bit,所述active,大小为1bit,所述preempt,大小为1bit,所述q_oldest,大小为1bit,所述wave_num,大小为10bit,最大值为512。
11.在一些实施例中,所述步骤s2还包括,响应于输入数据为所述事件数据,设其队列为in_q_id,若usher_arrived[in_q_id] == 1, 表示本事件为宿主, event_num值不增加;只需将event_adr[in_q_id]地址的event_id、active、preempt的值更新,并更新usher_
arrived[in_q_id]=0;若usher_arrived[in_q_id]==0,表示本事件为孤独事件,需为该事件寻址,并将寻到的地址设为ffa_adr,并将event_num值加1,若q_oldest_set[in_q_id]==0,表示本孤独事件为本队列最早,更新所述事件属性寄存器阵列,并更新q_oldest_set[in_q_id]=1,event_adr[in_q_id]更新为ffa_adr;若q_oldest_set[in_q_id]==1,表示本孤独事件非本队列最早,除更新事件属性寄存器阵列的地址ffa_adr的所有字段外,还需更新事件属性寄存器阵列的地址event_adr[in_q_id]的next_ptr为ffa_adr,;其中所述usher_arrived为寄存器组,用于表示队列中引导是否已被写入,其中所述event_num为寄存器组,用于表示所述事件属性寄存器阵列已被占用的行数,其中所述event_adr为寄存器组,用于表示队列最新的事件所在的地址,其中所述q_oldest_set为寄存器组,表示队列是否已有引导或事件写入。
[0012]
在一些实施例中,所属步骤s3还包括,响应于输入的数据为所述波前数据,设其队列为in_q_id,若usher_arrived[in_q_id]==0,表示本波前为所述引导,需为将来的宿主在所述事件属性寄存器阵列中寻址,也需为该波前数据更新波前sram,及更新usher_arrived[in_q_id]=1,并将event_num值加1;在所述事件属性寄存器阵列寻址,条件是从每行!active&!preempt==1中出第一个可用的地址设为ffa_adr,并将ffa_adr写入波前sram;若该引导为本队列现存第一个出现的数据,即q_oldest_set[in_q_id]==0,则只需更新事件属性寄存器阵列的地址ffa_adr的部分字段,并更新q_oldest_set[in_q_id]=1,事件属性寄存器阵列的地址event_adr[in_q_id]的next_ptr更新为ffa_adr。
[0013]
若本队列已有其它数据即q_oldest_set[in_q_id]==1,则需更新ffa_adr的部分字段,及本队列上次最新事件地址event_adr[in_q_id]的部分字段,然后需将event_adr[in_q_id]更新为ffa_adr。
[0014]
若usher_arrived[in_q_id]==1,代表该波前为普通波前,需将其宿主的wave_num值加1,也需为该波前数据更新波前sram。
[0015]
在一些实施例中,还包括步骤s4,响应于波前数据执行完毕,先用所述执行完毕的波前的id作为地址,查询波前sram,得到其宿主的地址,设为host_adr,经锁存后,用host_adr查询事件属性存储器阵列,对该行wave_num减1,若减后wave_num》0,则本次处理结束;若减后wave_num==0且q_oldest==1,代表此行事件的所有从属均已执行完毕,可将event_id输出,更新本行active=0,event_num减1,若本行next_vld==0,则其后已无本队列内容,更新q_oldest_set[q_id]=0,q_id为本行所属队列;若本行next_vld==1,根据next_ptr到本队列下个事件,更新其q_oldest=1。
[0016]
在一些实施例中,还包括步骤s5,空闲时,扫描所述事件属性寄存器阵列,若某行wave_num==0且q_oldest==1,则该行已可输出,但active==1需输出event_id后event_num减1,而preempt==1则不输出event_id,只将event_num减1。
[0017]
根据本公开的另一个方面,提出一种利用多级指针维护乱序数据的装置;包括:接收单元,用于接收输入数据,判断单元,用于判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,第一记录单元,响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入;preempt,表示本行是否为引导替宿主所占;q_oldest,表示本行事件是否为所属队列中最早的事件;next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址;next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址;wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件,波前若为宿主的第一个从属,则为引导,否则为普通波前;第二记录单元,响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址,输出单元,用于响应于计算单元完成波前,更新事件属性寄存器阵列和sram,并于合适时输出事件,其中,当任何波前被计算单元完成时,其宿主的从属个数wave_num将被减1;当任何事件的wave_num为0时,该事件可被输出。
[0018]
本技术实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序适于处理器进行加载,以执行如上任一实施例所述的利用多级指针维护乱序数据的方法中的步骤。
[0019]
本技术实施例还提供一种电子设备,所述电子设备包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器通过调用所述存储器中存储的所述计算机程序,执行如上任一实施例所述的利用多级指针维护乱序数据的方法中的步骤。
[0020]
本技术提供一种利用多级指针维护乱序数据的方法、装置、介质及设备,输入的波前和事件被分开记录,其中波前数据被记录到sram中,少量的事件数据被记录到事件属性寄存器阵列,其中sram行地址为波前在计算单元的地址,sram行的值为该波前的宿主在事件属性寄存器阵列中的地址,根据不同的情况更新维护sram和存储器阵列,一方面提高了乱序数据处理性能,另一方面降低了存储成本。
附图说明
[0021]
下面结合附图,通过对本公开的具体实施方式详细描述,将使本公开的技术方案及其它有益效果显而易见。
[0022]
图1为现有技术中乱序数据的记录过程示意图。
[0023]
图2为本技术实施例提供的事件定义示意图。
[0024]
图3为本技术实施例提供的事件属性寄存器阵列示意图。
[0025]
图4为本技术实施例提供的波前sram示意图。
[0026]
图5为本技术实施例提供的写入引导:事件属性寄存器阵列寻址示意图。
[0027]
图6为本技术实施例提供的写入引导:波前sram更新示意图。
[0028]
图7为本技术实施例提供的写入引导(为该队列最早):事件属性寄存器阵列更新示意图。
[0029]
图8为本技术实施例提供的写入引导(非该队列最早):事件属性寄存器阵列更新示意图。
[0030]
图9为本技术实施例提供的写入普通波前:事件属性寄存器阵列更新示意图。
[0031]
图10为本技术实施例提供的写入普通波前:波前sram更新示意图。
[0032]
图11为本技术实施例提供的写入宿主示意图。
[0033]
图12为本技术实施例提供的写入孤独事件(为该队列最早)示意图。
[0034]
图13为本技术实施例提供的写入孤独事件(非该队列最早)示意图。
[0035]
图14为本技术实施例提供的波前结束的处理流程示意图。
[0036]
图15为本技术实施例提供的利用多级指针维护乱序数据的方法流程示意图。
[0037]
图16为本技术实施例提供的利用多级指针维护乱序数据的装置的结构示意图。
[0038]
图17本技术实施例提供的电子设备的一种结构示意图。
具体实施方式
[0039]
在下面的描述中阐述了很多具体细节以便于充分理解本技术。但是本技术能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本技术内涵的情况下做类似推广,因此本技术不受下面公开的具体实施的限制。在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的
“ꢀ
一种”、
“ꢀ
所述”和
“ꢀ
该”也旨在包括多数形式,除非上下文清楚地表示其他含义。本公开的说明书和权利要求书以及附图中的术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排它的包含。在本公开的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
[0040]
以下将分别对本技术实施例提供的一种多级指针维护乱序数据的方法、装置、存储介质及电子设备进行详细说明。需说明的是,以下实施例的序号不作为对实施例优选顺序的限定。
[0041]
实施例一:本公开实现了一种利用多级指针维护数据的方法。具体地,请参阅图15。
[0042]
s0、硬件接收输入数据。
[0043]
这里的硬件可以是gpu或具有乱序处理数据能力的其他硬件,硬件接收输入的待
乱序处理的数据。
[0044]
s1、判断所述输入数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列。
[0045]
为了提高并行处理的效率,本实施例中硬件会将软件交付的任务以波前(wavefront)为单位乱序执行,然而因乱序执行,软件交付的次序与硬件执行的次序并非一致,因此,为了便于软件监督任务在硬件上的完成状态,在任务之间插入事件event,并记录任务和事件之间的相互次序关系。本实施例对任务和事件进行区分记录,在对数据记录之前先进行数据类型的判断。
[0046]
s2、响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列。
[0047]
本实施例中,利用少量寄存器存储每个事件属性,在一个实施例中,事件属性寄存器阵列如图3所示(深度配置为16),每行为1个事件的相关信息,具体字段如下:levent_id,6bit,事件具体内容;lq_id,4bit,所属队列(16个之一);lactive,1bit,本行event_id是否已写入;lpreempt,1bit,本行是否为引导替宿主所占;lq_oldest,本行事件是否为所属队列中最早;lnext_ptr,与本行事件同一队列的下一事件,在事件属性阵列中的地址;lnext_vld,与本行事件同一队列的下一事件,是否已在事件属性阵列中获得地址;lwave_num,10bit,本行事件的从属个数,最大值为512。
[0048]
s3、响应于所述输入数据为波前数据,将所述波前数据记录到sram中。
[0049]
本实施例中,波前数据和事件数据分开记录,如图4所示,波前数据记录到sram中,在一个实施例中,波前sram(例如深度配置为512),具体内容为每行存储1个波前,行的地址为波前在计算单元的地址(例如10bit),行的值为该波前的宿主在事件属性阵列的地址。指针是数据存储所在的地址。将指针存储于数组中,则其地址构成多级指针。如前所述,波前sram存储的即为指针,而波前sram的地址,即为二级指针。
[0050]
在一个实施例中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即其宿主,波前为该宿主之从属。若某一事件没有任何从属,则为孤独事件,否则为普通事件。波前若为宿主的第一个从属,则定义为引导(或称先导),否则为普通波前。定义如图2所示。
[0051]
在一个实施例中,为处理不同情况下的数据,定义了要4个寄存器数组:lusher_arrived,16bit,每队列1bit,代表是否引导已被写入;levent_adr,16*4bit,每队列4bit,代表该队列最新的事件所在的地址;lq_oldest_set,16bit,每队列1bit,代表该队列是否已有引导或事件写入;levent_num,5bit,最大值为16,代表事件属性阵列已被占用多少行。
[0052]
在一个实施例中,输入为波前的情况,设其队列为in_q_id,1)若usher_arrived[in_q_id]==0,代表该队列最后一个写入的是事件,或者
无任何信息;无论如何本波前必定为先导,需为将来的宿主在事件属性阵列中占位,也需为自己更新波前sram,然后更新usher_arrived[in_q_id] = 1,event_num加1(替宿主)。
[0053]
如图5所示为事件属性阵列寻址(占位),条件是从每行!active & !preempt == 1中出第一个,设到的地址为ffa_adr。如图6所示为将ffa_adr写入波前sram。
[0054]
若该引导为本队列现存数据第一个出现(q_oldest_set[in_q_id] == 0),则只需更新ffa_adr的部分字段,如图7所示,然后更新q_oldest_set[in_q_id] = 1,event_adr[in_q_id]更新为ffa_adr。
[0055]
若本队列已有其它数据(q_oldest_set[in_q_id] == 1),则需更新ffa_adr的部分字段,及本队列上次最新事件地址(event_adr[in_q_id]) 的部分字段,如图8所示。然后需将event_adr[in_q_id]更新为ffa_adr。
[0056]
2)若usher_arrived[in_q_id] == 1,代表该波前为普通波前。需将其宿主的wave_num加1,如图9所示;同时也需为自己更新波前sram,如图10所示。
[0057]
在一个实施例中,输入为事件的情况,设其队列为in_q_id,1)若usher_arrived[in_q_id] == 1, 本事件为宿主,event_num不增加(先导已替宿主增加过);只需将event_adr[in_q_id]地址的event_id / active / preempt更新即可,如图11所示。另外更新usher_arrived[in_q_id] = 0。
[0058]
2)若usher_arrived[in_q_id] == 0, 本事件为孤独事件,需为自己寻址,设为ffa_adr如图5所示,event_num加1。
[0059]
若q_oldest_set[in_q_id] == 0,本事件为本队列最早,字段更新如图12所示,然后需更新q_oldest_set[in_q_id] = 1,event_adr[in_q_id]更新为ffa_adr。
[0060]
若q_oldest_set[in_q_id] == 1,本事件非本队列最早,除更新事件属性寄存器阵列的地址ffa_adr的所有字段外,还需更新事件属性寄存器阵列的地址event_adr[in_q_id]的next_ptr为ffa_adr,如图13所示。然后event_adr[in_q_id]更新为ffa_adr。
[0061]
在一个实施例中,若某波前执行完毕,如图14所示,先用完成波前的id作为地址,查询波前sram,得到其宿主的地址,设为host_adr。经锁存(时序要求)后,用host_adr查询事件属性阵列,对该行wave_num减1。若减后wave_num 》 0,则本次处理结束。
[0062]
若减后wave_num == 0 且q_oldest == 1,代表此行事件的所有从属均已执行完毕,可将event_id输出,更新本行active = 0,event_num减1。若本行next_vld == 0,则其后已无本队列内容,更新q_oldest_set[q_id] = 0,q_id为本行所属队列;若本行next_vld == 1,根据next_ptr到本队列下个事件,更新其q_oldest = 1。
[0063]
在一个实施例中,针对空闲时的情况(无数据写入且无执行如前所述某波前执行完毕的动作),扫描事件属性阵列。若某行(active | preempt ) 且wave_num == 0且q_oldest == 1,则该行已可输出。之后处理与处理某波前执行完毕的情况类似,但active == 1需输出event_id后event_num减1,而preempt == 1则不输出event_id,只将event_num减1。
[0064]
上述实施例,在性能上,可支持事件按队列输出,功能得以增强;在时序上,上下记录条之间无需互相关注,时序不受影响;在功耗上,没有湮灭,不需要大量寄存器同时翻转,对功耗有利;在面积上,波前信息采用sram存储,少量事件信息才需要寄存器阵列,节省成本。
[0065]
实施例二参阅图16为本技术实施例提供的用于多级指针维护乱序数据的装置的结构示意图。该装置可以包括接收单元301,判断单元302,第一记录单元303,第二记录单元304。
[0066]
接收单元301,用于接收输入数据,判断单元302,用于判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,第一记录单元303,响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入;preempt,表示本行是否为引导替宿主所占;q_oldest,表示本行事件是否为所属队列中最早的事件;next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址;next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址;wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件,波前若为宿主的第一个从属,则为引导,否则为普通波前;第二记录单元304,响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址。
[0067]
输出单元305,用于响应于计算单元完成波前,更新事件属性寄存器阵列和sram,并于合适时输出事件,其中,当任何波前被计算单元完成时,其宿主的从属个数wave_num将被减1;当任何事件的wave_num为0时,该事件可被输出。
[0068]
实施例三相应的,本技术实施例还提供一种电子设备,该电子设备可以为终端或者服务器。图17为本技术实施例提供的电子设备的结构示意图。
[0069]
该电子设备400包括有一个或者一个以上处理核心的处理器401、有一个或一个以上计算机可读存储介质的存储器402及存储在存储器402上并可在处理器上运行的计算机程序。其中,处理器401与存储器402电性连接。本领域技术人员可以理解,图中示出的电子设备结构并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
[0070]
处理器401是电子设备400的控制中心,利用各种接口和线路连接整个电子设备
400的各个部分,通过运行或加载存储在存储器402内的软件程序(计算机程序)和/或单元,以及调用存储在存储器402内的数据,执行电子设备400的各种功能和处理数据,从而对电子设备400进行整体监控。
[0071]
在本技术实施例中,电子设备400中的处理器401会按照如下的步骤,将一个或一个以上的应用程序的进程对应的指令加载到存储器402中,并由处理器401来运行存储在存储器402中的应用程序,从而实现各种功能:s0、接收输入数据,s1、判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,s2、响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,s3、响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入;preempt,表示本行是否为引导替宿主所占;q_oldest,表示本行事件是否为所属队列中最早的事件;next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址;next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址;wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件,波前若为宿主的第一个从属,则为引导,否则为普通波前;其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址。
[0072]
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
[0073]
可选的,如图17所示,电子设备400还包括:乱序数据维护模块403、通信模块404、输入单元405以及电源406。其中,处理器401分别与乱序数据维护模块403、通讯模块404、输入单元405以及电源406电性连接。本领域技术人员可以理解,图17中示出的电子设备结构并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
[0074]
乱序数据维护模块403可用于实现乱序数据的维护。
[0075]
通信模块404可用于与其他设备通信。
[0076]
输入单元405可用于接收输入的数字、字符信息或用户特征信息(例如指纹、虹膜、面部信息等),以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
[0077]
电源406用于给电子设备400的各个部件供电。可选的,电源406可以通过电源管理系统与处理器401逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源406还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
[0078]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0079]
实施例四本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
[0080]
为此,本技术实施例提供一种计算机可读存储介质,其中存储有多条计算机程序,该计算机程序能够被处理器进行加载,以执行本技术实施例所提供的利用多级指针维护数据的方法中的步骤。例如,该计算机程序可以执行如下步骤:s0、接收输入数据,s1、判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,s2、响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,s3、响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入;preempt,表示本行是否为引导替宿主所占;q_oldest,表示本行事件是否为所属队列中最早的事件;next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址;next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址;wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件,波前若为宿主的第一个从属,则为引导,否则为普通波前;其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址。
[0081]
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
[0082]
其中,该计算机可读存储介质可以包括:只读存储器(rom,read only memory)、随机存取记忆体(ram,random access memory)、磁盘或光盘等。
[0083]
由于该存储介质中所存储的计算机程序,可以执行本技术实施例所提供的任一种
利用多级指针维护乱序数据的方法中的步骤,因此,可以实现本技术实施例所提供的任一种利用多级指针维护乱序数据的方法所能实现的有益效果,详见前面的实施例,在此不再赘述。
[0084]
以上对本技术实施例所提供的一种利用多级指针维护数据的方法、装置、计算机可读存储介质及电子设备进行了详细介绍,本文中应用了具体个例对本技术的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本技术的方法及其核心思想;同时,对于本领域的技术人员,依据本技术的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本技术的限制。

技术特征:


1.一种利用多级指针维护乱序数据的方法,其特征在于,包括如下步骤:s0、接收输入数据,s1、判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,s2、响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入,preempt,表示本行是否为引导替宿主所占,q_oldest,表示本行事件是否为所属队列中最早的事件,next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址,next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址,wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为其宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件;波前若为宿主的第一个从属,则为引导,否则为普通波前;s3、响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址;s4、响应于计算单元完成波前,更新事件属性寄存器阵列和sram,并于合适时输出事件,其中,当任何波前被计算单元完成时,其宿主的从属个数wave_num将被减1;当任何事件的wave_num为0时,该事件可被输出。2.根据权利要求1所述的方法,其特征在于,所述字段的大小具体为:所述event_id,大小为6bit,所述q_id,大小为4bit,所述active,大小为1bit,所述preempt,大小为1bit,所述q_oldest,大小为1bit,所述next_ptr,大小为4bit,所属next_vld,大小为1bit,所述wave_num,大小为10bit,最大值为512。3.根据权利要求2所述的方法,其特征在于,所述步骤s2还包括,响应于输入数据为所述事件数据,设其队列为in_q_id,若usher_arrived[in_q_id] == 1, 表示本事件为宿主, event_num值不增加;只需将事件属性寄存器阵列的地址event_adr[in_q_id]的event_id、active、preempt的值更新,
并更新usher_arrived[in_q_id]=0;若usher_arrived[in_q_id]==0,表示本事件为孤独事件,需为该事件寻址,并将寻到的地址设为ffa_adr,并将event_num值加1,若q_oldest_set[in_q_id]==0,表示本孤独事件为本队列最早,更新所述事件属性寄存器阵列的地址ffa_adr的所有字段,并更新q_oldest_set[in_q_id]=1,event_adr[in_q_id]更新为ffa_adr;若q_oldest_set[in_q_id]==1,表示本孤独事件非本队列最早,除更新事件属性寄存器阵列的地址ffa_adr的所有字段外,还需更新事件属性寄存器阵列的地址event_adr[in_q_id]的next_ptr为ffa_adr;其中所述usher_arrived为寄存器组,用于表示队列中引导是否已被写入,其中所述event_num为寄存器组,用于表示所述事件属性寄存器阵列已被占用的行数,其中所述event_adr为寄存器组,用于表示队列最新的事件所在的地址,其中所述q_oldest_set为寄存器组,表示队列是否已有引导或事件写入。4.根据权利要求3所述的方法,其特征在于,所属步骤s3还包括,响应于输入的数据为所述波前数据,设其队列为in_q_id,若usher_arrived[in_q_id]==0,表示本波前为所述引导,需为将来的宿主在所述事件属性寄存器阵列中寻址,也需为该波前数据更新波前sram,及更新usher_arrived[in_q_id]=1,并将event_num值加1;在所述事件属性寄存器阵列寻址,条件是从每行!active&!preempt==1中出第一个可用的地址,,设为ffa_adr,并将ffa_adr写入波前sram,若该引导为本队列现存第一个出现的数据,即q_oldest_set[in_q_id]==0,则只需更新ffa_adr的部分字段,并更新q_oldest_set[in_q_id]=1,event_adr[in_q_id]更新为ffa_adr;若本队列已有其它数据,即q_oldest_set[in_q_id]==1,则需更新ffa_adr的部分字段,及本队列上次最新事件地址event_adr[in_q_id]的部分字段,然后需将event_adr[in_q_id]更新为ffa_adr,若usher_arrived[in_q_id]==1,代表该波前为普通波前,需将其宿主的wave_num值加1,也需为该波前数据更新波前sram。5.根据权利要求4所述的方法,其特征在于,还包括步骤s4,响应于波前数据执行完毕,先用所述执行完毕的波前的id作为地址,其中所述id由计算单元提供,查询波前sram,得到其宿主的地址,设为host_adr,经锁存后,用host_adr查询事件属性存储器阵列,对该行wave_num减1,若减后wave_num>0,则本次处理结束;若减后wave_num==0且q_oldest==1,代表此行事件的所有从属均已执行完毕,可将event_id输出,更新本行active=0,event_num减1,若本行next_vld==0,则其后已无本队列内容,更新q_oldest_set[q_id]=0;若本行next_vld==1,根据next_ptr到本队列下个事件,更新其q_oldest=1。6.根据权利要求5所述的方法,其特征在于,
还包括步骤s5,空闲时,扫描所述事件属性寄存器阵列,若某行active == 1或 preempt ==1 并且wave_num == 0和q_oldest == 1,则该行已可输出,但active == 1需输出event_id后event_num减1,而preempt == 1则不输出event_id,只将event_num减1。7.一种利用多级指针维护乱序数据的装置,其特征在于,包括:接收单元,用于接收输入数据,判断单元,用于判断所述数据类型,其中所述数据类型包括事件数据和波前数据,其中所述波前数据为多个任务数据的集合,其中所述波前数据和事件数据,在输入时被定义为属于某个队列,第一记录单元,用于响应于所述输入数据为事件数据,将所述事件数据记录到事件属性寄存器阵列,其中,所述事件属性寄存器阵列中每行表示一个事件的相关信息,其中所述相关信息包括如下字段:event_id,表示事件的具体内容,q_id,表示事件所属队列,active,表示本行event_id是否已写入;preempt,表示本行是否为引导替宿主所占;q_oldest,表示本行事件是否为所属队列中最早的事件;next_ptr,表示与本行事件同一队列的下一事件,在所述阵列中的地址;next_vld,表示与本行事件同一队列的下一事件,是否已在所述阵列中获得地址;wave_num,表示本行事件的从属个数;其中,对于每个波前,时间上位于其后且属于相同队列的第一个事件,即为其宿主,波前为该宿主的从属;若某一事件没有任何从属,则为孤独事件,否则为普通事件;波前若为宿主的第一个从属,则为引导,否则为普通波前;第二记录单元,用于响应于所述输入数据为波前数据,将所述波前数据记录到sram,其中所述sram的每行存储一个波前,行的地址为波前在计算单元的地址,行的值为该波前的宿主在事件属性阵列的地址;输出单元,用于响应于计算单元完成波前,更新事件属性寄存器阵列和sram,并于合适时输出事件,其中,当任何波前被计算单元完成时,其宿主的从属个数wave_num将被减1;当任何事件的wave_num为0时,该事件可被输出。8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序适于处理器进行加载,以执行如权利要求1-6任一项所述的利用多级指针维护乱序数据的方法中的步骤。9.一种电子设备,其特征在于,所述电子设备包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器通过调用所述存储器中存储的所述计算机程序,执行如权利要求1-6任一项所述的利用多级指针维护乱序数据的方法中的步骤。

技术总结


本申请提供一种利用多级指针维护乱序数据的方法、装置、介质及设备,属于数据处理技术领域,输入的波前和事件数据被分开记录,其中波前数据被记录到SRAM中,少量的事件数据被记录到事件属性寄存器阵列,其中SRAM行地址为波前在计算单元的地址,SRAM行的值为该波前的宿主在事件属性寄存器阵列中的地址,基于此,根据不同的情况更新维护SRAM和存储器阵列,一方面提高了乱序数据处理性能,另一方面降低了存储成本。储成本。储成本。


技术研发人员:

ꢀ(74)专利代理机构

受保护的技术使用者:

沐曦集成电路(上海)有限公司

技术研发日:

2022.11.23

技术公布日:

2022/12/23

本文发布于:2024-09-21 15:52:32,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/48120.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:事件   所述   队列   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议