论文导读 | 加速GPU上的三角形计数算法

图片

 

北京大学 胡琳

 

编者按

北京大学数据管理实验室胡琳博士关于三角形计数的论文《Accelerating triangle counting on GPU》被SIGMOD2021接收。

三角形计数是图上的重要算子,近年来三角形计数算法在GPU上获得了很好的加速效果。我们提出了轻量级的预处理策略,使得这种策略对于许多当前最优的GPU三角形计数算法都有提升。我们通过在许多算法中总结相同的计算模式,并从中抽取出分析模型,总结常见的预处理策略是如何对于GPU上的工作负载均衡和资源使用均衡产生影响的。我们证明这些问题的求解是NP难的,进而给出我们的解决方案。最终我们的算法在许多当前最优的算法上都有显著的性能提升。

图片

图片

 

背景介绍

 

 

 

三角形计数算法是图上一个重要的图算子,是许多其他算法(例如k-truss)的基础,同时在计算图的聚集系数,垃圾邮件的检测,推荐算法等方面也有许多实际的应用。

随着要处理的图的规模的增加,CPU逐渐显示出处理和运算能力的不足,因而拥有更高计算能力和更高带宽的GPU越来越受到人们的青睐。GPU设计之初是进行图像的处理,但是由于其出色的性能,许多图算法都迁移到GPU上做,例如BFS算法[1],单源最短路径[2]和子图匹配[3]等算法,都在GPU上实现了非常好的加速效果。

本文中我们研究的也是在GPU上设计的三角形计数算法。目前已经有很多GPU三角形计数实现,这里我们不是提出一种新的算法,而是设计一个对于许多当前算法都有效的方案。我们通过对于原始图数据的处理,包括边的导向和点的重标号,使图能够更加适应GPU的底层架构;从而在不改变三角形计数实现的情况下,对于许多当前主流的三角形计数算法都有提升。

目前GPU上进行图算法(包括三角形计数算法)的处理,主要存在两个问题。首先由于图的不规则性,不同的线程在获得不同的任务单元的时候(例如处理一个点或者一条边的相关任务),很难避免地会出现获得的任务不均衡的情况,由于GPU底层架构中SIMD的特性,这种任务的不均衡会导致整体性能的下降。其次由于每个点或边的任务量不一致,加上不同任务类型对计算和访存资源的使用需求不一样,导致每个硬件单元实际获得的任务对资源的使用也存在倾斜。我们正是通过两种预处理策略----边的方向确定和节点的重新标号,改善上面的两种情形。

为了避免重复计算,三角形计数需要首先把无向图转换成有向图,转换的方式可以决定每个点的出边数目,也就是最终的邻接表长度。一个线程通常用来处理一个交集任务,线程的工作量与邻接表的长度相关。因而有向图的生成策略最终可以对于线程的工作量负载的均衡性产生影响。我们从常见的三角形计数实现中抽象出来一个同步模型,设计目标函数,通过定量分析的方法寻找最优的解决方案。

不同长度的邻接表对于计算和访存资源的需求也不一样,长的邻接表需要的访存资源更多。节点的重新标号可以使对于有不同资源需求的节点分配到一个GPU的计算模块中,从而使计算模块中的计算和访存资源都能够充分利用。为了准确描述节点重新标号对于资源均衡使用的影响,我们从常见三角形计数中抽象出一个资源使用模型,设计目标函数。根据目标函数进行算法设计。通过对于目标函数的分析,我们证明不管确定边的指向还是节点标号都是NP难的问题,因而我们设计了近似算法解决对应的问题。

 

 

1 算法

 

 

 

1.1边的导向

图片

图1.1 三角形计数中的同步操作

图1.1是一个GPU上的三角形计数算法的运行流程,许多线程之间共同使用同一个bitmap进行集合求交集的操作。为了保证对于bitmap的一致性访问,在所有线程设置bitmap和检查bitmap之间,需要一个同步操作,它会导致线程之间的等待现象,并且可能导致非常严重的性能下降。

图片

 

图1.2 线程之间的BSP模型

同步操作是GPU三角形计数算法中一个非常普遍的操作,这也是由GPU架构的特点决定的。同步会导致比较严重的性能下降,我们使用图1.2所示一个BSP(Bulk Synchronize Parallelism)模型表示同步导致的运行模式。可以看出,一组线程的工作时间由最长的时间决定,要实现更好的性能,就要保证线程的工作负载尽量均衡,也就是邻接表的长度均衡。由此我们使用了如下的代价函数:

这个代价函数的直观目的是要使不同节点的邻接表长度尽可能均衡。并且我们证明,寻找一个边指向的方案使得上面的目标函数最优是一个NP难的问题,所以我们设计了近似函数解决这个问题。

通过证明,我们确定对于点的度数小于平均度数的节点,将它们的所有边都设定为出边,对于上述目标函数会取得最优的结果。按照这个思路我们将平均度数这个阈值提高,一层一层剥离度数小的节点(即将与它们相连的边确定指向),最终确定整个图中所有点的指向。为了尽可能地减少预处理算法的时间,我们将这个过程也放到GPU上进行。

同时我们证明,这个算法理论近似比小于1.8。在实际图上的测试也取得了相同的结果。因而我们用线性复杂度的时间,取得了较好的近似效果。

 

1.2点的重标号

