一种针对GPU加速多步长前缀树的更新序列维护方法技术

技术编号:28034003 阅读:34 留言:0更新日期:2021-04-09 23:15
本发明专利技术涉及一种针对GPU加速多步长前缀树的更新序列维护方法,该方法包括以下步骤:创建第一数组和第二数组,以及设置第一变量;所述第一数组第i号单元初始化为i,所述第二数组则全置为0;所述第一变量,用来记录目前更新操作的次数,并且会初始化为0;当CPU收到一个针对GAMT第x号单元执行更新的操作,CPU则调整所述第一数组上的位置。本发明专利技术可以针对GAMT更新序列排序问题,将其排序时间复杂度降低到最差情况下O(n/8),并且往第一数组中插入新元素的时间复杂度为O(1)。

【技术实现步骤摘要】
一种针对GPU加速多步长前缀树的更新序列维护方法
本专利技术涉GPU加速的多步长前缀树更新技术,特别涉及一种针对GPU加速多步长前缀树的更新序列维护方法。
技术介绍
传统软件路由器的性能已经面临严峻的性能挑战。而他们的性能瓶颈又主要源自一些基本的包处理操作,比如IP查找,需根据目的IP地址在转发信息表中进行最长前缀匹配(LPM)。主流的LPM解决方案分为两大类。一般情况下,基于哈希的方案能实现相对较高的查找吞吐率,但是他们对高速存储资源的需求,以及由哈希冲突、假阳性带来的一系列问题制约了他们在大规模数据集或者新场景的应用。另一类则是通过引入树型结构(比如前缀树、平衡树等)来维护转发信息表,以提升方案的灵活性。虽然已经涌现出很多优化方案,但这类方案的性能依然难以与基于TCAM的快速查找表,或基于FPGA实现的查找流水线相提并论。幸运的是,GPU正逐渐发展成为新型的通用高性能计算平台。一些基于GPU加速的软件路由器可以实现非常高的吞吐率。要在这样的平台上工作并充分利用平台优势,IP查找引擎还面临着一系列挑战。比如性能、对大规模数据集或者是新协议、新应用的支持。然而现有工作要么是针对路由器的整体框架进行探索,要么就是研究多种包处理操作的综合性能提升。都没有讨论路由更新的处理。而实际应用种路由更新的峰值频率已超过每秒2万条1,且还在持续增长。如此高频的更新势必会与查找模块竞争资源进而影响查找性能。特别是在一些新型应用场景,比如虚拟化路由器、OpenFlow交换机等,更新都更加频繁。因此,在查找引擎的设计中不得不考虑更新开销。发表于ANCS-2013的文章《GAMT:AFastandScalableIPLookupEngineforGPU-basedSoftwareRouters》提出了一种基于GPU加速的多步长前缀树(GPU-AcceleratedMulti-bitTrie,GAMT),通过引入一种新型编码方案将多步长前缀树编码为一个二维数组形式的状态跳转表,并基于GPU的访存特点来进行结构优化。不仅能实现比GALE和TSET更快的IPv4地址查找,同时还支持高速IPv6地址查找。但是,在更新性能方面,GAMT还存在不足,没有根据GPU访问显存的特殊方式进行优化设计。因此,在实际部署中,即使查找性能达到较好的性能水平,但是面对规则频繁更新的场景,GAMT的整体性能将受限于其更新方式的不足。GPU在进行大规模并行计算时,采用的是一种叫做“单指令多线程”(即SIMT)模式,即将数据划分为多个部分,每个部分由一个线程负责。当线程在计算时,采用完全相同的计算函数(即核函数),以此达到并行计算的效果。此外,GPU将32个线程归为一组(即warp),因此GPU在进行计算的任务调度时,warp是最小的调度单元,总是以一个warp为单位进行计算任务分配和显存访问。不同于CPU的访问主存的模式,GPU中一个warp访问显存时,是以一种称之为存储事务(即MemoryTransaction)的形式进行的。具体而言,一个warp发起访存请求时,GPU会读入连续的若干字节显存数据。如果warp每个线程所分配的数据刚好位于连续存放,1次存储事务就能将warp中所有线程需要的数据都读取完毕,这将达到最佳的访存性能。图1给出了存储事务的示意图,图中我们假设一个warp包含3个线程(实际中包含32个线程),一次存储事务读取3个存储单元(实际中则是若干字节,如GAMT论文中采用的GPU设备一次存储事务读取128字节)。每个正方形块对应着一个显存单元,A1、A2、A3正方形块表示warp中线程需要访问的显存单元,其他正方形块则表示其他显存单元。左图可以看出,warp中3个线程所访问的显存单元刚好在显存上是连续分布的,一次存储事务(即图上的MTO)就可以读取完毕;而右图中,warp中3个线程所访问的显存单元并未集中分布,最终需要3个存储事务(即MT0,MT1和MT2)才能读取完毕,这样一来,左边的warp访存性能将明显优于右边,处理速度将明显快于右边的warp。考虑到访存位置对GPU处理速度的性能,GAMT目前的更新方式还存在以下不足,具体分析如下。GAMT的核心数据结构是多个长度相等的数组(一种数据连续存放的数据结构,如图1中的正方形块所示),而更新操作则是对数组上的某个或者多个存储单元进行数值。当运行在GPU上时,将有若干个warp执行这项操作,warp中每个线程负责修改一个GAMT存储单元。而具体要修改哪些存储单元,则是由CPU在GPU以外计算好并保存成一个数组,数组中每个存储单元里面存放的数值,对应中GAMT数组需要被修改的某个存储单元的索引号。换言之CPU将需要更新的GAMT存储单元序列传递GPU以便于后者执行更新。而这个序列是否排序,对GAMT的更新性能好坏至关重要。以图2为例,这里依然假设一个warp包含了3个线程,一个存储事务可以读取连续3个显存单元。假设CPU上不对更新序列进行排序操作,直接按更新发生的先后顺序发送给GPU,即GAMT更新序列是“0,5,8,1,2,7”,那么GAMT更新时warp的访存顺序如左图所示。首先,warp按照CPU发送的更系序列,需要更新“0,5,8”三个位置(即A正方形块对应的位置),这3个位置相对位置较远,需要3次存储事务才能读取完毕;接下来,warp需要更新“1,2,7”三个位置(即B正方形块对应的位置),如左图所示需要2次存储事务才能读取完毕。这样,左图中对应的更新方式需要总共5次存储事务。接下来看右图,它和左图需要更新的位置是一致的,但是在发送给GPU之前进行了排序,GAMT更新序列变为“0,1,2,5,7,8”。首先,如左图所示,warp首先处理“0,1,2”三个位置,容易发现这三个位置是连续的,一次存储事务刚好读取完毕。接下来更新“5,7,8”三个位置,容易发现需要2次存储事务。这样,为GAMT执行同样的更新,右图的更新方式需要3次存储事务,比左图少了2次,大幅度减少了存储事务的次数,这有利于整体性能的提升,可见排序操作对GAMT的更新性能有很大的影响。GAMT并未对更新方法设计高效的排序方法,因此当更新序列很长的时候,CPU将花费大量的时间去维护更新序列的顺序,这会带来很大的时间开销,这是GAMT更新方法最大的不足之处,这是本专利技术技术方案的所要解决的问题。
技术实现思路
本专利技术的目的,在于解决现有GAMT更新方法存在的上述所述的技术问题。为实现上述目的,本专利技术提供一种针对GPU加速多步长前缀树的更新序列维护方法,该方法包括以下步骤:创建第一数组和第二数组,以及设置第一变量;所述第一数组第i号单元初始化为i,所述第二数组则全置为0;所述第一变量,用来记录目前更新操作的次数,并且初始化为0;当CPU收到一个针对GAMT第x号单元执行更新的操作,CPU需要调整所述第一数组上的位置,具体调整方法的流程如下:根据i=x/8,得到x对应的bitmap比特位于第二数组的i号单元里面,再用j=x%8,判断第二数组[i]中的第j个比特是否是1;如果该比特是1,那么表示前面已经收到过本文档来自技高网
...

