代码编织梦想

STMatch: Accelerating Graph Pattern Matching on GPU with Stack-Based Loop Optimizations

STMatch: 使用基于栈的循环优化加速 GPU 上的图模式匹配 [Paper] [Code]
SC’22

摘要

  • 提出了一个新颖的基于栈的 GPU 上的图模式匹配系统, 以避免同步和内存消耗问题.
  • 提出了两级工作窃取技术和循环展开技术, 以提高 warp 内和 warp 间的资源利用率.

I. 介绍

现有的 GPU 图模式匹配系统都采用以子图为中心(subgraph-centric)的方法.
该方法有利于并行化, 但存在固有问题:

  1. 需要在每步扩展结束后进行同步.
  2. 部分子图占用大量内存空间.
  3. 以子图为中心的实现失去了部分子图的隐式层次结构, 从而失去了一些可用于回溯过程的优化.

本文选择从最外层循环并行化回溯过程, 消除了 GPU 上的同步.
通过基于栈的回溯算法实现并提出两级工作窃取(two-level work-stealing)技术解决负载不均问题.
提出了循环展开(loop-unrolling)来将多个集合的集合操作合并分配给单个 warp, 以提高线程利用率.
通过循环不变量代码移动(loop-invariant code motion)技术来消除回溯过程中的冗余集合操作.

文章贡献:

  1. 在 GPU 上提出了第一个基于栈的图模式匹配系统
  2. 提出了二级工作窃取技术和循环展开技术以提高 warp 内和 warp 间的资源利用率
  3. 实现了代码移动技术来减少冗余计算, 并显示出与基于回溯的图模式匹配系统的现有优化兼容.

II. 预备知识

A. 问题定义

B. 图模式匹配的回溯

在这里插入图片描述
在这里插入图片描述

C. GPU 架构

III. 并行化回溯的挑战

挑战 1: warp 间的负载不均
在最外层并行化循环, 会造成程序严重负载不均. 先前 CPU 系统提出结合两层循环并根据边分配计算, 但结点多时负载会显著降低; 先前工作采用了工作窃取技术平衡分布式系统的工作负载, 但不能直接用于 GPU.
以子图为中心的图模式匹配系统采用并行化内部循环的方法, 缺点是需要在每个扩展结束后同步并中间结果的具体化会消耗大量内存.

挑战 2: warp 内的线程未充分利用
warp 中的 32 个线程用于执行集合操作, 而集合中元素数量由数据图中结点度数决定, 通常少于 32 个结点.

挑战 3: 冗余计算
嵌套循环的原始形式进行大量冗余集合操作. 代码移动技术在 GPU 上需要更仔细设计数据结构以存储不同标签的多个中间候选集.

IV. STMatch 概览

在这里插入图片描述

GPU 上每个 warp 对立运行 Fig.3 line 5 的 while 循环, 每个 warp 被分配一个调用堆栈.
C s i z e , i t e r , l Csize, iter, l Csize,iter,l 分配在共享内存中, C C C 分配在全局内存中.

每个 warp 执行相同的代码:
l = 0 l=0 l=0 时, g e t C a n d i d a t e s getCandidates getCandidates 函数获得不同的数据图结点.
l > 1 l>1 l>1 时, g e t C a n d i d a t e s getCandidates getCandidates 函数根据查询模式执行集合操作(集合交/差集的二分搜索).
在这里插入图片描述

V. 具有两级工作窃取的负载均衡

空闲的 warp 先从同一线程块中的其他 warp 窃取工作, 只有线程块内没有 warp 可窃取时再从其他线程块窃取.
原因: 在一个线程块中选择最佳目标进行工作窃取相比在整个 GPU 上的全部 warp 中选择更加容易; 线程块内迁移工作比跨线程块开销小.

A. 线程块内窃取

在 warp 跳出循环前(Fig.3 line 9), (窃取) warp 检查同一线程块中的其他 warp 并选择剩余工作最多的(目标) warp 进行工作窃取.
假设在更低层级具有更多未探索结点的 warp 有更多剩余工作.
在这里插入图片描述

窃取 warp 会将目标 warp 中的剩余任务进行划分, 复制一半到自己的栈中.
在这里插入图片描述

窃取过程需要对目标 warp 和 窃取 warp 上锁, 通过为每个 warp 在共享内存分配互斥锁实现(使用 CUDA 的 atomicCASatomicExch).

复制存储在全局内存中的候选结点是开销最大的部分, 通过调整 S t o p L e v e l StopLevel StopLevel (Algorithm 2 line 4) 来在目标 warp 没有足够工作时避免窃取.

B. 跨线程块窃取

