[论文笔记] GraphMat: High performance graph analytics made productive

GraphMat: High performance graph analytics made productive

GraphMat:高性能图分析提高生产力 [Paper] [Slides] [Code]
VLDB’15

摘要

弥合用户友好的图分析框架和本地手动优化代码之间的差距
采用结点编程(前端)并将其映射到后端的高性能稀疏矩阵运算, 性能主要取决于一些可扩展且易于理解的稀疏矩阵运算
单节点多核图框架

1. 介绍

大多数图框架比原生的手动优化代码性能下降了一个数量级
需要最大限度地提高图框架在现有硬件上的效率(除了关注横向扩展问题外)
GraphMat 主要思想: 采用结点编程并将其映射到广义稀疏矩阵向量乘法运算(Sparse Matrix Vector Multiplication, SPMV). 在达到矩阵后端的高性能的同时获得了顶点编程的生产力优势.

文章贡献:

  • GraphMat: 第一个多核优化的结点编程模型
  • GraphMat 实现了良好的多核可扩展性
  • GraphMat 对框架用户和开发人员都很高效

2. 动机和相关工作

  • 动机:
    • 图分析框架有各种不同编程模型:
      • 结点编程: 编写图程序高效, 流行并广泛采用; 缺乏数学模型, 后端性能低
      • 矩阵模型: 适合推理和执行优化; 很难编程
    • 基于高性能计算(High Performance Computing, HPC) 中系数矩阵向量乘法(SPMV)
    • 目标: 具有类似 HPC 的图分析性能的结点编程生产力
  • 背景: 大量图框架被提出, 编程抽象和底层实现有所不同
    • 结点编程模型: Giraph, GraphLab, MapGraph (GPU 加速)
    • 矩阵编程模型: CombBLAS, PEGASUS (基于 Map-Reduce, I/O 瓶颈)
    • 函数式编程模型: Socialite
    • 基于任务抽象: Galois
    • 其它特定语言: GreenMarl
    • CombBLAS 和 Galois 性能更好, CombBLAS 易于扩展到多节点
    • 基于矩阵的抽象是图分析的好选择
    • 本文旨在将结点编程模型和矩阵模型结合.

3. 算法

网页排名算法(Page Rank, PR)
广度优先搜索搜索(Breadth Frist Search, BFS)
协同过滤(Collaborative Filtering, CF)
三角形计数(Triangle Counting, TC)
单源最短路径(Single Source Shortest Path, SSSP)

4. GraphMat

通过结点编程的图分析程序可以通过仅支持稀疏矩阵运算的后端来执行
GraphMat 将图算法编写为结点程序, 并对其执行广义稀疏矩阵向量乘法

4.1 将结点程序映射到广义 SPMV

在这里插入图片描述
典型结点程序: 迭代更新: 从"活动的"结点子集开始 -> 将当前状态广播到相邻结点 -> 相邻结点处理所有接收消息, 并归约为单个值 -> 更新结点当前状态 -> 改变状态的结点在下一次迭代中变为活跃结点 -> … -> 迭代固定次数或无状态改变结点终止
GraphMat 遵循批量同步并行模型(Bulk-synchronous parallel mode), 即每次迭代视为一个超级步

GraphMat 中用户为图程序的定义内容:

  • 每个结点的已被初始化的属性数据
  • 初始标记为活动的结点集
  • Send_Message(): 对每个活动结点, 读取结点数据并生成一个消息对象
  • Process_Message(): 读取消息对象、消息沿其到达的边的数据、以及目标结点数据, 并为该边生成已处理的消息. 即矩阵乘运算中的乘法重载函数.
  • Reduce(): 接收已处理的结点消息并产生单个归约值. 即矩阵乘法运算中的加法重载函数.
  • Apply(): 对接收消息的每个结点, 读取缩减值并修改其顶点数据

SSSP 运算样例:
在这里插入图片描述
备注:
Iteration 0 中的广义矩阵乘运算的具体过程:

[ − − − − 4 1 − − − − 3 1 − − − 2 − 2 − − − − − 2 − ] × [ 0 − − − − ] = [ − − ⊕ ( 0 ⊗ 1 ) − ⊕ ( 0 ⊗ 3 ) − ⊕ ( 0 ⊗ 2 ) − ] = [ − 1 3 2 − ] \begin{bmatrix} -&-&-&-&4\\ 1&-&-&-&-\\ 3&1&-&-&-\\ 2&-&2&-&-\\ -&-&-&2&- \end{bmatrix}\times \begin{bmatrix} 0\\ -\\ -\\ -\\ - \end{bmatrix} = \begin{bmatrix} -\\ -\oplus(0\otimes 1)\\ -\oplus(0\otimes 3)\\ -\oplus(0\otimes 2)\\ -\\ \end{bmatrix} = \begin{bmatrix} -\\ 1\\ 3\\ 2\\ -\\ \end{bmatrix} 1321224×0=(01)(03)(02)=132