【技术保护点】
1.一种针对GPU加速多步长前缀树的更新序列维护方法,其特征在于,包括以下步骤:/n创建第一数组和第二数组,以及设置第一变量;所述第一数组第i号单元初始化为i,所述第二数组则全置为0;所述第一变量,用来记录目前更新操作的次数,并且初始化为0;/n当CPU收到一个针对GAMT第x号单元执行更新的操作,CPU需要调整所述第一数组上的位置,具体调整方法的流程如下:/n根据i=x/8,得到x对应的bitmap比特位于第二数组的i号单元里面,再用j=x%8,判断第二数组[i]中的第j个比特是否是1;如果该比特是1,那么表示前面已经收到过了一个针对GAMT的x号单元的更新操作,因此这个更新操作会被忽略;否则,说明之前没有收到过针对GAMT数组x号单元的更新操作,进入以下步骤;/n所述第一数组[x]=x,假如第一数组[第一变量]=y,则交换第一数组[x]和第一数组[第一变量]的位置,使第一数组[x]=y,第一数组[第一变量]=x,接着进入以下步骤;/n因为第一数组上的单元位置发生了变化,则调整第二数组[i]上的j比特为1,进入以下步骤;/n更新第一变量的数值,使第一变量=第一变量+1,表示当前增加了一次更新操作。/n...

【技术特征摘要】
1.一种针对GPU加速多步长前缀树的更新序列维护方法,其特征在于,包括以下步骤:
创建第一数组和第二数组,以及设置第一变量;所述第一数组第i号单元初始化为i,所述第二数组则全置为0;所述第一变量,用来记录目前更新操作的次数,并且初始化为0;
当CPU收到一个针对GAMT第x号单元执行更新的操作,CPU需要调整所述第一数组上的位置,具体调整方法的流程如下:
根据i=x/8,得到x对应的bitmap比特位于第二数组的i号单元里面,再用j=x%8,判断第二数组[i]中的第j个比特是否是1;如果该比特是1,那么表示前面已经收到过了一个针对GAMT的x号单元的更新操作,因此这个更新操作会被忽略;否则,说明之前没有收到过针对GAMT数组x号单元的更新操作,进入以下步骤;
所述第一数组[x]=x,假如第一数组[第一变量]=y,则交换第一数组[x]和第一数组[第一变量]的位置,使第一数组[x]=y,第一数组[第一变量]=x,接着进入以下步骤;
因为第一数组上的单元位置发生了变化,则调整第二数组[i]上的j比特为1,进入以下步骤;
更新第一变量的数值,使第一变量=第一变量+1,表示当前增加了一次更新操作。


2.根据权利要求1所述的方法,其特征在于,创建辅助表,该辅助表是把1个8bit的bitmap所有可能的数值,对应的GAMT索引信息;所述第一数组元素都是一个小bitmap,第一数组[i]对应着GAMT的i*8到i*8+7号单元的更新情况。


3.根据权利要求1所述的方法,其特征在于,第一数组中每个单元可以共用所述辅助表,每个第一数组[i]在根据所述辅助表得出GAMT索引号之后,还需要在每个索引号的基础上偏移获取正确的GAMT索引号。
...

【专利技术属性】
技术研发人员:李彦彪谢高岗许可
申请(专利权)人:中国科学院计算机网络信息中心
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1