[论文笔记] Gunrock: A High-Performance Graph Processing Library on the GPU

news2024/10/7 19:27:07

Gunrock: A High-Performance Graph Processing Library on the GPU

Gunrock: GPU 上的高性能图处理库 [Paper] [Code]
PPoPP’16

摘要

Gunrock, 针对 GPU 的高层次批量同步图处理系统.

  • 采用了一种新方法抽象 GPU 图分析: 实现了以数据为中心(data-centric)的抽象, 以在结点或边的边界(frontier)上的操作为中心.
  • 将高性能 GPU 计算原语和优化策略与高级编程模型相结合, 实现了性能与表达的平衡.

1. 介绍

提出了 Gunrock, 基于 GPU 的图处理系统, 通过高层次的、以数据为中心的并行编程模型在计算图分析时提供高性能.
以数据为中心的模型的关键抽象是边界(frontier), 图中当前感兴趣的边或结点的子集.
Gunrock 的所有操作是批量同步的, 并对边界进行操作, 通过计算其中的值或从中计算新边界.

高并行图处理系统的主要挑战: 管理工作分配的不规则性.
Gunrock 将负载均衡和工作效率策略融入其核心, 而对编程者隐藏.

本文贡献:

  • 为图操作提出了一种新的以数据为中心的抽象, 允许编程者在高层次抽象上开发图基本算法(graph primitive, 图原语)的同时提供高性能.
    该抽象能够将有益的优化(内核融合、推拉遍历、幂等遍历和优先级队列)结合到实现的核心中.
  • 设计并实现了一组简单灵活的 API, 可以在高层次抽象上表达广泛的图处理原语.
  • 描述了几种针对内存效率、负载均衡和工作负载管理的 GPU 特定优化策略来共同实现高性能.
    实现了与硬件专用实现相当的性能, 并显著优于之前的可编程 GPU 抽象.
  • 对图基本算法进行了详细的实验评估, 并与几种 CPU 和 GPU 实现进行了性能比较.

2. 相关工作

  1. 单节点 CPU 系统
  2. 分布式 CPU 系统
  3. 特定于图基本算法的 GPU 硬件底层实现
  4. 用于图分析的高层次 GPU 编程模型

2.1 单节点和分布式 CPU 系统

2.2 专用并行图算法

2.3 高层次 GPU 编程模型

3. Gunrock 抽象与实现

3.1 Gunrock 的抽象

Gunrock 针对可表示为迭代收敛过程的图操作.

Gunrock 的抽象专注于操纵数据结构, 即表示激活参与计算的图子集的结点或边的边界.
同时支持结点边界和边边界, 并可以在同一个图基本算法中进行切换.
操作边界的批量同步"步骤"(由一系列步骤构建图算法): advance(推进)、filter(过滤)、compute(计算)

  • Advance(推进): 通过访问当前边界的邻居从当前边界生成一个新边界.
  • Filter(过滤): 根据编程者指定的标准选择当前边界的子集, 从当前边界生成一个新边界.
  • Compute(计算): 由编程者指定对当前边界中所有元素(结点或边)的操作, 然后由 Gunrock 在所有元素上并行执行该操作.

在这里插入图片描述

3.2 可替代的抽象

在这里插入图片描述

3.3 Gunrock API 及其内核融合优化

Gunrock 程序指定的三个组件:

  • problem: 提供图拓扑数据和特定于算法的数据管理接口
  • functors: 包含用户定义的计算代码并暴露内核融合机会
  • enactor: 图算法的入口点并将计算指定为一系列具有用户定义的内核启动设置的 advance 和/或 filter 的内核调用

Gunrock 将其计算步骤公开为在编译时集成到 advance 和 filter 内核中的 functor, 以实现类似(基于硬件底层实现的算法)的效率.
支持应用于 {edges, verteices} 的 functor, 并且要么返回一个布尔值(“cond” functor), 用于过滤(filter 阶段); 要么执行计算(“apply” functor).
在这里插入图片描述

Gunrock 数据结构:

  • 每个结点和每条边的数据表示为阵列结构(structure-of-array, SOA)数据结构
  • 图数据结构: 使用压缩稀疏行(CSR)格式的稀疏矩阵, 允许用户选择仅边列表的表示(无边数据)

3.4 工作负载映射和负载均衡详情

Gunrock 将之前应用于单个硬件底层实现的 GPU 图基本算法的两种工作负载分配和负载均衡策略推广到 Gunrock 的 advance 操作.

每个线程细粒度: 将一个边界结点的邻接表映射到一个线程.

  • 将所有邻接表偏移加载到共享内存
  • 使用 CTA 来协同处理邻接表中每条边上的操作
  • 使用结点切割(vertex-cut)来划分邻接表由多个线程处理
  • 适合具有相对均匀分布的大直径图

