一种基于GPU的动态图着色方法与流程

文档序号:17628291发布日期:2019-05-10 23:53阅读:426来源:国知局
一种基于GPU的动态图着色方法与流程

本发明属于大图数据处理领域,尤其涉及一种基于gpu的动态图着色方法。



背景技术:

图着色问题是图论中的一个经典问题。图着色的现实意义是为具有某种特定关系的两个事物标记不同的颜色,在图中则表示为任意具有公共边的结点都具有不同的颜色。图着色是许多图应用中的重要组成部分,并且已被广泛用于图分割和计算调度应用中。许多图形应用程序的第一步就是通过图形着色来获得用于后续并行计算的独立顶点集合。图着色问题同时还是一个重要的组合优化问题,广泛存在于管理科学、计算机科学、分子物理学、生物学等各个领域。因此,探究图着色问题对解决各种实际问题有着重要意义。

目前在动态图下图着色方法大致可以有两种rc_local与rc_orient。rc_local方法可以以增量形式实现动态图着色,无需在图动态更新时,重复进行整个图的着色计算,可以得到较好的着色效率,但该方法是从局部考虑结点的颜色变化的,这会存在两个缺点:一是着色质量较差,即着色结果会包括更多的颜色;二是着色结果不一致性,对于同样的一批更新,当图的更新顺序发生变化时,会得到不同的着色结果。而rc_orient通过定义有向图的方法,从全局角度实现了动态图的着色更新,有效的解决了rc_local的两个缺点,但rc_orient的串行化执行使着色效率不稳定,收敛速度较慢。不论是rc-local还是rc-orient都没有兼顾着色质量和着色速度,本专利这种先分区再利用gpu并行计算性能的方法可以在保证正确性和着色质量的前提下提高着色速度,通常可以较容易的适用于动态图着色的计算中。

现实世界的很多图形是高度动态变化的,图着色的静态处理已经无法完全满足实际应用中的需要,近年来,动态图着色可应用的场景越来越广泛。图着色问题是图论中一个经典的np-完全问题,即多项式复杂程度的非确定性问题。所有的图着色问题均可以等价于图顶点着色问题来解决,求解图顶点着色问题的算法主要有精确算法和近似算法两种类型。完全算法是基于严格的数学方法搜索问题的整个解空间,求解问题的算法时间复杂度比较大,在问题规模比较大时很难在一个满意的时间内求出结果,因此完全算法常用来求解问题规模比较小的图的着色问题。常用的完全算法有穷举法、回溯法等。

通常认为动态图着色是给定一个图g,当图g随着边、点的插入或删除而发生更新时,动态计算图的近似最优着色。在动态图模型下,动态图着色问题在现实中也有着非常广泛的应用,例如利用图着色设计频谱分配方案,提高频谱利用效率;结合图着色技术来计算面向对象程序的动态切片;将动态约束匹配融入基于顶点的图着色方法求解大学课程时间表问题等,由此动态图着色问题将带来新的挑战。

现有的图着色方法在动态图下不能很好的解决问题主要是由于三点原因。第一点原因是目前大部分的图着色方法都是基于静态图模型着色的。在频繁更新的动态图中,当对图进行更新(结点的增删或边的插入与删除)时,原始图的着色结果很有可能已经不满足着色算法的要求,这就引出了动态图着色问题。解决该问题最朴素的方法是对更新后的图进行重新着色,很显然,相对于更新,重着色的时间代价过大,我们需要提出更简便的方法。第二点原因是由于图更新是一个无限的、不断接收的序列,而目前基于图着色的方法是根据待处理队列的顺序依次做计算,因此并行地计算频繁的更新,影响着色的效率;第三点原因传统的rc_local是通过访问结点的两层邻居来减少整个图更新的颜色的增加,时间复杂度为o(dmax2),拥有高效率和良好的着色质量,然而该方法还存在着一定的缺点,主要有两方面:(1)在插入或删除边时,只考虑了结点的邻居,即局部颜色状态,没有从全局角度(整个图)进行考虑,在降低色数方面还有提高的可能;(2)着色结果的不一致性。对于同样的批量更新,如果边的插入或删除顺序不同,得到的着色结果是不同的,算法缺乏健壮性;(3)不适用于并行性计算。结点的重着色过程中,在对结点邻居的访问中,除了读操作,还有写操作,若两个线程的结点存在相同的邻居,就有可能出现对同一个邻居的冲突访问问题,即两个线程对同一个邻居结点进行更改,顺序不同,结果不同,正确性得不到保障。虽然由于图的稀疏性,在动态图着色中需要的颜色数被证明并不会这么大,但是对于在目前的效率较高基于结点饱和度的着色更新,或者是基于全局结构的着色更新算法来说如何能够快速处理图更新和保证图着色质量也将是一个非常大的挑战。总的来说,目前基于动态图着色的方法无法快速高质量的解决动态图上的频繁更新,这就迫切的需要用新的方法与技术来迎接动态图着色问题的挑战。