若一个 warp 在同一线程块中找不到窃取目标, 它就会在其他线程块中寻找.
由于 warp 不能直接访问不同线程块中的 warp (栈分配在共享内存), 因此必须让目标 warp 检测空闲 warp 并推送任务.
在这里插入图片描述

在全局内存中维护 2 个大小为线程块数 N B NB NB 的数组:

  • i s _ i d l e is\_idle is_idle: 每个元素是一个 bitmap, 指示线程块中每个 warp 的空闲状态.
  • g l o b a l _ s k t s global\_skts global_skts: 每个元素存储窃取者从目标接收的任务.

窃取过程: ①→②→ 1 \boxed{1} 1 2 \boxed{2} 2 3 \boxed{3} 3→③
前提: (窃取) warp 无法在同一线程块中的 warp 中窃取任务.
① 在 i s _ i d l e is\_idle is_idle 中将自己标记为空闲
② 在空闲状态下自旋等待
触发条件: 匹配过程中, warp 会定期检查其他 warp 的状态(steal_across_block 函数Fig.3 line 6~line 7), warp 每进入一个匹配层级, 都会检查在之前的层级是否有未探索的结点, 仅在层级小于 D e t e c t L e v e l DetectLevel DetectLevel 时调用. 当目标 warp 在之前的层级有未探索结点时:
1 \boxed{1} 1 扫描 i s _ i d l e is\_idle is_idle 数组是否有一个(窃取)线程块的所有 warp 都标记为了空闲
2 \boxed{2} 2 目标 warp 划分并复制自己的任务到窃取线程块的 g l o b a l _ s t k global\_stk global_stk (同 Fig.5)
3 \boxed{3} 3 目标 warp 情况窃取线程块在所有 warp 的空闲标记.
③ 窃取线程块中的所有 warp 被激活, warp 0 将任务复制到自己的局部栈, 其他 warp 通过线程块内工作窃取从 warp 0 获取任务.

VI. 通过循环展开提高线程利用率

在每个递归层级展开循环迭代(一次 DFS 扩展多个结点) , 并在一个 warp 中将多个展开的迭代的集合操作一起执行.
在这里插入图片描述

通过展开循环, 组合多组集合操作由一个 warp 处理.
在这里插入图片描述
集合运算时使用 C [ l ] [ s e t _ i d x ] [ s e t _ o f s ] C[l][set\_idx][set\_ofs] C[l][set_idx][set_ofs] 获取元素值, 通过二分查找进行计算.

启用循环展开后 Fig.5 工作窃取的改动:
剩余展开迭代的 C s i z e Csize Csize 需要设置为 0 (注: 此处的理解是, 窃取工作时不考虑循环展开, 会将全部窃取的结点放到第一个候选结点集分组, 即 C s i z e [ l ] [ 0 ] ( u i t e r [ l ] = 0 ) Csize[l][0] (uiter[l]=0) Csize[l][0](uiter[l]=0) 中; 对于 u i t e r [ l ] > 0 uiter[l]>0 uiter[l]>0 时, 由于没有存放窃取的结点, 所以候选结点集的 C s i z e [ 0 ] [ u i t e r [ l ] ] Csize[0][uiter[l]] Csize[0][uiter[l]] 均为 0).
u i t e r uiter uiter 从层级 0 复制到 t a r g e t _ l e v e l target\_level target_level.

VII. 通过循环不变量移动减少冗余

为了表明与基于回溯的图模式匹配的现有优化兼容, 论文系统实现了代码移动技术: 将集合操作中循环不变的部分提升到更高层级以避免重复计算.

C C C C s i z e Csize Csize 的第一维度由 P A T _ S I Z E PAT\_SIZE PAT_SIZE 改为所有层级的集合总数(包括中间结果的所有候选集), 同时更改 getCandidates 函数以计算和使用提升操作的结果.
在这里插入图片描述

为了减少共享内存使用, 将从同一未标记集合中划分出来的不同标签的中间结果集合合并为一个具有多个标签的集合.
在这里插入图片描述

启用代码移动后 Fig.5 工作窃取的改动: 还需复制 t a r g e t _ l e v e l target\_level target_level 后使用的所有中间结果集合.

VIII. 实验结果

性能: TABLE II, TABLE III
在这里插入图片描述
在这里插入图片描述

多 GPU 扩展性: Figure 11
各种优化的性能提升: Figure 12, Figure 13


笔者总结

本文的核心在于提出的基于栈的 GPU 图模式匹配系统, 并由此提出了两级工作窃取循环展开的优化技术, 同时也与代码不变量移动等基于回溯的现有系统优化兼容.
STMatch 属于图模式匹配系统

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LostUnravel/article/details/130830801