每个 warp 和每个 CTA 粗粒度: 根据邻接表大小将其分为三类, 然后使用针对该大小的策略单独处理每个类别.

  • 三种邻接表大小: (1) 比 CTA 大; (2) 大于 warp(32线程) 但小于 CTA ; (3) 比 warp 小
  1. 先将边界的一个子集分配给一个 block, 其中每个线程有一个结点.
  2. 拥有大列表结点的线程决定对整个块的控制
  3. block 中所有线程协同处理获胜者结点的邻接表, 直到所有大列表结点处理完
  4. 每个 warp 中线程开始类似过程处理邻接表为中等大小的所有结点
  5. 使用每个线程细粒度工作负载映射策略处理剩余结点

在这里插入图片描述

负载均衡划分: 将边组织成等长的分块(chunk), 并将每个分块分配给一个 block.

  • 使用排序搜索对分块的索引和扫描的边偏移队列进行映射.
  • 处理结点邻接表时使用二分搜索找到要处理结点的 ID.

在这里插入图片描述

Gunrock 对邻接表较小的结点使用细粒度动态分组策略; 对邻接表较大的结点使用粗粒度负载均衡策略, 其中边界大小小于设置的静态阈值时在结点上使用粗粒度负载均衡, 否则(大于阈值)则在边上使用粗粒度负载均衡.

3.5 Gunrock 的优化

Gunrock 以数据中心的抽象和关注操作边界, 适合将现有和新的替代方案和优化的集成.

幂等与非幂等操作:

  • 幂等操作: Gunrock 的 filter 步骤可以减少输出边界的冗余条目
  • 非幂等操作: 在内部使用原子运算保证每个元素在输出边界中只出现一次

Push 和 Pull 遍历:
Gunrock 不仅支持 Push, 还支持 Pull.
Gunrock 在内部将边界转换为结点位图, 生成所有未访问结点的新边界, 然后使用 advance 步骤来从这些结点的前驱结点中进行"Pull"计算.

优先队列:
Gunrock 允许用户定义优先级函数来将输出边界组织为"远"和"近"两种切片.
Gunrock 在接下来的处理步骤中先只考虑近切片, 并将不符合的新元素添至远切片, 直至近切片处理完; 再对远切片进行操作.

4 应用

在这里插入图片描述

4.1 广度优先搜索 (BFS)

4.2 单源最短路径

4.3 中介中心性 (Betweenness Centrality)

4.4 连通分量标记

4.5 PageRank 和其他结点排名算法

5 实验和结果

性能: Table 2, Table 3, Figure 7,
在这里插入图片描述
warp 效率: Table 4
优化策略带来的性能提升: Figure 8


笔者总结

本文的核心在于提出了基于 GPU 的以数据为中心的并行编程模型来对边界进行操作 的图处理系统, 并提出了几种工作负载映射和负载均衡的 GPU 特定优化策略.
Gunrock 属于 GPU 图计算系统.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程day070904

目录 将dict.txt导入到数据库中单词一列&#xff0c;意思一列 代码 结果 思维导图 将dict.txt导入到数据库中单词一列&#xff0c;意思一列 代码 #include<myhead.h> #include<sqlite3.h>int do_create(sqlite3 *db); int do_insert(sqlite3 *db, char * Engl…

ILS解析漏洞复现

搭建好ILS后&#xff0c;访问127.0.0.1:8000 写一个phpinfo的脚本 可以看到。现在是不能访问的 赋予 IIS 解析 phpinfo 能力 打开服务器管理器&#xff0c;打开 IIS 管理器 点击处理程序映射 再次访问&#xff0c;发现程序可以访问 将index.php改为index.png 此时php脚本自然是…

Selenium 三种等待方式详解 (强制等待、隐式等待、显示等待)

前言 ①在进行WEB自动化工作时&#xff0c;一般要等待某一页面元素加载完成后&#xff0c;才能对该元素执行操作&#xff0c;否则自动化脚本会抛出找不到元素的错误&#xff0c;这样就要求我们在UI自动化测试的有些场景上加上等待时间。 ②等待方式的设置是保证自动化脚本稳定…

静态代理IP是什么?一文看懂静态代理IP

对于跨境玩家来说&#xff0c;IP代理已经是我们的老朋友了&#xff0c;那么什么是静态IP&#xff1f;有什么用&#xff1f;如何使用&#xff1f;看完这一篇你就懂了。 一、什么是静态代理IP 静态代理IP是指一个固定不变的&#xff0c;不会在网络重新连接时重新建立或者更改的代…

基于VS平台编译带Cuda的OpenCV(内含版本以及整套方案含泪总结)

感谢 先感谢以下帖子&#xff0c;确实很有参考意义&#xff0c;但很多坑还是没总结到&#xff08;我抓狂了&#xff09; 从安装到编译保姆级帖子&#xff1a;https://blog.csdn.net/fengxinzioo/article/details/109402921 大神版核心步骤帖子(主要参考)&#xff1a;https://bl…

