具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中诸如“第一”、“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
再者,本申请中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。
为了便于理解本申请实施例提供的存储器冲突优化方法,下面以图1所示的并行处理器的架构为例,该并行处理器包括全局数据共享单元(Global Data Share,GDS)和4个相互独立的着色器引擎(Shader Engine,SE),分别为SE0、SE1、SE2和SE3。GDS分别与4个SE连接,用于完成各SE的数据共享。每个SE包含16个CU(Computing Unit),分别为CU0、CU1、……、CU14、CU15。每个CU包含本地数据共享单元(Local Data Share,LDS)和4个单指令多数据流(Single Instruction Multiple Data,SIMD)架构,分别为SIMD0、SIMD1、SIMD2、SIMD3。该LDS分别与4个SIMD连接,用于完成各SIMD间的数据共享。需要说明的是,上述示例的架构中仅示出了与本申请实施例提供的存储器冲突优化方法相关的部分,因此不能将这一简化的架构理解成是对并行处理器架构的限制。
其中,存储器也即Bank主要存在于GDS和LDS中,在GDS以及LDS中存在32个Bank,支持32个指令的同时操作。每个Bank为一个512*32bit大小的双端口静态随机存取存储器(Static Random Access Memory,SRAM),其作为让并行处理器各单元能够快速获得数据的存储介质,主要用于内部数据的交互,每个Bank支持32bit数据的读写操作,其读写操作的方式参见SRAM的操作方式。
其中,存储器冲突也即Bank冲突,主要发生于GDS或LDS中。正常情况下(未发生Bank冲突),指令组中的32个并行操作指令同时到达32个Bank进行并行处理,若发生Bank冲突,需要暂停整个流水,并通过分时操作对发生冲突的Bank进行独立的读写,最终将32个并行操作指令分时输出到Bank端,若最差情况下,冲突导致32个并行操作指令均指向同一个Bank,则需要32个clk(时钟)才能将32个指令分时输出到达Bank端。
本申请实施例,通过引入流水线(pipe)的概念,将待处理的指令组暂存于流水线中,在对发生Bank冲突的同一bank的不同地址进行读写操作时,也即在当前时刻对存在Bank冲突的指令进行处理时,将位于流水线中的其余指令组提前分配给剩余的空闲Bank,让剩余的空闲Bank提前对之后的其余指令组进行处理,以充分利用时钟周期,从而从整体上减少处理冲突指令所需的时间。相比于通常方法(增加Bank数量、采用双端口存储介质或是特殊的地址编码方式)而言,本申请实施例以另一种思路来降低Bank冲突造成的不利影响,提升了系统抵抗Bank冲突的能力,同时,本申请实施例提供的存储体冲突优化方法,能够与现有的方法共同使用,使得从不同的方面上减少了Bank冲突的影响。
本申请实施例通过在多端口存储体的前后增加适当流水线(pipe),使得将发生Bank冲突时,出现的剩余数据带宽分配给其余时间输入的指令使用,充分利用存储体的读写端口资源,减少Bank冲突带来stall时间和存储体性能衰减。同时,该方法能够与其余减少Bank冲突影响的方案,同时使用,进一步优化并行处理器中的存储体性能。
为了便于理解,下面将结合本申请实施例提供的并行处理器的并行多端口存储结构(该并行多端口存储结构属于LDS或GDS中的一部分)进行说明,如图2所示,该并行多端口存储结构包括:指令流水线单元(Instruction pipe)、指令排序单元(Instructionreorder)、指令映射单元(Instruction crossbar)、存储体(Bank)、指令控制单元(Instruction reorder control)、数据映射单元(Data_out crossbar)、数据流水线单元(Data_out pipe)、数据排序单元(Data_out reorder)。
其中,指令控制单元(Instruction reorder control):用于完成对各指令组中地址和操作信息的汇总控制;完成对各指令组是否存在Bank冲突的判断,并将处理方案发送给指令排序单元(Instruction reorder)进行相关处理顺序的调整;并在输出端通过监控数据流水线单元(Data_out pipe)中的数据,结合前期指令和数据排序的情况,对输出数据的顺序进行相关判断,并将判断结果输送给数据排序单元(Data_out reorder),从而完成最终的数据输出。
在指令的输入端的控制逻辑包括:
指令流水线单元(Instruction pipe):用于暂存输入的指令组,作为暂存指令的pipe,其pipe的级数为T,T的大小决定了能够同时纳入考量的指令数目。基于统计学基本概念可知,在较长时间域且无特定读写目的的情况下,对各个Bank及Bank内部各地址读写的概率相同。因此,只要能够获取足够多的指令信息,就能有效平衡各Bank上的读写请求数目,从而达到减少Bank冲突发生导致的不良影响的效果。显然T越大,同时纳入考量的指令越多,Bank冲突导致的性能衰减愈能得到改善。
指令排序单元(Instruction reorder):根据指令控制单元发送的控制指令,对不同pipe中存储的指令以及相关数据进行重新排序和派发,减少Bank冲突的影响。
指令映射单元(Instruction crossbar):用于完成从指令的来源(crawler)到指令运行的目的地Bank的映射,映射的依据来源于指令中操作地址中对应Bank的地址位。
在数据的输出端的控制逻辑包括:
数据映射单元(Data_out crossbar):与指令映射单元(Instruction crossbar)的功能对应,用于完成指令运行的目的地Bank到指令的来源(crawler)的映射,使得输出的数据能够和输入的指令的位置一一对应。
数据流水线单元(Data_out pipe):用于暂存各个Bank输出的数据,暂存数据排序单元的输出,此时虽然位于数据排序单元中的数据已经和指令来源(crawler)一一对应,但是由于发生Bank冲突,导致同一个指令组的输出数据在时域上发生偏差,因此需要重新排序,暂存的相关数据由指令控制单元(Instruction reorder control)进行监控,并通过数据排序单元(Data_out reorder)进行读取操作。
数据排序单元(Data_out reorder):根据指令控制单元提供的信息,对数据流水线单元中的数据信息进行排序,待得到同一指令组的全部输出结果时,将该指令组对应的各个输出结果输出,从而完成最终的数据输出。
由于上述的数据映射单元、数据流水线单元以及数据排序单元仅在对Bank进行读取操作时,才会存在输出,故与输入端分开论述。
在介绍了各个模块的功能作用后,下面将对本申请实施例提供的存储体冲突优化方法的基本工作流程进行说明。
将待处理指令包中的每一组操作指令按照优先级顺序依次输入流水线中,其中,只有进入流水的指令数据才会进行相关的判断;指令控制单元依次对位于流水线最前端(也即最靠近输出一端)的指令组的Bank冲突情况进行判断,若不存在Bank冲突,则按照现有的逻辑常规运行;若存在Bank冲突,则指令控制单元在对位于流水线最前端的当前指令组中存在Bank冲突的同一个Bank中的目标指令进行处理时,确定处理目标指令时剩余的空闲Bank,并从流水线中获取指令地址指向空闲Bank,且距离当前指令组距离最近的一指令组,得到目标指令组,然后按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理。
通过在对位于流水线最前端的当前指令组中存在Bank冲突的目标指令进行处理时,将出现的剩余数据带宽分配给其余时间输入的指令使用,充分利用存储体的读写端口资源,减少Bank冲突带来stall时间和存储体性能衰减。在将出现的剩余数据带宽分配给其余时间输入的指令使用时,依据以下规则对整个pipe中的指令进行调整:只有进入pipe中的指令组才进行相关处理;在处理时按照优先级顺序优先对先进入流水线的指令组进行处理,同一个指令组中的N条指令中,序号越小的,优先级越高。
当对Bank进行读取操作时,考虑到在指令组不存在Bank冲突时,则在输出阶段无需进行重新排序,若将不存在Bank冲突的指令打乱,提前分配给空闲Bank进行处理,在输出阶段需要进行重新排序,因此,作为一种实施方式,指令控制单元在按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理之前,还需要先确定目标指令组存在Bank冲突,若目标指令组不存在Bank冲突,则不将目标指令组打乱,此时对目标指令的处理流程与现有处理流程相同。
其中,在处理的过程中,指令控制单元实时对流水线中的指令组进行监控,当当前指令组位于最大流水线(此时,进入流水线中的指令组达到流水线的最大容纳量)的位置,且当前指令组中存在Bank冲突的指令未处理完时,指令控制单元还用于输出stall信号使系统停止新的指令组输入该流水线。在停止新的指令组输入流水线之后,指令控制单元监控到当位于最大流水线位置的当前指令组中存在Bank冲突的指令全部处理完时,重新恢复指令组输入流水线。
当对Bank进行读取操作时,指令控制单元还用于根据前期指令和数据排序分配情况,控制重新排序单元,以使重新排序单元根据指令控制单元的控制,对数据流水线单元中各个Bank的输出结果进行排序,待得到同一指令组的全部输出结果时,将该指令组对应的各个输出结果输出。
为了便于理解上述过程,下面将结合例子进行说明,示例中以一个Bank总数为32的多Bank存储系统进行操作的过程进行说明,并分别对不同级数的pipe对应的处理过程进行分析,假设待处理指令包的输入数据如表1所示。
表1
num |
crawler0 |
Crawler1 |
crawler2 |
crawler3 |
crawler4 |
crawler5 |
crawler6 |
… |
Crawler31 |
cmd0 |
A0_0 |
A1_1 |
A2_2 |
A3_3 |
A4_4 |
A5_5 |
A6_6 |
… |
A31_31 |
cmd1 |
B0_0 |
B0_1 |
B2_2 |
B3_3 |
B4_4 |
B5_5 |
B6_6 |
… |
B31_31 |
cmd2 |
C1_0 |
C1_1 |
C2_2 |
C3_3 |
C4_4 |
C5_5 |
C6_6 |
… |
C31_31 |
cmd3 |
D0_0 |
D0_1 |
D0_2 |
D0_3 |
D0_4 |
D0_5 |
D6_6 |
… |
D31_31 |
cmd4 |
E1_0 |
E1_1 |
E1_2 |
E1_3 |
E1_4 |
E1_5 |
E6_6 |
… |
E31_31 |
cmd5 |
F2_0 |
F2_1 |
F2_2 |
F2_3 |
F2_4 |
F2_5 |
F6_6 |
… |
F31_31 |
cmd6 |
G3_0 |
G3_1 |
G3_2 |
G3_3 |
G3_4 |
G3_5 |
G6_6 |
… |
G31_31 |
cmd7 |
H0_0 |
H1_1 |
H2_2 |
H3_3 |
H4_4 |
H5_5 |
H6_6 |
… |
H31_31 |
其中cmd0~cmd7表示需要输入的需要处理的指令组,cmd0最早输入,cmd7最晚输入。crawler0~crawler31表示指令的来源。其中,需要说明的是,由于示例的Bank总数为32,因此表中示例的每一个指令组中均包含32个指令为满指令情况,一种实施方式下,指令组中包含的指令数也可以小于32。
其中,每个指令数据以XY_Z的形式进行编码,以便于找出对应关系。X对应数据来源的指令序号,A对应最早输入的cmd0,H对应最晚输入的cmd7;Y对应指令需要运行的目的地Bank,0表示最终该指令在Bank0中运行,31表示最终该指令在Bank31中运行;Z表示指令来源,0表示来源于crawler0,31表示来源于crawler31。在分配时,当Y=Z时,对应crawler分配给对应的bank,当两者不等时,需要分配到其余bank中。
当同一时刻存在多条指令的地址均指向同一个Bank,就会发生Bank冲突,例如,在cmd1中B0_0和B0_1同时到达,且都会运行到Bank0中,就会发生Bank冲突(当然存在特殊情况:当两个操作都为读,且对应同一地址,此时不发生Bank冲突;两个操作都为写,且对应同一地址,如果写入数据相同,不发生Bank冲突;如果写入数据不同,认为发生错误)。本申请实施例是针对发生Bank冲突的优化方法,因此对于存在的特殊情况,不做考虑。
当pipe=1时,对应于现有的一般方案,按照时钟排布相关指令的分配,如图3所示。图3中的pipe0表示即将输入pipe1的指令组,pipe1为输入pipe中的指令。从中可以看出,由于指令组A不存在Bank冲突,只需要一个时刻就能处理完,由于指令组B存在Bank冲突,即B0_0和B0_1同时指向Bank0,根据优先级顺序(同一指令组中,序号越小,优先级越高)B0_0会和该指令组中其余未发生冲突的指令在同一时刻运行,而B0_1会延后一个时刻运行,因此需要2个时刻。指令组C与指令组B类似,指令组D中由于D0_0、D0_1、D0_2、D0_3、D0_4、D0_5同时指向Bank0,根据优先级顺序,D0_0会和该指令组中其余未发生冲突的指令在同一时刻运行,而D0_1、D0_2、D0_3、D0_4、D0_5会依次延后一个时刻运行,因此需要6个时刻。指令组E和指令组F与指令组D类似。
下面将分两种情况对按照本申请实施例所示的存储体冲突优化方法对表1所示的指令包进行处理时的流程进行说明,第一种:在按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理时,需要确保目标指令组存在Bank冲突,若目标指令组不存在Bank冲突,则按照常规的处理流程处理。第二种:无论目标指令组是否存在Bank冲突,都会按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理。
下面将对在相同输入(表1所示的指令)下的第一种情况进行说明:
当pipe=2时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入下,其时钟排布相关指令的分配,如图4所示,可以看出,stall时间大大减小,总时间缩小为18个clk。pipe0表示即将输入pipe1的指令组,当流水线的级数为2级时,能同时容纳2条指令组。在clk2时刻,在对指令组B中存在Bank冲突的B0_0进行处理时,此时剩余空闲Bank为Bank1,由于此时流水线中只有指令组B,因此按照常规的处理流程进行处理。在clk3时刻,在对指令组B中存在Bank冲突的B0_1进行处理时,此时,剩余的空闲Bank为Bank1~Bank31,此时指令组C已经进入流水线,指令地址指向剩余的空闲Bank,且距离指令组B最近的一组指令为指令组C,因此目标指令组为指令组C。由于指令组C中C1_0和C1_1同时指向Bank1,由于C1_0的优先级高于C1_1,因此按照优先级顺序将指令组C中的指令地址指向Bank1的指令分配给Bank1时,优选将C1_0分配给Bank1。其中,在分配时,会将指令分配给该指令指向的目的Bank,例如,C1_1指向的目的Bank为目的Bank1,因此会将C1_1分给Bank1,同理,C2_2指向的目的Bank为目的Bank2,因此会将C2_2分给Bank2。在clk4时刻,在对指令组C中存在Bank冲突的C1_1进行处理时,此时,剩余的空闲Bank为Bank0、Bank2~Bank31,此时指令组D已经进入流水线,指令地址指向剩余的空闲Bank,且距离指令组C最近的一组指令为指令组D,因此目标指令组为指令组D,指令组D中由于D0_0、D0_1、D0_2、D0_3、D0_4、D0_5同时指向Bank0,根据优先级顺序,D0_0的优先级最高,因此按照优先级顺序将指令组D中的指令地址指向Bank0的指令分配给Bank0时优先将D0_0分配给Bank0。在clk5时刻,在对指令组D中存在Bank冲突的D0_1进行处理时,此时剩余的空闲Bank为Bank1~Bank31,目标指令组为指令组E,因此按照优先级顺序将指令组E中的指令分配给与该指令地址对应的空闲Bank(Bank1~Bank31)进行处理,此时,由于指令组D位于最大流水线的位置,其当前指令组中存在Bank冲突的指令(D0_2、D0_3、D0_4、D0_5)未处理完时,停止新的指令组输入流水线,系统进入stall状态,此时指令组E之后的指令组还未进入流水线中,因此在clk6时刻,对D 0_2进行处理时,此时剩余的空闲Bank为Bank2~Bank31,指令地址指向剩余的空闲Bank,且距离指令组D最近的一组指令为指令组F,由于指令组E之后的指令组还未进入流水线中,因此无法获取到后续的指令组,此时就按照常规的处理流程进行处理。当位于最大流水线位置的指令组D中存在Bank冲突的指令全部处理完时,重新恢复指令组输入流水线,对照图4中,在clk9时刻,重新恢复指令组输入流水线,在clk10时刻,在对E1_5进行处理时,将按照优先级顺序将指令组F中的指令分配给与该指令地址对应的空闲Bank进行处理。在clk11时刻,在对F 2_1进行处理时,按照优先级顺序将指令组G中的指令分配给与该指令地址对应的空闲Bank进行处理,此时,由于指令组F位于最大流水线的位置,其当前指令组中存在Bank冲突的指令(F 2_2、F2_3、F2_4、F2_5)未处理完时,停止新的指令组输入流水线,系统进入stall状态。在clk15时刻,重新恢复指令组输入流水线,在clk16时刻,在对G3_5进行处理时,由于指令组H不存在Bank冲突,因此不将下一时刻的指令组H提前到clk16进行处理。
当pipe=3时(pipe=3,表示能同时容纳3条指令组),按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表1所示的指令)下,其时钟排布相关指令的分配,如图5所示,可以看出,stall时间进一步减小,总时间缩小为17个clk。其实现原理与图4一样,此处不再说明。
当pipe=4时(pipe=4,表示能同时容纳4条指令组),按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表1所示的指令)下,其时钟排布相关指令的分配,如图6所示,可以看出,stall时间进一步减小,总时间缩小为14个clk。其中,在clk6时刻,对D0_2进行处理时,对应的空闲Bank为Bank2~Bank31,此时指令地址指向剩余的空闲Bank,且距离指令组D最近的一组指令为指令组F,并且指令组F已经进入流水线中因此目标指令组为指令组F,将按照优先级顺序将指令组F中的指令分配给与该指令地址对应的空闲Bank(Bank2~Bank31)进行处理。指令组F中由于F2_0、F2_1、F2_2、F2_3、F2_4、F2_5同时指向Bank2,根据优先级顺序,F2_0的优先级最高,因此按照优先级顺序将指令组F中的指令地址指向Bank2的指令分配给Bank2时,优先将F2_0分配给Bank2。在clk7时刻,对D0_3进行处理时,对应的空闲Bank为Bank3~Bank31,此时指令地址指向剩余的空闲Bank,且距离指令组D最近的一组指令为指令组G,并且指令组G已经进入流水线中,因此目标指令组为指令组G,将按照优先级顺序将指令组G中的指令分配给与该指令地址对应的空闲Bank(Bank3~Bank31)进行处理,由于指令组D位于最大流水线的位置,其当前指令组中存在Bank冲突的指令(D0_4、D0_5)未处理完时,停止新的指令组输入流水线,系统进入stall状态。在clk8时刻,对D0_4进行处理时,此时指令地址指向剩余的空闲Bank(Bank4~Bank31),且距离指令组D最近的一组指令为指令组H,因此目标指令组为指令组H,由于流水线最多能同时容纳4条指令组,因此指令组H还未进入流水线,此时,则按照常规处理流程处理。
其中,通过图3-图6可以看出,当pipe=1时,处理完表1中的指令包需要31个clk;当pipe=2时,相同的输入下,只需18个clk;当pipe=3时,相同的输入下,只需17个clk;当pipe=4时,相同的输入下,只需14个clk。显然pipe的级数越大,同时纳入考量的指令越多,Bank冲突导致的性能衰减愈能得到改善。
下面将对在相同输入(表1所示的指令)下的第二种情况进行说明:
当pipe=2时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表1所示的指令)下,其时钟排布相关指令的分配,如图7所示。与图4的区别在于:在clk16时刻,在对G3_5进行处理时,此时,剩余的空闲Bank为Bank0~Bank2、Bank4~Bank31,此时即使指令组H不存在Bank冲突,也会按照优先级顺序将指令组H中的指令分配给与该指令地址对应的空闲Bank进行处理。
当pipe=3时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表1所示的指令)下,其时钟排布相关指令的分配,如图8所示。与图5的区别在于:在clk11时刻,在对G3_1进行处理时,此时,剩余的空闲Bank为Bank0、Bank1、Bank4~Bank31,此时指令地址指向剩余的空闲Bank,且距离指令组G最近的一组指令为指令组H,且指令组H已经进入流水线,此时,即使指令组H不存在Bank冲突,也会按照优先级顺序将指令组H中的指令分配给与该指令地址对应的空闲Bank进行处理。
当pipe=4时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表1所示的指令)下,其时钟排布相关指令的分配,如图8所示。与图6的区别在于:在clk10时刻,在对G3_3进行处理时,此时,剩余的空闲Bank为Bank0、Bank4~Bank31,此时即使指令组H不存在Bank冲突,也会按照优先级顺序将指令组H中的指令分配给与该指令地址对应的空闲Bank进行处理。
其中,通过图3、图7-图9可以看出,当pipe=1时,处理完表1中的指令包需要31个clk;当pipe=2时,相同的输入下,只需18个clk;当pipe=3时,相同的输入下,只需17个clk;当pipe=4时,相同的输入下,只需14个clk。显然pipe的级数越大,同时纳入考量的指令越多,Bank冲突导致的性能衰减愈能得到改善。下面将结合又一种实施例下,分别对不同级数的pipe对应的处理过程进行分析,假设待处理指令包的输入数据如表2所示。
表2
num |
crawler0 |
crawler1 |
crawler2 |
crawler3 |
crawler4 |
crawler5 |
crawler6 |
… |
Crawler31 |
cmd0 |
A0_0 |
A1_1 |
A2_2 |
A3_3 |
A4_4 |
A5_5 |
A6_6 |
… |
A31_31 |
cmd1 |
B0_0 |
B0_1 |
B2_2 |
B3_3 |
B4_4 |
B5_5 |
B6_6 |
… |
B31_31 |
cmd2 |
C0_0 |
C1_1 |
C1_2 |
C3_3 |
C4_4 |
C5_5 |
C6_6 |
… |
C31_31 |
cmd3 |
D0_0 |
D0_1 |
D0_2 |
D0_3 |
D0_4 |
D0_5 |
D6_6 |
… |
D31_31 |
cmd4 |
E0_0 |
E1_1 |
E2_2 |
E3_3 |
E4_4 |
E5_5 |
E6_6 |
… |
E31_31 |
cmd5 |
F2_0 |
F2_1 |
F2_2 |
F2_3 |
F2_4 |
F2_5 |
F6_6 |
… |
F31_31 |
cmd6 |
G3_0 |
G3_1 |
G3_2 |
G3_3 |
G3_4 |
G3_5 |
G6_6 |
… |
G31_31 |
cmd7 |
H0_0 |
H1_1 |
H2_2 |
H3_3 |
H4_4 |
H5_5 |
H6_6 |
… |
H31_31 |
当pipe=1时,对应于现有的一般方案,按照时钟排布相关指令的分配,如图10所示,处理完表2所示的指令需要26个clk。
下面将分两种情况对按照本申请实施例所示的存储体冲突优化方法对表2所示的指令包进行处理时的流程进行说明,第一种:在按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理时,需要确保目标指令组存在Bank冲突,若目标指令组不存在Bank冲突,则按照常规的处理流程处理。第二种:无论目标指令组是否存在Bank冲突,都会按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理。
下面将对在相同输入(表2所示的指令)下的第一种情况进行说明:
当pipe=2时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入下(表2所示的指令),其时钟排布相关指令的分配,如图11所示,可以看出,stall时间大大减小,总时间缩小为19个clk。在clk2时刻,在对指令组B中存在Bank冲突的B0_0进行处理时,此时剩余空闲Bank为Bank1,由于此时流水线中只有指令组B,因此按照常规的处理流程进行处理。在clk3时刻,对指令组B中存在Bank冲突的B0_1进行处理时,此时,剩余的空闲Bank为Bank1~Bank31,此时指令组C已经进入流水线,指令地址指向剩余的空闲Bank,且距离指令组B最近的一组指令为指令组C因此目标指令组为指令组C。由于指令组C中C1_1和C1_2同时指向Bank1,由于C1_1的优先级高于C1_2,因此按照优先级顺序将指令组C中的指令地址指向Bank1的指令分配给Bank1时,优选将C1_1分配给Bank1。其中,在分配时,仅将指令组C中对应空闲Bank的指令分给与之对应的Bank,由于Bank0不空闲,因此C0_0会滞后。在clk4时刻,在对指令组C中存在Bank冲突的C1_2进行处理时,此时,剩余的空闲Bank为Bank2~Bank31,由于C0_0指向Bank0,因此指令组D中由于D0_0、D0_1、D0_2、D0_3、D0_4、D0_5会依次顺延。在clk5时刻,在对指令组D中存在Bank冲突的D0_0进行处理时,剩余的空闲Bank为Bank1~Bank31,指令地址指向剩余的空闲Bank,且距离指令组D最近的一组指令为指令组E,由于指令组E不存在Bank冲突,因此,对D0_0按照常规处理流程进行处理,同理,对D0_1、D0_2、D0_3、D0_4、D0_5的处理类似。此时,由于指令组D位于最大流水线的位置,其当前指令组中存在Bank冲突的指令(D0_1、D 0_2、D0_3、D0_4、D0_5)未处理完时,停止新的指令组输入流水线,系统进入stall状态。当位于最大流水线位置的指令组D中存在Bank冲突的指令全部处理完时,重新恢复指令组输入流水线,对照图11中,在clk10时刻,重新恢复指令组输入流水线。在clk11时刻,由于指令组E不存在冲突,则按照常规处理流程进行处理,在clk12时刻,在对指令组F中存在冲突的目标指令(F2_0)进行处理时,此时剩余的空闲Bank为Bank0、Bank1、Bank3~Bank5,由于指令地址指向剩余的空闲Bank,且距离指令组F最近的一组指令为指令组G,且已经进入流水线,此时,按照优先级顺序将指令组G中的指令分配给与该指令地址对应的空闲Bank进行处理,由于指令组G中G3_0、G3_1、G3_2、G3_3、G3_4、G3_5均指向Bank3,依次按照优先级顺序,优先将G3_0分配给Bank3,由于Bank6~Bank31此时并不空闲,因此G6_6~G31_31滞后,此时,由于指令组F位于最大流水线的位置,其当前指令组中存在Bank冲突的指令(F2_1、F 2_2、F2_3、F2_4、F2_5)未处理完时,停止新的指令组输入流水线,系统进入stall状态。。在clk13时刻,在对F2_1进行处理时,此时剩余的空闲Bank为Bank0、Bank1、Bank4~Bank5,由于指令地址指向剩余的空闲Bank,且距离指令组F最近的一组指令(指令组H)还未进入流水线,因此,按照常规处理流程进行处理即可。同理,对F 2_2、F2_3、F2_4、F2_5的处理类似。在clk18时刻,重新恢复指令组输入流水线。
当pipe=3时(pipe=3,表示能同时容纳3条指令组),按照本申请实施例所示的存储体冲突优化方法,对应相同的输入下(表2所示的指令),其时钟排布相关指令的分配,如图12所示。其实现原理与图11一样,此处不再说明。其中,区别在于,在clk14时刻,在对指令组F中存在冲突的目标指令(F2_2)进行处理时,此时剩余的空闲Bank为Bank0、Bank1、Bank4~Bank31,由于指令地址指向剩余的空闲Bank,且距离指令组F最近的一组指令为指令组H,且已经进入流水线,但是由于指令组H不存在Bank冲突,因此在clk14时刻,在对F2_2进行处理,则按照常规处理流程进行处理。
当pipe=4时(pipe=4,表示能同时容纳4条指令组),按照本申请实施例所示的存储体冲突优化方法,对应相同的输入下(表2所示的指令),其时钟排布相关指令的分配,如图13所示。其实现原理与图11一样,此处不再说明。
其中,通过图10-图13可以看出,当pipe=1时,处理完表2中的指令包需要26个clk,同一时刻流水线所能容纳的最大指令组达到一个;当pipe=2时,相同的输入下,只需19个clk,同一时刻流水线所能容纳的最大指令组只有2个;当pipe=3时,相同的输入下,只需19个clk,同一时刻流水线所能容纳的最大指令组达到3个;当pipe=4时,相同的输入下,只需19个clk,同一时刻流水线所能容纳的最大指令组达到4个。显然pipe的级数越大,同时纳入考量的指令越多。
下面将对在相同输入(表2所示的指令)下的第二种情况进行说明:
当pipe=2时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表2所示的指令)下,其时钟排布相关指令的分配,如图14所示。其与图11的主要区别在于:在clk5时刻,在对D0_0进行处理时,此时即使指令组E不存在Bank冲突,也会按照优先级顺序将指令组E中的指令分配给与该指令地址对应的空闲Bank进行处理,以及在clk17时刻,在对G3_5进行处理时,此时即使指令组H不存在Bank冲突,也会按照优先级顺序将指令组H中的指令分配给与该指令地址对应的空闲Bank进行处理。
当pipe=3时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表2所示的指令)下,其时钟排布相关指令的分配,如图15所示。与图12的主要区别在于:在clk5时刻,在对D0_0进行处理时,此时即使指令组E不存在Bank冲突,也会按照优先级顺序将指令组E中的指令分配给与该指令地址对应的空闲Bank进行处理。由于在clk5时刻,提前将指令组E中的指令分配给与该指令地址对应的空闲Bank进行处理,所以导致在clk6时刻,可以提前将指令组F中的指令分配给与该指令地址对应的空闲Bank进行处理。以及在clk12时刻,在对G3_2进行处理时,此时即使指令组H不存在Bank冲突,也会按照优先级顺序将指令组H中的指令分配给与该指令地址对应的空闲Bank进行处理。
当pipe=4时,按照本申请实施例所示的存储体冲突优化方法,对应相同的输入(表2所示的指令)下,其时钟排布相关指令的分配,如图16所示。与图13的主要区别在于:在clk5时刻,在对D0_0进行处理时,此时即使指令组E不存在Bank冲突,也会按照优先级顺序将指令组E中的指令分配给与该指令地址对应的空闲Bank进行处理。由于在clk5时刻,提前将指令组E中的指令分配给与该指令地址对应的空闲Bank进行处理,所以导致在clk6时刻,可以提前将指令组F中的指令分配给与该指令地址对应的空闲Bank进行处理。以及在clk7时刻,在对D0_2进行处理时,可以提前将指令组G中的指令分配给与该指令地址对应的空闲Bank进行处理。
以及在clk11时刻,在对G3_4进行处理时,此时即使指令组H不存在Bank冲突,也会按照优先级顺序将指令组H中的指令分配给与该指令地址对应的空闲Bank进行处理。
其中,通过图10、图14-图16可以看出,当pipe=1时,处理完表1中的指令包需要26个clk;当pipe=2时,相同的输入下,只需19个clk;当pipe=3时,相同的输入下,只需17个clk;当pipe=4时,相同的输入下,只需14个clk。显然pipe的级数越大,同时纳入考量的指令越多,Bank冲突导致的性能衰减愈能得到改善。
其中,图3-图16中右侧用灰度标记的部分为由于Bank冲突导致的stall状态。
结合表1对指令映射单元完成从指令的来源(crawler)到指令运行的目的地Bank的映射的过程进行说明,常规情况下,crawler的序号与Bank的序号一一对应,crawler0对应crawler0,而表1中,B0_1来源于crawler1,但是其指向目的crawler0,因此需要指令映射单元来完成这一映射。同理,在数据输出时,需要将Bank0输出的B0_1对应的数据与crawler1对应,而不是与crawler0对应,因此,需要数据映射单元来完成这一映射。
以下将结合具体例子对数据排序单元的排序过程进行说明,由于发生Bank冲突,导致同一个指令组的输出数据在时域上发生偏差,因此需要重新排序,如图6所示,以指令组D为例,由于指令组D发生Bank冲突,使得指令组D的数据跨越了6个时刻(clk4到clk9),当数据流水线单元暂存了从clk4到clk9时刻各个Bank的输出数据时,数据排序单元便可得到指令组D的全部输出结果,此时,便将指令组D的全部输出结果输出。
在介绍完图1所示的各模块在对存储体冲突优化的过程中所起的作用后,下面将结合图17,对本申请实施例提供的存储体冲突优化方法进行说明。
步骤S101:在对位于流水线最前端的当前指令组中存在Bank冲突的同一个Bank中的目标指令进行处理时,确定处理所述目标指令时剩余的空闲Bank。
其中,在确定处理所述目标指令时剩余的空闲Bank之前,需要将待处理指令包中的每一组操作指令按照优先级顺序依次输入所述流水线中。只有位于流水线中的指令组才会进行相应的处理及判断。
步骤S102:获取所述流水线中指令地址指向所述空闲Bank,且距离所述当前指令组距离最近的一个指令组,得到目标指令组。
步骤S103:按照优先级顺序将所述目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理。
作为一种实施方式下,在从流水线中获取到目标指令组后,在按照优先级顺序将所述目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理之前,需要先确定目标指令组存在Bank冲突。在该种是实施方式下,若目标指令组不存在Bank冲突,则按照常规处理流程处理目标指令。
其中,在整个处理过程中,只要当位于流水线最前端的当前指令组,达到最大流水线的位置,且当前指令组中存在Bank冲突的指令未处理完时,系统才停止新的指令组输入该流水线。在停止新的指令组输入流水线之后,当监测到位于最大流水线位置的当前指令组中存在Bank冲突的指令全部处理完时,便重新恢复指令组输入流水线。
此外,一种实施方式下,当对Bank进行读取操作时,在按照优先级顺序将目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理之后,所述方法还包括:对各个Bank的输出结果进行排序,待得到同一指令组的全部输出结果时,将该指令组对应的各个输出结果输出。
本申请实施例所提供的方法,其实现原理及产生的技术效果和前述装置实施例相同,为简要描述,方法实施例部分未提及之处,可参考前述装置实施例中相应内容。
如图18所示,图18示出了本申请实施例提供的一种的电子设备100的结构框图。所述电子设备100包括:收发器110、存储器120、通讯总线130以及并行处理器140。
所述收发器110、所述存储器120、并行处理器140各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线130或信号线实现电性连接。其中,收发器110用于收发数据。存储器120用于存储计算机程序,该计算机程序包括至少一个可以软件或固件(firmware)的形式存储于所述存储器120中或固化在所述电子设备100的操作系统(operating system,OS)中的软件功能模块。所述并行处理器140,用于执行存储器120中存储的可执行软件功能模块或计算机程序。例如,并行处理器140,用于在对位于流水线最前端的当前指令组中存在Bank冲突的同一个Bank中的目标指令进行处理时,确定处理所述目标指令时剩余的空闲Bank;获取所述流水线中指令地址指向所述空闲Bank,且距离所述当前指令组距离最近的一个指令组,得到目标指令组;按照优先级顺序将所述目标指令组中的指令分配给与该指令地址对应的空闲Bank进行处理。
其中,存储器120可以是,但不限于,随机存取存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(Programmable Read-OnlyMemory,PROM),可擦除只读存储器(Erasable Programmable Read-Only Memory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-Only Memory,EEPROM)等。
并行处理器140可能是一种集成电路芯片,具有信号的处理能力。上述的并行处理器可以是图形处理器GPU、或其他AI并行处理器。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。
其中,上述的电子设备100,包括但不限于智能手机、平板、计算机、服务器等。
本申请实施例还提供了一种非易失性计算机可读取存储介质(以下简称存储介质),该存储介质上存储有计算机程序,该计算机程序被计算机如上述的电子设备100运行时,执行上述所示的存储体冲突优化方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,笔记本电脑,服务器,或者电子设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。