技术实现要素:

为了克服现有技术的不足,本发明提供了一种基于gpu的动态图着色方法。具体包括以下步骤:

步骤1:将原始无向图g有向化,转化成定向图g*;

首先为每个结点的邻居结点定义顺序,将度数大于该结点的邻居置于它的左侧,称为内邻,度数小于该结点的邻居置于它的右侧,称为外邻,度数相同时,结点id小的置于左侧。定义符号‘≮’表示该关系,定义为,内邻结点≮该结点≮外邻结点,内邻结点用集合nbr-()表示,外邻结点用nbr+()表示。

步骤2:将多次删除、插入操作进行批量合并后更新定向图g*。图的更新有四种方式:增加结点、删除结点、增加边、删除边,把增删结点问题转化为增删边的问题进行处理。对批量的更新进行整合;

步骤3:利用压缩稀疏行csr方式存储定向图的外邻信息,压缩稀疏列csc方式存储定向图的内邻信息,并将外邻信息与内邻信息分别传输到gpu全局内存上;

步骤4:判断队列是否低于阈值,若否,则利用贪婪着色方法对待更新结点构成的子图进行分区,把分区结果传输至gpu端;若是,则交由cpu端处理;

步骤4.1:利用贪婪着色方法在cpu端对待处理队列中的结点进行分区,划分为n个分块,前(n-1)个分区内部的结点互不相邻,第n个分区内允许存在相邻的结点;

步骤4.2:将步骤4.1中的前(n-1)个分区结点分别传输到gpu全局内存上,第n个分区保存在cpu端。

步骤5:根据步骤4的分区结果并行地对每个区内的结点进行rc-hybrid(recolor-hybrid)着色。

步骤5.1:gpu每个线程处理当前分区的一个结点,设立长度为该结点入度值加一的数组,利用csc矩阵收集对应结点的内邻颜色,如果颜色不大于当前结点的入度值,则把颜色值在数组中的对应位置置为1。

步骤5.2:根据步骤5.1中的数组,从数组的起始位置开始递增地找第一个为0的位置,该位置所对应的数组下标即为当前结点所需分配的颜色。

步骤5.3:设立一个长度为待处理结点数量的数组作为下轮待处理结点队列,gpu线程利用csr矩阵把当前结点所有外邻在数组中的对应位置置为1,当gpu上的前(n-1)个分区处理完成后,同时作为多个结点外邻的某一结点只需下次被重新着色一次,达到去重的目的,再把这个数组最后传回cpu,和cpu端第n个分区合并,作为下轮待更新队列,重复步骤4,直到队列低于阈值后,交由cpu端处理。

有益技术效果:

1)传统的图着色解决方案都是基于静态图的,近年来逐渐出现了对动态图着色问题的增量处理方法,而本专利第一次提出了基于gpu的动态图着色问题,并且针对这个问题给出了一定的解决方案,通过对图的动态更新进行批量处理来充分利用gpu并行处理能力;