图片

图1.3 在不同节点上的访存和计算模式

许多工作的分析和我们的实验结果都表明,二分搜索是比排序归并更加适合GPU上的集合求交操作。我们通过分析,说明二分搜索对于运算和访存资源是有倾向性的:长表上的二分搜索需要更多的访存资源,短表上的需要更多的计算资源,如图1.3所示。

由于不同长度邻接表的节点,对于资源(计算和访存资源)的使用倾向不同,而每个计算模块的资源又是独立的。因而我们抽象出一个资源的使用模型如图1.4。一种资源的过度使用往往导致另一种资源的浪费,只有block1达到了较好的资源均衡使用效果。

因而我们想优化如下的目标函数:

图片

其中Ci表示每个计算模块中计算需求的总和,Mi表示其中的访存需求的总和。ℷ是一个比例系数,跟一个计算模块中的计算能力和访存能力有关。这个代价函数的直观含义是使所有计算模块中浪费的计算或者访存资源之和最少。

这个目标函数的最优解也是NP难的,我们通过一个近似算法求解。

我们把需要更多计算资源的节点称为“计算决定节点”,并且首先处理这类节点。我们建立一个计算模块的小顶堆,每个key值是计算模块中已经有的计算需求量。然后对于每个计算决定的节点,分配给堆顶的计算模块。通过对于堆的不断调整和每个节点的分配,将每个节点分配到相应的对应的计算模块中。对于“访存决定节点”,我们采用类似的计算过程,最后对于所有节点重新标号。

在上面的代价函数中,每个节点需要的的计算资源和访存资源,以及在这两种资源之间转换的参数ℷ都是需要讨论的。我们通过设计一个单边压力测试,得出这三项参数。

图1.4 资源的均衡使用模型

 

2 实验

 

 

 

在论文中,我们选取了五种当前最优的三角形计数算法[4][5][6][7][8]作为基准,比较我们的算法在这五种算法上的性能提升。需要指出的一点是,我们共提出了两种预处理策略,这两种策略并不对所有的方法都有效。一种预处理策略想要对一个实现发挥很好的效果,需要这个实现满足对应的运行模型,也就是前面所提到的同步模型和二分搜索。

在数据集的选择上,为了证明我们的策略的加速效果,我们选取了多种不同类型的数据集,包括社交网络,引用网络,web图,生物信息图,还有人造数据集例如BA图和ER图等;同时我们刻意选择数据集规模比较大的图进行处理,因为在大规模图上的性能提升更加具有现实意义。

这里我们以一种基于wedge的三角形计数方法[8]为例,介绍我们的预处理策略在这种实现上的优化效果。

图片

图2.1 边的指向方法在基于wedge的三角形计数方法的性能提升

 

从图2.1中我们可以看到,我们的边指向方法在基于wedge的三角形计数方法上取得了最多67%的性能提升,核函数也有平均26%的提升,在不改变它具体实现的前提下取得了很好的效果。

表2.1 点的重新标号在基于wedge的三角形计数方法的性能提升

图片

从表2.1中我们可以看出,点的重新标号在wedge-based的三角形计数方法上也取得了9%到48%的性能提升。两种预处理策略的结合体现在图2.2中,可以看到这两种方法是兼容的,结合后的实验相比较各自的效果又有了很大的提升,这进一步验证了我们的实验效果。

图片

图2.2 两种预处理方案结合后的实验效果

 

参考文献

[1] Hang Liu, H Howie Huang, and Yang Hu. 2016. ibfs: Concurrent breadth-first search on gpus. In Proceedings of the 2016 International Conference on Management of Data. ACM, 403–416.

[2] Federico Busato and Nicola Bombieri. 2015. An efficient implementation of the Bellman-Ford algorithm for Kepler GPU architectures. IEEE Transactions on Parallel and Distributed Systems 27, 8 (2015), 2222–2233.

[3] Ha-Nguyen Tran, Jung-jae Kim, and Bingsheng He. 2015. Fast subgraph matching on large graphs using graphics processors. In International Conference on Database Systems for Advanced Applications. Springer, 299–315.

[4] Yangzihao Wang, Andrew Davidson, Yuechao Pan, Yuduo Wu, Andy Riffel, and John D Owens. 2016. Gunrock: A high-performance graph processing library on the GPU. In ACM SIGPLAN Notices, Vol. 51. ACM, 11.

[5] Yang Hu, Hang Liu, and H Howie Huang. 2018. Tricore: Parallel triangle counting on gpus. In SC18: International Conference for High Performance Computing, Networking, Storage and Analysis. IEEE, 171–182.

[6] James Fox, Oded Green, Kasimir Gabert, Xiaojing An, and David A Bader. 2018. Fast and Adaptive List Intersections on the GPU. In 2018 IEEE High Performance extreme Computing Conference (HPEC). IEEE, 1–7.

[7] Mauro Bisson and Massimiliano Fatica. 2017. High Performance Exact Triangle Counting on GPUs. IEEE Transactions on Parallel and Distributed Systems 28, 12 (2017), 3501–3510.

[8] Lin Hu, Naiqing Guan, and Lei Zou. 2019. Triangle counting on GPU using fine-grained task distribution. In 2019 IEEE 35th International Conference on Data Engineering Workshops (ICDEW). IEEE, 225–232.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值