一种实现多引擎并行处理器中数据包排序的方法
技术领域
本发明涉及多引擎并行处理器技术领域,特别是指一种实现多引擎并行处理器中数据包排序的方法。
背景技术
多引擎并行处理器为突破单引擎处理能力的局限性提供了解决方案。在理论上,如果不考虑接口的速度、硬件实现的资源量等因素,多引擎并行处理器的处理能力可以是无限的。在实际应用中,多引擎并行处理器通常在结构上划分为多个负载层次,每个负载层次又分为多个负载通路,最底层的每个负载通路上分别有一个包文处理引擎(PE),这些引擎可以并行工作。假设负载总层次为N,任一个层次用n表示,该n满足1≤n≤N。每一层共有m个负载通路,则从第一层到第n层的负载通路数依次为m1、m2......mn,则引擎的总数P为P=m1×m2×......×mn。
为方便说明,以下先定义几个概念的缩写:
层n的负载均衡模块(Layer n Load Balance Unit),缩写为LnBU;
层n的输入缓存模块(Layer n Input Cache Unit),缩写为InCU;
层n的负载收集模块(Layer n Load Pooling Unit),缩写为LnPU;
层n的输出缓存模块(Layer n Output Cache Unit),缩写为OnCU。
下面以n=2,m1=2,m2=4,P=8为例进行说明。
参见图1,图1所示为8引擎并行处理器结构示意图。包文在该多引擎并行处理器中的数据流为:
1.层1负载均衡模块(L1BU,Layer 1 Load Balance Unit)根据负载均衡或循环复用(Round Robin)的仲裁策略将输入的数据包分配到两个层1输入缓存模块(I1CU,Layer 1 Input Cache Unit)。
2.两个I1CU分别负责各自负载通路的数据输入缓存。
3.两个层2负载均衡模块(L2BU,Layer 2 Load Balance Unit)分别根据负载均衡或循环复用(Round Robin)的仲裁策略将各自负载通路的数据包分配到四个层2输入缓存模块(I2CU,Layer 2 Input Cache Unit)中,每个I2CU对应一个包文处理引擎(PE,Packet Engine)。也就是说,每个L2BU将各自负载通路的数据包分配到四个PE中。
4.PE从I2CU中获取待处理的数据包文,处理完成后将数据包文存放在层2输出缓存模块(O2CU,Layer 2 Output Cache Unit)中。
5.每个层2负载收集模块(L2PU,Layer 2 Load Pooling Unit)分别从各自负载通路上的四个O2CU中收集四个包文处理引擎的输出数据包,并按照一定的顺序依次输出到层1输出缓存模块(O1CU,Layer 1 Output CacheUnit)内。
6.O1CU分别负责各自负载通路的数据输出缓存。
7.L1PU收集两个O1CU的输出数据包,并按一定的顺序依次输出。
从上述处理过程中可以看出,由于L1BU和L2BUi(其中i为0和1)在将数据包文分发到各个引擎时不考虑包文的顺序;且由于每个包文处理引擎的负载不可能完全一样,按顺序分配到各个引擎的数据包,其处理完成的顺序也无法保证。因此经过多引擎并行处理器处理完成后输出的数据包,将无法保证逻辑序。
现有的保证多引擎并行处理器中数据包逻辑序的实现方法如下:
在数据包进入多引擎并行处理器前,使用排队机(一般用软件实现)在数据包中插入顺序标记,多引擎并行处理器内各个处理模块必须对该标记进行透传。当数据包经过多引擎并行处理器处理完毕输出后,再使用排队机查询数据包中的标记,根据标记对数据包进行排序。
由于排队机的存在,现有的实现方法必然存在以下缺陷:
1.由于使用单独的排队机实现数据包排序,会额外占用系统资源;
2.如果排队机无法及时完成多引擎并行处理器输出的数据包的排序,将造成系统的拥塞,影响多引擎并行处理器的计算效率;
3.应用排队机实现数据包排序的过程中,需要将顺序靠后,但先处理完成的数据包全部进行缓存,需要占用系统大量的共享内存。
发明内容
有鉴于此,本发明的目的在于提供一种实现多引擎并行处理器中数据包排序的方法,以解决多引擎处理中的数据包排序问题。
为达到上述目的,本发明的技术方案是这样实现的:
一种实现多引擎并行处理器中数据包排序的方法,所述多引擎并行处理器包含一层以上的负载均衡模块LBU,且每个LBU对应一个负载收集模块LPU,该LPU与所对应的LBU处于同一层次,
在多引擎并行处理器中,预设一个以上用于记录标记信息的序列,且每个序列与一个LBU一一对应;
所述LBU执行以下处理步骤:
A、LBU接收到待处理数据包,根据预设的分发原则将接收到的待处理数据包分发到下一层的处理模块中,并将所分发的数据包进行标记,以指示该数据包所在负载通路,且将该标记记录在与该LBU所对应的序列中;
B、该LBU判断其所对应的序列中记录信息的个数是否达到预设的用于流控数据包个数的阈值,如果是,则停止分发操作,然后重复执行步骤B,否则,重复执行步骤A;
所述与每个LBU对应的且与所对应的LBU处于同层的负载收集模块LPU,执行以下处理步骤:
a、LPU判断与其对应的LBU所对应的序列中记录信息的个数是否为非空,如果是,执行步骤b;否则重复执行步骤a;
b、LPU从该序列中顺序读取的一个标记信息,根据该标记信息获取对应数据包所在位置,打开该位置所对应的输出通道,等待一个完整的数据包通过,且只允许一个数据包通过,然后重复执行步骤a,直至所有包文输出完毕。
较佳地,如果所述LBU为非最底层的LBU,则步骤A所述下一层的处理模块为下一层的LBU;如果所述LBU为最底层的LBU,则步骤A所述下一层的处理模块为包文处理引擎PE。
较佳地,如果所述负载均衡模块LBU为最高层的LBU,步骤B所述用于流控数据包个数的阈值为数据输入端口的数据包个数流控阈值;如果所述负载均衡模块LBU为非最高层的LBU,则步骤B所述用于流控数据包个数的阈值为负载通路的数据包个数流控阈值。
较佳地,所述序列的宽度Bn为
Bn=[log2(mn)],其中,[]表示进1取整运算,mn为LBU对应的下一层的负载通路数;
最高层的LBU所对应的序列的深度为数据输入端口的数据包个数流控阈值;
非最高层LBU所对应的序列的深度为该层LBU所对应的上一层负载通路的数据包个数流控阈值。
较佳地,所述数据输入端口的数据包个数流控阈值的确定方法为:
首先计算多引擎并行处理器缓存空间的大小,然后应用该缓存空间大小的值除以最小包文的长度值,获得可容纳的最大包文个数,再根据该最大包文个数以及预设的策略确定数据输入端口的数据包个数流控阈值。
较佳地,所述计算多引擎并行处理器缓存空间的大小的方法为:计算该多引擎并行处理器中所有输入缓存模块ICU和输出缓存模块OCU的缓存空间的总和。
较佳地,所述负载通路的数据包个数流控阈值的确定方法为:
首先计算该负载通路中所有缓存空间的大小,然后应用该缓存空间大小的值除以最小包文的长度值,获得可容纳的最大包文个数,再根据该最大包文个数以及预设的策略确定负载通路的数据包个数流控阈值。
较佳地,所述计算负载通路中所有缓存空间大小的方法为:计算该负载通路中所有输入缓存模块ICU和输出缓存模块OCU的缓存空间的总和。
较佳地,所述预设的策略为根据资源开销和/或对缓存效率的影响,确定流控阈值。
较佳地,所述序列由先进先出FIFO缓冲器承载。
较佳地,所述预设的分发原则包括但不限于负载均衡策略或循环复用(Round Robin)仲裁策略。
本发明的关键是,在数据流的分发过程中产生标记的编码,并保存为一个序列,在数据流的收集过程中对保存在序列中的标记依次解码,选中与该标记相对应的引擎通道或负载通道,依次输出对应的一个完整的数据包,且只允许一个数据包输出。从而解决了对输出数据包的排序。
应用本发明,具有以下优点:不需要使用单独的排队机实现数据包排序,减小了系统资源开销;同时,由于排序功能与多引擎并行处理器结合,将排序对并行处理的效率影响降到最小,并降低了系统拥塞的可能性;多引擎并行处理器能够保证数据包的逻辑序,不需要大量占用系统的共享内存。
附图说明
图1所示为8引擎并行处理器结构示意图;
图2所示为应用本发明的8引擎并行处理器结构的编码示意图。
具体实施方式
下面结合附图及具体实施例,再对本发明做进一步地详细说明。
本发明的思路是:在数据流的分发过程中产生标记的编码,并保存为一个序列,在数据流的收集过程中对保存在序列中的标记依次解码,选中与该标记相对应的引擎通道或负载通道,依次输出对应的一个完整的数据包,且只允许一个数据包输出。从而完成对输入数据包的标记和输出数据包的排序。
为了保证按照预定的顺序依次输出各引擎处理的数据包,必须对输入的数据包在各LnBU分发到各个负载通路或PE前进行唯一标记。在LnPU再按照预先做好的标记控制输出包文的顺序。
这里“唯一标记”的含义是指,在极限情况下多引擎并行处理器即芯片中所能同时容纳的包文必需具有各自区别的标记,“唯一标记”的个数即为多引擎并行处理器中同时容纳的包文的最大个数。该“最大个数”已经是多引擎并行处理器所能容纳的极限了。通常,为了减少缓存的长度,需要对数据包个数进行流控,而进行流控就需要设置一个合理的流控阈值,以减少流控对缓存效率的影响。
在本发明中定义了两类流控阈值:一类是数据输入端口的数据包个数流控阈值,其是用于流控输入多引擎并行处理器的数据流,因此该类阈值就一个;另一类是负载通路的数据包个数流控阈值,其是用于流控输入各个负载通路中的数据流,因此该类阈值有多个,其个数与多引擎并行处理器中实际的负载通路的个数相同。下面分别说明两类阈值的设置过程。
设置数据输入端口的数据包个数流控阈值的过程为:首先计算多引擎并行处理器的缓存空间的大小,然后应用该缓存空间大小的值除以最小包文的长度值,获得最多可容纳的最大包文个数,再根据该最大包文个数以及预设的策略确定数据输入端口的数据包个数流控阈值。上述计算多引擎并行处理器缓存空间的大小的方法为:计算该多引擎并行处理器中所有输入缓存模块(ICU)和输出缓存模块(OCU)的缓存空间的总和。上述预设的策略为根据资源开销和/或对缓存效率的影响来确定流控阈值。
仍以n=2,m1=2,m2=4,P=8为例,参见图1,如果每个I1CU和O1CU的缓存空间大小为8Kbyte和9Kbyte,每个I2CU和O2CU的缓存空间大小为2Kbyte,那么,多引擎并行处理器缓存空间的大小,即整个芯片的缓存空间大小=每个I1CU的缓存空间大小×个数+每个O1CU的缓存空间大小×个数+每个I2CU的缓存空间大小×个数+O2CU的缓存空间大小×个数=8×2+9×2+2×8+2×8=66Kbyte,假设在极限情况下所有的包文长度为64字节的小包,则多引擎并行处理器中同时容纳的包文的个数为66Kbyte/64byte,约为1000。在此,根据预定策略设置数据输入端口的数据包个数流控阈值为256。也就是说,当多引擎并行处理器中同时容纳的个数达到256时,必须对输入的数据包进行流控。
设置负载通路的数据包个数流控阈值的过程为:首先计算该负载通路中所有缓存空间的大小,然后应用该缓存空间大小的值除以最小包文的长度值,获得最多可容纳的最大包文个数,再根据该最大包文个数以及预设的策略确定负载通路的数据包个数流控阈值。上述计算负载通路中所有缓存空间大小的方法为:计算该负载通路中所有ICU和OCU的缓存空间的总和。上述预设的策略为根据资源开销和/或对缓存效率的影响来确定流控阈值。
仍以n=2,m1=2,m2=4,P=8为例,参见图1,如果每个I2CU和O2CU的缓存空间大小为2Kbyte,那么,每个负载通路中所有缓存空间的大小=每个I2CU的缓存空间大小×个数+O2CU的缓存空间大小×个数=2×4+2×4=16Kbyte,假设在极限情况下所有的包文长度为64字节的小包,则该负载通路中同时容纳的包文的个数为16Kbyte/64byte=256个包。在此,根据预定策略设置负载通路的数据包个数流控阈值为100。也就是说,当负载通路中同时容纳的个数达到100时,必须对输入该负载通路的数据包进行流控。
众所周知,多引擎并行处理器通常包含一层以上的负载均衡模块(LBU),且每个LBU对应一个负载收集模块(LPU),该LPU与所对应的LBU处于同一层次。为了叙述方便,在本申请中,将用于从引擎并行处理器外部接收数据流的LBU称为最高层的LBU,将用于给PE分配数据流的LBU称为最底层的LBU。
最高层的LBU用于流控输入多引擎并行处理器的数据流,也即用于流控数据包个数的阈值为数据输入端口的数据包个数流控阈值;非最高层的LBU用于流控输入各个负载通路中的数据流,也即用于流控数据包个数的阈值为负载通路的数据包个数流控阈值。
每个数据包在多引擎并行处理器中有P种可能的去向,即P个引擎中的一个。负载层次n中m个负载通路按0~mn编号,则负载层次n的编码位数Bn为
Bn=[log2(mn)]
其中[]表示进1取整运算,即当小数位不为0时固定进1。将所有负载层次的编码Bi按次序组合即得到标记的编码。
下面仍以n=2,m1=2,m2=4,P=8为例,对编码进行说明。参见图2,图2所示为应用本发明的8引擎并行处理器结构的编码示意图。本例中,每个数据包在该多引擎并行处理器中只有8种可能的去向,即8个PE中的一个。
L1BU将输入数据包分发到两个负载通道时,有两个选择,此时,L1BU记录标记的编码位数B1=[log2(m1)]=[log22]=1,编码为1bit数据,由此产生标记的第一比特位。也就是说,用0和1来区分两个负载通道。参见图2,如果分发到负载通道0,则标记为1’b0,如果分发到负载通道1,标记为1’b1。并且,依次将对应每个数据包的该标记位保存在一个序列中,并将该序列定义为S_load11。该序列S_load11的宽度为B1,即在本例中该序列的宽度为一,该序列S_load11的最大深度为数据输入端口的数据包个数流控阈值。
L2BU0将负载通路0的数据包分配到四个包文处理引擎中时,有四个选择,此时,L2BU0记录标记的编码位数B2=[log2(m2)]=[log24]=2,编码为2bit数据,由此产生标记的第二、三比特位。参见图2,分发到4个PE的标记分别标记为2’b11、2’b10、2’b01、2’b00。并且,依次将对应每个数据包的该标记位保存在一个序列中,并将该序列定义为S_load21。序列S_PE0的宽度为B2,即在本例中该序列的宽度为二,最大深度为负载通路0中同时容纳的包文的最大个数,即负载通路0所对应的负载通路的数据包个数流控阈值。
L2BU1与L2BU0处于同一层次且其所处环境也与L2BU0相同,因此其处理过程与L2BU0也是相同的。即L2BU1将负载通路1的数据包分配到四个包文处理引擎中时,有四个选择,编码为2bit数据,由此产生标记的第二、三比特位。依次将对应每个数据包的该标记位保存在一个序列中,并将该序列定义为S_load22。序列S_PE1的宽度为二,最大深度为负载通路1中同时容纳的包文的最大个数,即负载通路1所对应的负载通路的数据包个数流控阈值。
由此可以看出,最高层的LBU所对应的序列的深度为数据输入端口的数据包个数流控阈值;非最高层LBU所对应的序列的深度为该层LBU所对应的上一层负载通路的数据包个数流控阈值。
从上述处理过程中可看出,为了实现排序,在多引擎并行处理器中要预设一个以上用于记录标记信息的序列,且每个序列与一个LBU一一对应;这样也就形成了LBU、LPU以及序列三者的一一对应的关系。其中,序列S_load脚标用nk表示:n为负载层次,K为本层中LBU的总个数,该层次中的某一个用k表示,该k满足1≤k≤K。
有了上述准备工作后,下面具体说明对数据包进行排序的过程:
多引擎并行处理器中的LBU执行以下处理步骤:
A、LBU接收到待处理数据包,根据预设的分发原则,如负载均衡策略或循环Round Robin仲裁策略等,将接收到的待处理数据包分发到下一层的处理模块中,并将所分发的数据包进行标记,以指示该数据包所在负载通路,且将该标记记录在与该LBU所对应的序列中;
B、该LBU判断其所对应的序列中所记录的个数是否达到预设的用于流控数据包个数的阈值,如果是,则停止分发操作,然后重复执行步骤B,否则,重复执行步骤A;
上述LBU如果为非最底层的LBU,则上述步骤A中所述的下一层的处理模块为下一层的LBU;上述LBU如果为最底层的LBU,则步骤A中所述下一层的处理模块为PE。
多引擎并行处理器内与每个LBU对应的且与所对应的LBU处于同层的LPU,执行以下处理步骤:
a、LPU判断出与其对应的LBU所对应的序列中的记录信息为非空后,执行步骤b;
b、LPU从该序列中顺序读取的一个标记信息,根据该标记信息获取对应数据包所在位置,打开该位置所对应的输出通道,等待一个完整的数据包通过,且只允许一个数据包通过,然后重复执行步骤a,直至所有包文输出完毕。
下面仍以n=2,m1=2,m2=4,P=8为例进行说明,参见图1和图2,。
L1BU将输入数据包分发到两个负载通道时对数据包进行第一次标记,同时顺序将数据包的标记写入序列S_load11中。当序列S_load11中所记录的个数达到预设的数据输入端口的数据包个数流控阈值,即序列S_load11为满时,L1BU停止分发数据包,从而实现流控芯片的数据输入端口。
L2BU0将负载通路0的数据包分配到四个包文处理引擎中时对数据包进行第二次标记,同时顺序将数据包的标记写入序列S_load21中。当序列S_load21为满即达到负载通路0所对应的负载通路的数据包个数流控阈值时,停止分发数据包,流控负载通路0的数据输入。
L2BU1将负载通路1的数据包分配到四个包文处理引擎中时对数据包进行第二次标记,同时顺序将数据包的标记写入序列S_load22中。当序列S_load122为满即达到负载通路1所对应的负载通路的数据包个数流控阈值时,停止分发数据包,流控负载通路1的数据输入。
当L2PU0判断出序列S_load21中记录的信息为非空时,L2PU0按顺序从序列S_load21中读取标记信息,通过对标记的解码获取对应该标记的包文的位置信息,比如标记为2’b01,表示最近需要通过的包位于通道1,L2PU0预先打开从引擎1到负载通道0的通道,等待一个完整的数据包通过,且只允许一个数据包通过后,依次打开下一个包文通过的通道,直至负载通道0中的所有包文通过L2PU0输出。
当L2PU1判断出序列S_load22中记录的信息为非空时,L2PU1按顺序从序列S_load22中读取标记信息,通过对标记的解码获取对应该标记的包文的位置信息,比如标记为2’b01,表示最近需要通过的包位于通道1,L2PU1预先打开从引擎1到负载通道1的通道,等待一个完整的数据包通过,且只允许一个数据包通过后,依次打开下一个包文通过的通道,直至负载通道1中的所有包文通过L2PU1输出。
当L1PU判断出序列S_load11中记录的信息为非空时,L1PU按顺序从序列S_load11中读取标记信息,通过对标记的解码获取对应该标记的包文的位置信息,比如标记为2’b1,表示最近需要通过的包位于负载通道1,L1PU预先打开从负载通道1到芯片输出端口的通道,等待一个完整的数据包通过,且只允许一个数据包通过后,依次打开下一个包文通过的通道,直至该多引擎并行处理器中的所有包文通过L1PU输出。
上述序列S_load11、序列S_load21和序列S_load22分别由一个先进先出FIFO缓冲器承载。
以上所述实施例均是以n=2,m1=2,m2=4,P=8为例进行说明,在实际应用中,负载的层次包括n=2、3、4、5......,但不限于上述值;每一层的负载通路数包括m=2、3、4、5......,但也不限于上述值。
再有,本发明所述的实现多引擎并行处理器中数据包排序的方法,并不仅仅适用于图1所示结构的多引擎并行处理器,对于其他结构的多引擎处理器,只要其存在多层次多通路的结构,就同样适用。
本发明所述的较佳实施例并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。