2)为适应gpu的高并发性且保证着色结果的正确性,应用了混合分区思想,在cpu端对待处理结点进行混合分块设计,在gpu端实现块内并行、块间串行的高效计算。

3)设计基于cpu-gpu异构的动态着色方法,应用全局思想在动态图着色计算的同时保证着色结果的一致性,并从并行性设计、内核融合、数据放置等方面对算法进行优化;

附图说明

图1为本发明实施例的图着色示意图;

图2为本发明实施例的无向图(a)、无向图邻接矩阵(b)及无向图csr存储格式(c);

图3为本发明实施例的数据传输示意图;

图4为本发明实施例的gpu处理前的数据准备示意图。

图5为本发明实施例的(a)原无向图;(b)转化后的定向图;

图6为本发明实施例的批量处理示意图;

图7为本发明实施例的csr存储结构;

图8为本发明实施例的gpu端分区间串行、分区内并行示意图;

图9为本发明实施例的异构动态图着色流程图;

图10为本发明实施例的顶点重着色和向外邻传播;

图11为本发明实施例的队列未分区前的串行化执行过程图;

图中thread为线程,p1-pn-1为分区,v0-v11为图形顶点数量;

具体实施方式

下面结合附图和具体实施实例对发明做进一步说明:

如图1所示,为利用本发明方法的着色示意图;

步骤1:首先为每个结点的邻居结点定义顺序,将度数大于该结点的邻居置于它的左侧,称为内邻,度数小于该结点的邻居置于它的右侧,称为外邻,度数相同时,结点id小的置于左侧。定义符号‘≮’表示该关系,定义为,内邻结点≮该结点≮外邻结点,内邻结点用集合nbr-()表示,外邻结点用nbr+(),如图4中的预处理过程与如图5所示为原始无向图g有向化,转化成定向图g*。

步骤2:如图4中批量更新过程和图6所示,其中qx(x=1、2、3...)代表更新操作,△t为自定义长度的一段时间,将一系列删除、插入操作进行批量合并后更新定向图g*。图的更新有四种方式:增加结点、删除结点、增加边、删除边,把增删结点问题转化为增删边的问题进行处理。对图的更新进行批量处理时,可以根据图的不同更新情况设置不同的限定阈值的标志,如果图的更新较频繁、更新量较大,在1s内可能有几千或是几万条边的更新,此时可以将时间设置为批量处理的划分标志,若图的更新较缓慢、更新量较小,此时为了充分利用gpu的计算能力,可以将更新数量作为批量处理的控制标志。基于gpu的动态图着色,优势是利用gpu强大的计算能力,所以我们把研究重点放在更新较频繁、更新量较大的动态图上。批量处理的另一个优势是可以对批量的更新进行整合,会减少重复性更新,也可以避免不必要更新,比如第i个更新是插入<u,v>,第j个更新是删除<u,v>,经过批量处理的整合后无需处理<u,v>边。

步骤3:如图2所示,本发明选择压缩稀疏行csr方式存储定向图的外邻信息,压缩稀疏列csc方式存储定向图的内邻信息,并分别传输到gpu全局内存上。

利用csr方式对图进行存储既可以满足良好的空间占用率,又便于着色计算时对邻居结点的访问。该存储格式将原始矩阵转化为三个数组,如图2(c)所示,第一个val数组,数组中元素个数为储存定向图的矩阵中非零元素的个数(用m表示),用来保存矩阵a的非零元素。第二个col_ind数组,数组中元素个数为矩阵a的非零元素的个数(仍为m),保存val数组中元素的列索引。第三个row_ptr数组,数组中元素个数为矩阵a的行数,表示为(n+1),保存矩阵a的每行第一个非零元素在val中的索引,该存储格式可以节省大量空间,只需要存储(2m+n+1)个存储单元,在稀疏图中可以普遍达到较好的压缩率。对于结点邻居的访问方式,以图2的无向图为例,图2(b)为其邻接矩阵,转化为压缩存储行(csr)的格式如图2(c)所示。若要找到结点2的邻居结点,row_ptr[2]<=k<row_ptr[3]-1,k为2结点的邻居在col_ind[]中的位置,根据图2(c)可知5<=k<7,col_ind[k]={0,4},即2结点的邻居为0和4结点。