Iteration 1 中的广义矩阵乘运算的具体过程:

[ − − − − 4 1 − − − − 3 1 − − − 2 − 2 − − − − − 2 − ] × [ − 1 3 2 − ] = [ − − − ⊕ ( 1 ⊗ 1 ) − ⊕ ( 3 ⊗ 2 ) − ⊕ ( 2 ⊗ 2 ) ] = [ − − 2 5 4 ] \begin{bmatrix} -&-&-&-&4\\ 1&-&-&-&-\\ 3&1&-&-&-\\ 2&-&2&-&-\\ -&-&-&2&- \end{bmatrix}\times \begin{bmatrix} -\\ 1\\ 3\\ 2\\ - \end{bmatrix} = \begin{bmatrix} -\\ -\\ -\oplus(1\otimes 1)\\ -\oplus(3\otimes 2)\\ -\oplus(2\otimes 2) \end{bmatrix} = \begin{bmatrix} -\\ -\\ 2\\ 5\\ 4 \end{bmatrix} 1321224×132=(11)(32)(22)=254
其中:

  • a ⊗ b = P r o c e s s _ M e s s a g e ( a , b ) a\otimes b = Process\_Message(a,b) ab=Process_Message(a,b), a ⊕ b = R e d u c e ( a , b ) a\oplus b=Reduce(a,b) ab=Reduce(a,b)
  • 根据 4.2 算法 1 中 if   j  is in  x \textbf{if }j\text{ is in } x if j is in x 可知 SPMV 只会计算图矩阵 G T G^T GT 中列号在 message 中存在(即不为 “-”)的列
  • 根据稀疏矩阵的存储特点, 对于图中不存在的边(即在 G G G G T G^T GT 中为 “-”)则不进行 SPMV 计算
  • 对于 SPMV 计算结果的稀疏向量 y y y 的每个元素的初始值视为 “-”

4.2 广义 SPMV

在这里插入图片描述
图邻接矩阵的转置矩阵 G T G_T GT 以压缩稀疏列(Compressed Sparse Column, CSC)格式存储
在 GraphMat 中, 除了消息和边数据之外, Process_Message() 函数还可访问接收消息的结点的属性数据

4.3 总体框架

在这里插入图片描述
出于性能原因, 使用布尔数组维护活动结点集. 每次迭代扫描该数组查找活动顶点, 并生成稀疏的消息向量
每个结点使用一条消息, 而非每条边
生成消息时通过传递指针避免了冗余数据拷贝
使用批量同步模型: 在每次迭代中, 结点的属性是只读的, 仅在迭代结束时更新
无法处理太大而无法放入主内存的图

4.4 数据结构

4.4.1 稀疏矩阵

双压缩稀疏列(Doubly Compressed Sparse Column, DCSC)格式:

  • 一个数组用于存储具有至少一个非零元素的列的列索引
  • 两个数组存储对应于上述每个列索引的行索引(其中有非零元素)和非零值本身
  • 另一个数组指向与给定列索引对应的行索引在上述数组中的起始位置(允许访问给定列索引处的任何非零元素, 如果存在行索引)
4.4.2 稀疏向量

用于存储有效索引的位向量, 和一个仅在有效索引处存储值的常量(顶点数)大小的数组

4.5 优化

最重要的优化是提高了 SPMV 例程的性能

  1. 缓存优化, 例如使用位向量存储稀疏向量
  2. 使用编译器选项执行过程间优化(-ipo)
  3. 对多核 SPMV 的并行化提高了处理速度. 矩阵的每个分区都由不同的线程处理
  4. 更好地划分邻接矩阵, 以可以改善线程之间的负载平衡. 将矩阵划分为比线程数多得多的分区(通常每个线程8个分区)以及动态调度

5. 成效

与其它图框架的性能比较: Figure 4, 性能总体改进: Table 2
在这里插入图片描述
与手动优化代码的性能比较: Table 3
扩展性: Figure 5
与其它图框架的硬件执行性能比较: Figure 6
优化措施带来的效果: Figure 7

6 总结和未来工作

GraphMat 是一个图分析框架, 利用结点编程前端和优化的矩阵后端, 以弥合生产力和性能差距.


笔者总结

本文的核心在于将图计算的结点编程模型映射到了广义稀疏矩阵向量乘法运算(SPMV).
SPMV 实际上是表达了图计算的两个过程: 一是每个激活结点的邻结点通过 P r o c e s s   m e s s a g e Process\ message Process message 对激活结点的信息进行处理; 二是每个结点通过 R e d u c e Reduce Reduce 将其所有激活的邻结点的处理值归约为单个值.
GraphMat 属于图计算框架, 采用结点编程模型, 但实现是基于 SPMV 的矩阵运算.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值