编程实现路由算法_[论文简介] BFS 的一种高效 GPU 实现

  • 原论文:An Effective GPU Implementation of Breadth-First Search
  • 出版:ACM DAC 2010

摘要

BFS 在电气设计自动化等领域中有广泛的应用。研究者尝试在 GPU 上进行 BFS 加速,但是两个现有工作分别慢于最快的 CPU 实现。在该文中,作者展示一种全新的 BFS 的 GPU 实现。它使用层次队列管理技术和三层内核架构策略。它保证相比于相同时间复杂度下最快的串行版本有 10 倍的加速。

介绍

近年,GPU 已经成为最受欢迎的高效并行平台。即使 GPU 的并行执行可以轻易实现相比直接在 CPU 上执行的十倍或百倍的加速,要在精心设计和充分优化的 CPU 程序基础上加速仍然是困难的工作。

因此,当研究者尝试在 GPU 上加速,他们需要非常仔细地研究 CPU 基线算法。

c1b9b181cad68ac85e7d5d3415fa65a5.png

图 1 显示了 1000 倍加速的 n^2 算法和 nlogn 算法的性能差异。当 n 增长到一定程度后,大大加速的 n^2 算法比未加速的 nlogn 算法要慢。因此,只有在超过最佳 CPU 实现时,加速才是有意义的。在[1]中也提出了类似的观点。广度优先搜索(BFS)是一种图算法,在计算机辅助设计以及其他领域都有广泛的应用。然而,众所周知,在 GPU 上加速图形算法是非常困难的,作者只知道有两篇关于加速BFS的著作[2,3]。Harish和Narayanananan开创了在GPU上加速BFS的先河[2]。这项工作在高性能计算和图算法领域有很大的影响。它不仅被研究论文所引用,而且在NVIDIA CUDA专区和大学的课程教材中也被引用。但是,对于某些类型的图,如稀疏图的大BFS级别的图,这项工作仍然比最快的CPU程序要慢。另一项工作[3]显示出比基于矩阵的BFS实现速度提高了12到13倍,但需要注意的是,这样的BFS实现比传统的BFS算法[8]要慢。

本文将提出一种新的BFS的GPU实现。它使用分层技术在GPU上有效地实现了队列结构。同时提出了一种分层的内核排列方式来降低同步开销。实验结果表明,与经典的快速CPU实现相比,速度提高了10倍以上[8]。

c1b9b181cad68ac85e7d5d3415fa65a5.png

作者的 GPU 方案

BFS 过程通过图中的层级传播。在每一层中,有两种并行性:一种是从所有的边界结点并行传播,另一种是以并行方式搜索边界顶点的每一个邻居。由于很多 EDA 问题,如电路仿真、静态时序分析和路由等都是在稀疏图上制定的,所以我们不期望每个边界顶点有很多邻居。因此,作者的 BFS 的实现只探索第一种类型的并行性,即每个线程专门针对当前层的一个边界顶点。

下面,作者首先介绍 NVIDIA GTX 280 GPU 架构和 CUDA 编程模型。然后,作者介绍了一个高效的队列结构来存储每个级别中产生的新边界顶点。最后,作者提出了分层架构的内核安排,以降低同步开销。注意,作者的解决方案与传统的CPU实现具有相同的计算复杂度。

CUDA 概览

NVIDIA GeForce GTX280图形处理器由30个多处理器组成,每个多处理器有8个流处理器。这30个多处理器共享一个片外全局内存。需要注意的是,全局内存是没有缓存的,所以实现内存凝聚是非常重要的。当连续的线程访问连续的内存位置时,会发生内存凝聚。在这种情况下,可以将多个内存事务凝聚成一个事务。在每个多处理器内部都有一个共享内存,这个共享内存是多处理器内部所有8个流处理器所共有的。这个共享内存是片上内存。访问共享内存只需要2个时钟周期,而全局内存大约需要300个时钟周期。

作者使用 NVIDIA CUDA 计算模型在 GPU 上进行并行编程。一个典型的CUDA 程序由几个阶段组成,在主机 CPU 或 GPU 上执行。CPU 代码执行程序的顺序部分。表现出丰富的并行性的阶段通常在GPU代码中实现,称为kernels。从CPU代码中调用GPU函数的动作被称为内核启动。内核启动时,会产生一个两层线程结构。最上层称为网格,它由一个或多个块组成。每个块由相同数量(最多512个)的线程组成。整个块将被分配给一个多处理器。

层次队列管理

因为不同的线程都是写到同一个队列的末端,最后都是依次执行,所以在队列中维持新的边界是很困难的。为了避免队列上的碰撞,作者引入了分层队列结构。

作者的想法是,一旦我们快速创建了低级队列,就可以知道每个元素在高一级队列中的确切位置,从而将这些元素并行复制到高一级队列中。

构建边界层的自然方法是遵循两级线程层次结构,即基于块级前沿层构建网格级前沿层。块级前沿层可以存储在快速共享内存中。但是,这种策略仍然无法避免块级的碰撞。因此,作者在层次结构中增加了另一个层次—— wrap 层,彻底消除 wrap 层队列上的碰撞。图 3 显示了整体的层次结构。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值