步骤4:如图9异构动态图着色流程图所示,判断队列是否为空或低于阈值,若否,则利用贪婪着色方法对待更新结点构成的子图进行分区,把分区结果传输至gpu端;若是,则交由cpu端处理,处理过程包括两个部分:

步骤4.1:在cpu端实现对结点的分区设计,假设定义将q队列中的结点划分为n个分块,那么前(n-1)个分块,每个分区内部的结点互不相邻,整个分区可以在gpu上并行处理不发生冲突,第n个分区内允许存在相邻的结点。在大多数图中,80%的结点需要20%的着色数量,剩余的20%结点需要80%的着色数量。基于这个理论,我们可以设计令前(n-1)个分区拥有大量可以并行的结点,最后一个包含相邻结点的分区通过顺序执行或其他方法进行计算。基于贪婪思想的混合分区方法的设计思路如下:定义n个分区,第一步,将q队列中的结点按照度的大小递减排序,第二步,将第一个结点放入第一个分区,按照排序顺序,依次遍历结点,将与分区内结点不相邻的队列中的结点加入该分区,第三步,重复第二步操作,直至前(n-1)个分区结束,最后将剩余q队列中的结点放入第n个分区。基于贪婪思想的分区方法的时间复杂度为o(n2),由于我们是对q队列分区,相当于是对于子图分区,贪婪算法在实现上更有优势,并且可以保证尽可能多的结点落在前面的分区,增强并行性,因此本专利采用基于贪婪的混合分区方法。

首先将所有结点颜色初始化为0,定义数组flag,用来为每个结点的邻居结点的颜色做标记,便于计算每个结点不被允许着的最小颜色。算法详细描述了顺序贪婪算法的过程,首先循环处理每个结点(line1),对于每个结点v,遍历其邻居(line2),为flag中的v的邻居颜色做标记,也就是在flag中的邻居结点的颜色所在位置赋值v,表示v结点不可以被着以这个颜色(line3),之后读取flag数组,为v结点选择与邻居结点的颜色不同的最小颜色进行着色(line5-6)。顺序执行方法需要调用双重循环,外循环是对于n个结点的处理,内循环是对每个结点的邻居的处理,因此所需时间复杂度为o(n2)。

贪婪算法的具体过程如下:

步骤4.2:如图3中的step3,步骤4-1中的前(n-1)个分区结点分别传输到gpu全局内存上,第n个分区保存在cpu端。

步骤5:根据分区结果并行地对每个区内的结点进行rc-hybrid着色。计算方法包括三个部分:

步骤5.1:如图8所示gpu每个线程处理当前分区的一个结点u,设立长度为该结点入度值加一的数组,利用csc矩阵收集对应结点的内邻颜色,如果颜色不大于当前结点u的度值,则把颜色值在数组中的对应位置置为1。

步骤5.2:根据步骤5.1中所述的数组,从数组起始位置开始递增地找第一个值为0的位置,该位置所对应的数组下标即为当前结点所需分配的颜色。

步骤5.3设立一个长度为顶点数量的数组node作为下轮待处理结点队列,如图7所示gpu线程利用csr矩阵把当前结点u所有外邻v在数组node中的对应位置node[v]置为1,如图10所示,当gpu上的前(n-1)个分区处理完成后,作为多个结点外邻的某一结点只需下次被重新着色一次,达到去重的目的,再把这个node数组最后传回cpu,将cpu端第n个分区中的结点插入到node数组中,更新后的node数组作为下轮待更新队列,重复步骤4,直到队列为空或低于阈值后,阈值根据环境因素设定,当前批次的处理结束或由于队列中结点数量较少而交由cpu端处理。如图3中的step4所示,最后将剩余待处理结点队列和gpu端保存的着色结果传回到cpu端。如图11所示,待处理队列q中的结点个数逐渐减少,直到队列空后结束。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1