促进合作交流|旅游专业老师在加拿大访学期间取得初步成果

N老师拟申报CSC&#xff0c;指定国家且要求接收学校不收取板凳费&#xff0c;最终我们分别获得了澳大利亚科廷大学和加拿大圭尔夫大学的邀请函&#xff08;均未收取板凳费&#xff09;。N老师用前者申报了CSC并获批&#xff0c;因签证原因又用后者申请了改派&#xff0c;并在加…

Java之Collection集合的详细解析

1.Collection集合 1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构【理解】 …

APUS与腾讯达成战略合作,携手深化产业赋能

9月7—8日&#xff0c;2023腾讯全球数字生态大会在深圳盛大举行&#xff0c;AI大模型企业APUS出席大会&#xff0c;APUS副总裁邓小波与腾讯现场签约战略合作&#xff0c;双方将集中各自优势&#xff0c;在ICT基础设施、大模型生态建设等领域开展广泛、深入合作。此外&#xff0…

mockjs+json-server模拟百万条数据

文章目录 前言场景前置操作安装axios或者Ajax&#xff08;作者用的是axios&#xff09;mock.js文件编辑编辑json-server文件夹添加百万条虚拟数据后言 前言 hello world 欢迎来到前端的世界 &#x1f61c;当前文章系列专栏&#xff1a;前端 &#x1f431;‍&#x1f453;博主在…

G. The Morning Star

Problem - G - Codeforces 思路&#xff1a;想了挺长时间的&#xff0c;一直没想到一个简便的方法在瞎搞。我们发现对于某个点来说&#xff0c;其他的点如果能够跟他匹配&#xff0c;那么一定在这8个方向上&#xff0c;而同时这8个方向其实对应这4条直线&#xff0c;假设点为(x…

Jetpack 中 room 基本使用

Room 概述 Room 持久性库在 SQLite 上提供了一个抽象层&#xff0c;以便在充分利用 SQLite 的强大功能的同时&#xff0c;能够流畅地访问数据库&#xff0c;具体来说&#xff0c;Room具有一下优势&#xff1a; 1、针对SQL 查询的编译时验证。 2、可最大限度减少重复和容易出…

三、创建各个展示模块组件

简介 在文件 components 中创建轮播模块组件,引入App.vue展示。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:First.vue、Second.vue、Third.vue、Fourth.vue、Fifth.vue、App.vue、vite-env.d.ts、assets 一、修改vite-env.d.ts文件 /// <reference type…

Linux-Shell整理集合

Shell变量 参考文章&#xff1a; Shell脚本中变量的使用 shell语法之 , ‘ ‘ , {},, ,‘‘,(),$(())四种语法含义 参考文章&#xff1a; shell语法之 , ‘ ‘ , {},, ,‘‘,(),$(())四种语法含义 grep常用用法 Shell awk命令详解 grep 跟awk连着用&#xff1a; 获取某程序的…

索尼 toio™应用创意开发征文|联盟国战

✨ 能用众力&#xff0c;则无敌于天下矣&#xff1b;能用众智&#xff0c;则无畏于圣人矣。 —— 孙权 前言&#xff1a; 从火爆全网的ChatGPT&#xff0c;到人人都是开发者。AI无疑贯彻了整个2023年的主题&#xff0c;从刚上幼儿园的小朋友到耄耋之年的老顽童&#xff0c;都对…

Meta 验证徽章:为何大家都想在 FB 和 IG 上获得元验证

随着 Meta&#xff08;前身为 Facebook&#xff09;和 Instagram 统治数字领域&#xff0c;Meta Verified 徽章已成为真实性的终极象征。无论您是公众人物还是品牌&#xff0c;在Facebook和Instagram上获得此徽章都会对您的在线形象产生深远的影响。Facebook验证于2013年首次推…

【Python程序设计】Python 中的环境变量【05/8】

一、说明 以下文章是有关 Python 数据工程系列文章的一部分&#xff0c;旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。本篇将讲述环境变量的问题。 迄今为止&#xff0c;本初学者指南包括&#xff1a; 第 1 部分&#xf…

算法的时间及空间复杂度

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

thinkPhp5返回某些指定字段

//去除掉密码$db new UserModel();$result $db->field(password,true)->where("username{$params[username]} AND password{$params[password]}")->find(); 或者指定要的字段的数组 $db new UserModel();$result $db->field([username,create_time…

AList dokcer安装及百度网盘挂载

AList是开源的网盘管理工具。本文介绍如何通过docker安装AList并挂载百度网盘 1、AList安装 1.1、系统安装 通过docker命令进行安装&#xff0c;命令如下: docker run -d --restartalways -v /etc/alist:/opt/alist/data -p 5244:5244 --name"alist" xhofe/alist:…