基于OpenCL的若干机器学习算法GPU实现及优化 王伟俨
基于OpenCL的若干机器学习算法GPU实现及优化 王伟俨
硕士学位论文
作者姓名: 王伟俨
中国科学院软件研究所
学位类别: 工学硕士
学科专业: 计算机软件与理论
培养单位: 中国科学院软件研究所
2014 年 4月
Several Machine Learning Algorithm Implementations and
Optimizations Based on GPU with OpenCL
By
Weiyan Wang
A Dissertation Submitted to
本人声明所呈交的论文是我个人在导师指导下进行的研究工作
及取得的研究成果。尽我所知,除了文中特别加以标注和致谢的地方
外,论文中不包含其他人已经发表或撰写过的研究成果。与我一同工
作的同志对本研究所做的任何贡献均已在论文中作了明确的说明。
签名:___________________ 日期:____________________
关于论文使用授权的说明
本人完全了解中国科学院软件研究所有关保留、使用学位论文的
规定,即:中国科学院软件研究所有权保留送交论文的复印件,允许
论文被查阅和借阅;中国科学院软件研究所可以公布论文的全部或部
分内容,可以采用影印、缩印或其它复制手段保存论文。
(保密的论文在解密后应遵守此规定)
摘要
与大多数其他算法不同,机器学习算法并不是对问题解决方案直接的形式化
描述。相反,当前主流的机器学习算法基于统计从大量的训练数据中提取规则训
练模型,从而得到可推断其他待检测数据的模型或规则。机器学习算法因需不断
迭代逼近最优解有计算密集的特点,因需频繁读取训练数据和检测数据中有访存
密集的特点并因检测规则的复杂具有逻辑复杂性。因此,机器学习算法往往在训
练时耗费大量时间,而在检测时常常不能满足实时性要求高的应用场景。
另一方面,当前 GPU 用于通用计算已经越来越普遍,大量的算法在 GPU 上
获得了可观的加速比。因此,可以考虑基于 GPU 优化加速机器学习算法,减小
训练开销满足检测的实时性要求。考虑到 GPU 计算平台的硬件架构特性,结合
机器学习算法计算密集,访存密集和逻辑复杂的 3 大特点,本文主要从并行粒度
选择,访存优化策略以及负载均衡策略 3 个方面研究了在 GPU 上实现并优化机
器学习算法的方法。
并行粒度的选择是并行的根基性问题,选择何种粒度进行并行将决定整个并
行实现的框架和潜在优化空间。本文分别研究了讨论粗粒度与细粒度在发起足够
多线程数掩盖延迟与通讯同步开销上的影响,从而进一步讨论粗、细两种粒度的
选择与取舍。此外,还提出了依据输入规模和参数进行动态选择并行粒度的策略。
访存优化是并行优化的关键性问题,因为 GPU 众多的计算核心与显存相对
窄的带宽间有着鸿沟,解决访存延迟是喂饱计算能力达到好的加速效果的关键。
本文立足于具体机器学习算法的访存模式,分别从减少访存开销(主要包括对存
储层次结构利用、手动 cache 等策略)和减少访存次数(主要包括基于数据流分
析的 kernel 合并、循环缓冲,无锁全局同步机制的软,硬件实现等策略)两种思
路进行优化,并结合资源消耗和活跃 wavefront 数目之间的平衡等具体情况讨论
了上述策略的适用场景。
负载均衡优化问题是并行优化的难点性问题,整个程序的最终瓶颈在于任务
量最大的计算核心。本文对 work-group 内和 work-group 间两类负载不均衡问题
分别进行了研究。对于 work-group 内的负载不均衡主要从条件分歧的起因和影
响两种思路中分别发展出任务队列消除条件分支分歧和并行粒度变换减少线程
空闲两种具体的策略;而对于 work-group 间的负载不均衡主要进行了基于统计
趋势和假设的任务分配方式研究。
为了验证提出的 GPU 优化思路和具体策略的有效性,在上述优化思路的指
导下对 2 种计算机视觉算法(Viola-Jones 人脸检测和 SIFT 特征)和 1 种自然语言
处理算法(LDA 文本分类算法)进行了优化。其中,Viola-Jones 优化中合理的
使用粗粒度并行,并有效的使用 2 维 local memory 作为手动 cache 减少访存开销,
并用变换并行粒度减少条件分支分歧引发的线程空闲提高设备使用率,最终获得
的相对于 CPU 高达 16 倍的加速比。SIFT 优化中,进一步挖掘关键点领域进行
直方图统计时的并行性从而用更细粒度并行发起足够多线程有效利用 GPU 计算
能力,并用 kernel merge 和循环缓冲 2 种具体策略减少 global memory 访问,关
键点判别时的条件分歧则使用任务队列进行消除,并让 work-group 在完成一组
i
中国科学院软件研究所硕士论文
图层搜索后互换搜索区域以缓解全局负载不均衡,最终获得的相对于 CPU 高达
15 倍以及相对于知名开源项目 SIFTGPU 高达 2 倍的加速比。在对 LDA 算法的
优化中,采取了根据输入规模和特点动态决定并行粒度的方法以适应不同输入规
模和参数选择最有利的并行粒度,并引入了一种软件实现一个无锁的全局同步消
去了缓慢的 global memory 原子操作,并进一步设计了利用片上资源实现的硬件
全局同步机制方案从而彻底解决同步时对 global memory 访问的高延迟,最终获
得的相对于 CPU 最高到 40 倍的加速比。
ii
中国科学院软件研究所硕士论文
Abstract
Unlike many other algorithms, the machine learning algorithm isn’t the direct
formalized description of the solution to problem. In contrast, based on statistics the
main stream machine learning algorithms extract regulations and train models from
large training data set. Machine learning algorithms are computing intensive because
of repeated iterations, I/O intensive as a result of frequently access to training and
detecting data, and logically complex due to detection rules. So it usually costs quite
much time to train, and it often can’t satisfy high real-time needs when detecting.
On the other hand, GPU is more and more popular to be used as a general
purpose computing device, many algorithms get considerable speed-up on GPU. So it
occurs naturally that implementing and optimizing machine learning algorithm on
GPU to reduce training cost and make detecting satisfies real-time needs. Taking
GPU’s hardware architecture into consideration and combining machine learning
algorithm’s computing intensive, I/O intensive and logical complex 3 main features,
this paper studies machine learning algorithm implementation and optimization based
on GPU from parallel granularity choosing, I/O optimization strategies and workload
balance strategies 3 perspectives.
Parallel granularity choosing is the parallelization’s fundamental problem,
because it determines whole parallel implementation’s main frame and optimization
potential. This paper respectively studies coarse and fine parallel granularities’
influences on invoking enough threads to hide latency and costs of communications
and synchronizations, and then how to choose parallel granularity and make trade-off
is discussed. Additionally, a dynamically choosing parallel granularity strategy
adapted to input size and arguments is brought up.
I/O optimization is the key problem to parallelization, because the gap between
hundreds of computing cores and slow global memory makes it hard to feed GPU’s
parallel computing ability. Based on specific machine learning memory access pattern,
this paper employs some effective strategies to decrease memory access cost
(strategies such as storage hierarchy exploitation, manual cache, etc.) and reduce
memory access itself (strategies such as kernel merging based on data flow analysis,
loop buffer, manual cache, lock-free global synchronization software implementation
and hardware design, etc.). Taking trade-off between resources on chip and active
wavefronts number into consideration, those strategies’ the most suitable scenes are
discussed in details as well.
Workload balance is the difficulty in parallel optimization, and the core that
assigned the most tasks is the whole program’s final bottleneck. This paper
respectively studies local workload imbalance within work-group and global
iii
中国科学院软件研究所硕士论文
imbalance among work-groups. For local imbalance resulted from branch divergences,
it develops 2 strategies one is the task queue to eliminate branch divergences and
dynamical changing parallel granularity to reduce idle threads due to branch
divergences. And for the global imbalance, the simple and effective task partition
basing on statics is used to relief global workload imbalance.
To examine GPU optimization principles and strategies mentioned above, 2
computer vision algorithms (Viola-Jones face detection and SIFT feature) and 1
natural process algorithm (LDA document classification) are implemented under
those principles guiding. The optimization of Viola-Jones face detection chooses a
reasonable coarse parallel granularity, employs 2-D local memory as manual cache to
reduce I/O cost and decreases idle threads by using dynamic changing parallel
granularity. Those effective strategies help to get 16x speed-up compared with CPU.
In SIFT optimization, finer parallel granularity is dug out when accumulating
histogram in case that key point’s number is too small to invoke enough threads, both
kernel merging and loop buffer strategies are used to reduce global memory traffic,
and task queue contributes to eliminating branch divergences and make local
workload balance, the different work-groups will swap region after searching layers in
the same octave to relief global workload balance. Those effective strategies help to
achieve 15x and 2x speed-up compared with CPU and high reputed open source
project SIFTGPU respectively. And in LDA algorithm, the parallel granularity is
dynamically chosen adapted to input size and arguments, and the implementation
brings in a software lock-free global synchronization implementation to avoid slow
atomic operation in global memory. Furthermore, a hardware global synchronization
solution using storage and network on chip is designed to avoid all global memory
accesses’ and atomic operation’s cost. Finally, it achieves 40x speed-up compared
with CPU.
iv
中国科学院软件研究所硕士论文
图目录
图 1 机器学习算法框架...........................................................................................................1
图 2 Viola-Jones Face Detect 算法框架....................................................................................6
图 3 Haar 特征模板..................................................................................................................7
图 4 Haar 特征举例...................................................................................................................7
图 5 积分图求值示意图...........................................................................................................7
图 6 级联分类器示意图...........................................................................................................8
图 7 积分图并行算法...............................................................................................................9
图 8 尺度空间:高斯金字塔(左)和差分高斯金字塔(右)........................................10
图 9 LDA 算法概率图模型.................................................................................................... 13
图 10 条件分歧时间开销示意图.......................................................................................... 22
图 11 队列消去条件分歧时间开销示意图.......................................................................... 22
图 12 人脸检测准确性测试效果图...................................................................................... 28
图 13 检测时间.......................................................................................................................29
图 14 C2050 和 HD 7970 相对于 CPU 的加速比.................................................................29
图 15 尺度空间生成的数据流图.......................................................................................... 32
图 16 环形缓冲.......................................................................................................................33
图 17 发生条件分歧的时间轴.............................................................................................. 34
图 18 任务队列消去条件分歧的时间轴.............................................................................. 34
图 19 GPU(左)与 CPU(右)检测效果对比.................................................................. 35
图 20 3 种实现的不同计算步骤在不同平台上性能............................................................ 36
图 21 CLSIFT 与 SIFTGPU 不同尺度对比性能趋势变化.................................................. 37
图 22 硬件全局同步支持示意图.......................................................................................... 40
图 23 GPU float 精度与 CPU float 的主题概率绝对误差值................................................41
图 24 GPU double 精度与 CPU float 的主题概率绝对误差值............................................ 41
v
中国科学院软件研究所硕士论文
表目录
表 1 并行粒度比较.................................................................................................................26
表 2 cache 策略比较................................................................................................................27
表 3 测试图片参数.................................................................................................................28
表 4 测试平台参数.................................................................................................................29
表 5 CLSIFT 与 SIFTGPU 在并行粒度优化上对比.............................................................31
表 6 CLSIFT 与 SIFTGPU 在尺度空间生成步骤访存优化对比........................................ 32
表 7 CLSIFT 与 SIFTGPU 在尺度空间搜索关键点访存优化对比.................................... 33
表 8 测试平台参数..................................................................................................................35
表 9 测试平台参数.................................................................................................................42
表 10 性能测试结果...............................................................................................................42
vi
中国科学院软件研究所硕士论文
目录
A Dissertation Submitted to............................................................................................................. ii
In partial fulfillment of the requirement........................................................................................ ii
For the degree of............................................................................................................................... ii
Master of Computer Software and Theory.................................................................................... ii
Institute of Software, Chinese Academy of Sciences..................................................................... ii
April, 2014..........................................................................................................................................ii
基于 OpenCL 的若干机器学习算法 GPU 实现及优化................................................................. i
摘要......................................................................................................................................................i
Abstract.............................................................................................................................................. iii
图目录................................................................................................................................................. v
表目录................................................................................................................................................vi
目录...................................................................................................................................................vii
第一章 绪论.......................................................................................................................................1
1.1 研究背景与意义..................................................................................................................1
1.2 本文研究内容.......................................................................................................................2
1.3 论文组织结构......................................................................................................................4
第二章 相关研究...............................................................................................................................6
2.1 Viola Jones 人脸检测........................................................................................................... 6
2.1.1 算法原理....................................................................................................................6
2.1.2 已有优化实现.................................................................................................... 8
2.2 SIFT 原理及已有 GPU 加速............................................................................................... 9
2.2.1 算法原理..................................................................................................................10
2.2.2 已有优化实现.................................................................................................. 12
2.3 LDA 原理及已有 GPU 加速............................................................................................. 12
2.3.1 算法原理...........................................................................................................12
2.3.2 已有优化实现.................................................................................................. 13
2.4 已有 GPU 优化策略总结.................................................................................................. 14
第三章 并行优化思路及具体策略................................................................................................ 16
3.1 并行粒度对并行加速的影响............................................................................................ 16
3.1.1 并行粒度与访存掩盖延迟..................................................................................... 16
3.1.2 并行粒度与同步......................................................................................................17
3.1.3 并行粒度动态选择................................................................................................. 17
3.1.4 CPU 和 GPU 的协同并行性...................................................................................18
3.2 访存问题对并行加速的影响...................................................................................... 18
3.2.1 访存具体优化策略.......................................................................................... 19
3.2.2 访存优化策略选择与平衡..................................................................................... 20
3.3 负载均衡问题对并行加速的影响................................................................................... 21
3.3.1 负载均衡具体优化策略.................................................................................. 21
3.3.2 负载均衡优化策略选择与平衡............................................................................ 24
第四章 案例分析.............................................................................................................................25
vii
中国科学院软件研究所硕士论文
4.1Viola-Jones 人脸检测算法优化..........................................................................................25
4.1.1 具体优化策略..........................................................................................................25
4.1.2 优化效果测试.........................................................................................................28
4.2 SIFT 特征优化................................................................................................................... 30
4.2.1 具体优化策略..........................................................................................................30
4.2.2 优化效果测试.........................................................................................................35
4.3 LDA 文本分类算法优化................................................................................................... 37
4.3.1 具体优化策略..........................................................................................................37
4.3.2 优化效果测试..........................................................................................................40
第五章 总结与未来工作展望.................................................................................................. 43
5.1 工作成果总结....................................................................................................................43
5.2 未来研究............................................................................................................................45
参考文献...........................................................................................................................................46
简历................................................................................................................................................... 49
研究生期间发表的论文...................................................................................................................50
其他学术性成果...............................................................................................................................50
致谢................................................................................................................................................... 51
viii
中国科学院软件研究所硕士论文
第一章 绪论
本章将介绍本文研究的背景及意义,概述论文的主要工作,最后给出论文的
整体章节结构。
1.1 研究背景与意义
计算机科学是研究什么能被有效的自动完成的学科[1]。如果说机械使得人类
从一部分的体力劳动中解放出来,那么计算机则使人类从一部分脑力劳动中解放
出来。目前,大多数的计算机算法是对问题解决方案直接的形式化描述[2]。计
算机通过执行求解的过程来达到解决问题自动化的目的。但是,值得注意的是解
决方案或者说算法本身依然依靠人类自己通过脑力劳动来得到。计算机仅仅起到
了机械的执行和运算的作用。
但机器学习算法则和上述的大多数算法有很大不同,它本身并未包含解决问
题的逻辑。相反,当前主流的机器学习算法基于统计从大量的训练数据中训练模
型或提取规则,从而得到可推断其他待检测数据的模型或规则[3]。大多数的机
器学习算法都符合图 1 所示的框架。
图 1 机器学习算法框架
虽然目前还有很多类型的问题机器学习尚未能给出令人满意的解决方案,但
相对于其他领域的算法,它确实扩展了能被有效自动完成的问题范围[3]。经过
20 世纪 80 年代一段时间的低潮,随着数据收集能力,存储能力以及运算能力的
增强,机器学习在大数据时代再次吸引着学术界和工业界的目光,成为了当前学
术热点[4]。
机器学习领域在实际应用中面临着很大的挑战:为了得到准确的结果,机器学
1
中国科学院软件研究所硕士论文
习往往需要处理大量的训练数据并进行大量的迭代运算[3],这便使得机器学习
算法的耗时十分惊人。换句话说,虽然机器学习算法理论上是能自动完成的,但
不见得是能有效的或者是非常有效的自动完成。具体来说在某些实际应用场景特
别是有强实时性要求的场景下由于速度较慢不能及时给出输出,或者是为了满足
实时性采取减少迭代或者退而求次以牺牲准确度换取速度给出近似结果。
在另一方面,当前 GPU 用于通用计算已经越来越普遍,大量的算法在 GPU
上获得了可观的加速比[5]。目前,GPU 通用计算方面的标准和工具主要有 OpenCL
和 CUDA 两种。其中,OpenCL(全称 Open Computing Language,开放运算语言)
是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的
编程环境,广泛适用于多核处理器、图形处理器、Cell 类型架构及其他并行处理
器[6]。使用 OpenCL 在 GPU 上并行实现算法,有时可以获得相对于 CPU 几十倍
甚至几百倍于的加速比,并且与 CUDA 相比它可跨平台执行,具有良好的性能可
移植性的优势。因此,考虑将若干机器学习在 GPU 上借助 OpenCL 进行并行实现
并深入优化,从而解决或者缓解以下机器学习两方面的问题:
1.更快的训练和检测速度,从而更快对需求做出反应,更好满足实时性的要
求。
2. 训练速度加快有利于机器学习算法的设计者对算法进行调优和改进。
3.在一定时间内更多的迭代次数,在规定时间内更加逼近最优解,获得更加
准确的结果。
1.2 本文研究内容
局负载均衡问题。
除了针对具体瓶颈对具体的优化策略进行研究和分类总结外,本文还注意到
每一种优化策略虽然能克服瓶颈消除开销,但优化策略本身也将引入新的开销,
此外优化策略的使用一般也会占用一些硬件资源可能会带来新的瓶颈。因此,本
文还研究了怎样选取合适的优化策略,如何衡量弊端受益进行取舍,并在
Viola-Jones 人脸检测,SIFT 特征提取以及 LDA 算法中进行了应用。
1.3 论文组织结构
论文以下的内容共包含六章,具体安排如下:
第一章 绪论
绪论部分介绍本文工作的研究背景、研究意义,本文的主要工作和贡献,以
及本文的组织结构。
第二章 相关研究工作
本章主要介绍本文研究工作所涉及到的相关领域的基础背景知识,包括
Viola-Jones 人脸检测算法,SIFT 特征提取算法以及 LDA 算法的原理以及已有的
GPU 并行优化实现工作。此外,本章还将总结介绍当前 GPU 并行优化针对所遇
到瓶颈的所做优化的一些基本策略。
第三章 并行优化思路及具体策略
本章将结合机器学习算法的 3 大特点和 GPU 硬件架构的 3 大特性,从并行粒
度选择,访存优化策略和负载均衡策略 3 个并行优化思路研究具体优化策略。
本章对于并行粒度选择,将分别讨论粗粒度与细粒度在发起足够多任务数掩
盖延迟与通讯同步开销上的影响,从而进一步讨论粗、细两种粒度的选择与取舍。
并提出了自适应于输入规模和参数的动态选择并行粒度策略。
对于访存优化,主要立足于具体机器学习算法的访存模式,本章主要以减少
访存延迟和减少访存 2 种思路讨论了存储层次结构利用、基于数据流分析的
kernel 合并、循环缓冲,手动 cache 以及资源平衡活跃 wavefront 数目等优化策
略,并研究了上述策略的适用情况。
对于 work-group 内和 work-group 间的负载不均衡,本章分别采用了不同的
优化策略,对于 work-group 内的负载不均衡主要研究了通过并行粒度变换以及
任务队列消除条件分支分歧使 work-group 内每一个 work item 都满负荷工作;而
对于 work-group 间的负载不均衡主要进行了基于统计趋势和假设的任务分配方
式研究。
第四章 案例分析
本章主要以 Viola-Jones 人脸检测,SIFT 及 LDA 文本分类为案例讨论了针对同
一个瓶颈问题,对于不同具体的机器学习算法以及具体的环境应该如何选择恰当
的策略。通过总结和分析优化策略,本章给机器学习算法的并行优化给出了指导
4
中国科学院软件研究所硕士论文
性原则,并通过实验进行了检验。
第五章 结论及未来工作展望
本章对全文工作进行总结,并给出本文的未来下一步研究工作。
5
中国科学院软件研究所硕士论文
第二章 相关研究
本章将主要介绍已有的机器学习算法在 GPU 上优化及实现的工作和进展。具
体依次介绍了 Viola-Jones 人脸检测算法,SIFT 算法和 LDA 算法 3 种机器学习算
法的原理及其已有基于 GPU 实现及优化工作。 本章还对已有的实现和优化工作
进行了总结和评价。
2.1.1 算法原理
整个人脸检测系统可分为两部分:训练部分与检测部分,如图 2 所示。其中
训练部分是脱机执行,检测部分是在线执行。
大小和位置,可在图像子窗口中穷举出大量的特征。特征模板可以在子窗口内以
“任意”尺寸“任意”放置,每一种形态称为一个特征。如图 4 所示为体现人脸
眼睛部位的 haar 特征。
图 3 Haar 特征模板[8]
图 4 Haar 特征举例[8]
由于训练样本通常有近万个,并且矩形特征的数量非常庞大,如果每次计算
特征值都要统计矩形内所有像素之和,将会大大降低训练和检测的速度。因此,
viola 与 jones 引入了积分图作为输入图片的一种中间表达形式来加速特征值的计
算。在积分图中,点(x,y)的值为其左边与上边所有点的值的和,其定义如下:
ii ( x, y )
x ' x , y ' y
i ( x, y )
该定义中,ii(x,y)表示积分图中(x,y)的值,而 i(x,y)表示原输入图像点(x,y)的值,如
图 5 所示。
图 5 积分图求值示意图[8]
当使用积分图时,每一次特征值的计算不需要重新做所有元素的加法,重用
积分图中的积分信息便能得到一个矩形内像素和。要计算图中矩形 D 的像素和,
只需要将该图对应的积分图取矩形的四个顶点,4-3-2+1 即可得到矩形 D 的像
素和。在积分图中,不管此矩形特征的尺度如何,特征值的计算所耗费的时间都
7
中国科学院软件研究所硕士论文
是常量,大大地提高了检测的速度
在训练部分,使用 Adaboost 算法对预先收集的正样本和负样本进行处理,
生成所谓的级联分类器。级联分类器起到了尽快排除明显不是人脸的部分的作
用。对于级联分类器,在每一级进行分类时,如果当前子窗口(sub-window)被
检测为未包含目标图像,则分类器停止检测,直接退出并返回子窗口不包含目标
的输出。如果当前子窗口被判为包含目标,则进入下一级分类器进行检测,直到
经过所有的级分类器。级分类器的复杂度是逐层增加的,计算量也越来越大,前
面特征量少的级分类器起到了排除明显不是人脸区域的作用,如图 6 所示。
而在检测部分,通过变换检测窗口尺度,移动检测窗口,对每一个尺度以及
每一个位置上的检测窗口内容进行检测,对检测结果进行后处理即可最后得出图
像中人脸的位置 大小等参数。
图 6 级联分类器示意图[8]
2.1.2 已有优化实现
于简单不是特别有效。总体来看,已有的工作大多回避了级联分类器的条件分支
分歧带来的负载均衡问题,主要在以下几个方面进行优化:
1.CPU 与 GPU 的混合使用与协作。为了检测不同大小的人脸,Viola-Jones
人脸检测算法将把输入图片放缩到不同大小后进行检测。已有工作借助非阻塞的
异步启动 GPU 上的人脸检测 kernel,在空闲的 CPU 上对图片进行放缩为下一个
尺寸的检测做准备,从而达到了 CPU 运行时间掩盖的目的。
2.积分图计算并行优化。积分图本质上是二维的前缀和计算,图上的每一个
点的值由其左上部分的所有值共同决定,因此各个点之间的计算有着极大的相关
性。在直观上很难找到并行的方法,可以巧妙的将积分图求值转化为每一行连续
求和与每一列的求前缀和(prefix sum,即每个点的值为前面点的值的和)如图 7
所示,从而允许每一行或列的前缀和求解可各由一个线程并行的完成。
图 7 积分图并行算法[14]
3.GPU 上层次存储体系的利用。由于相邻的检测窗口只是滑动了 1 到 2 个像
素,因此不同窗口的特征点取值时很可能会有重复。因此上述工作主要使用了
texture 或 image buffer 对图像进行存储从而利用 GPU 的 cache 来缓解访存密集问
题。此外,部分上述工作还很好的对 channel 冲突,向量化计算方面进行了优化。
2.2.1 算法原理
其算法主要包括以下三个步骤:尺度空间建立,关键点搜索和描述符生成。
其中,一个像素点为关键点有三个条件:极值点,强度超过阈值以及曲率超过阈
值。[12][15]
1)尺度空间建立原理
在 SIFT 中,一幅图像将进行不同程度的高斯模糊处理形成一组大小相同的
图像,然后再进行放缩,放缩后的图像将再进一步连续高斯模糊,从而形成如图
8 左所示的高斯金字塔。
高斯金字塔生成后,为了检测尺度不变性还需要生成 DoG(Differences of
Gaussis) 金 字 塔 。 DoG 是 LoG(Laplacion of Gaussian) 的 近 似 计 算 , 其 中 的
图 8 尺度空间:高斯金字塔(左)和差分高斯金字塔(右)[15]
2)关键点搜索
为了使从高斯金字塔中抽取特征值的开销最小,SIFT 采取了级联过滤的策
略,也就是先使用开销小的过滤手段过滤再使用开销较大的过滤进行处理。具体
来说,判断一个点是否为关键点,需要以下 3 个计算步骤:
1. 尺度空间极值检测:关键点一定是 DoG 空间中的极值点。为了寻找
DoG 函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它
的图像域和尺度域的相邻点大或者小,如图所示。
图 5 每一个点需要和图像以及尺度上相邻的点进行比较
2.对比度阈值筛选:每个极值都可作为关键点的候选者,为了保证准确
10
中国科学院软件研究所硕士论文
性,将使用公式,泰勒展开拟合出精确的极值点。如果计算出的极值低
于 0.03,则该极值点将会被去掉,以免噪音干扰时特征点无法重现。
T
1 D
公式: D X D X
2 X
3. 很显然,DoG 算子对边缘处十分敏感,但边缘却不是稳定的特征点。
为了判断是否是边缘点,将使用 Hessian 矩阵计算,通过曲率来判断是
否为边缘。Hessian 矩阵的定义如公式 4:
Dxx Dxy
公式 4: H
Dxy Dyy
3)方向分配与描述子生成
为了让关键点有方向不变性,可以为每个关键点指定方向参数方向,从而使
描述子对图像旋转具有不变性。确定关键点的方向具体采用梯度直方图统计法,
统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。
具体算法为:
(1)确定计算关键点直方图的高斯函数权重函数参数 ;
(2)生成含有 36 柱的方向直方图,梯度直方图范围 0~360 度,其中每 10
度一个柱。由半径为图像区域生成;
(3) 对方向直方图进行两次平滑;
(4)将直方图中最大的方向及高于最大方向 80%的方向作为关键点方向;
(5)对方向直方图的 Taylor 展开式进行二次曲线拟合,精确关键点方向;
描述子不但包括关键点,也包括关键点周围对其有贡献的像素点。用来作为
目标匹配的依据,也可使关键点具有更多的不变特性,如光照变化、3D 视点变
化等。描述子的具体步骤如下:
(1)描述子梯度方向直方图由关键点所在尺度的模糊图像计算产生。图像
区域的半径通过下式计算:
3 oct 2 d 1 1
radius
2
(2)将坐标移至关键点主方向
(3)在图像半径区域内对每个像素点求其梯度幅值和方向,然后对每个梯
度幅值乘以高斯权重参数,生成方向直方图。
(4)在窗口宽度为 2X2 的区域内计算 8 个方向的梯度方向直方图,绘制每
个梯度方向的累加值,即可形成一个种子点。然后再在下一个 2X2 的区域内
进行直方图统计,形成下一个种子点,共生成 16 个种子点。
(5)描述子向量元素门限化及门限化后的描述子向量规范化。
11
中国科学院软件研究所硕士论文
2.2.2 已有优化实现
2.3.1 算法原理
4. 从词语的多项式分布 中采样最终生成词语
在实际使用过程中,显然模型的参数是未知的,唯一已知的信息为输入的文
档集。LDA 可用概率图模型表示为图 9 所示。
12
中国科学院软件研究所硕士论文
图 9 LDA 算法概率图模型[23]
1. 首先对所有文档中的所有词遍历一遍,为其都随机分配一个主题,即
zm,n=k~Mult(1/K),其中 m 表示第 m 篇文档,n 表示文档中的第 n 个词,k
表示主题,K 表示主题的总数,之后将对应的 n(k)m+1, nm+1, n(t)k+1, nk+1,
他们分别表示在 m 文档中 k 主题出现的次数,m 文档中主题数量的和,
k 主题对应的 t 词的次数,k 主题对应的总词数。
2. 之后对下述操作进行重复迭代。
3. 对所有文档中的所有词进行遍历,假如当前文档 m 的词 t 对应主题为 k,
则 n(k)m-1, nm-1, n(t)k-1, nk-1, 即先拿出当前词,之后根据 LDA 中 topic
sample 的概率分布 sample 出新的主题,在对应的 n(k)m, nm, n(t)k, nk 上分
别+1。
迭代完成后输出主题-词参数矩阵φ和文档-主题矩阵θ
2.3.2 已有优化实现
值得注意的是,LDA算法参数估计所用的Gibbs Sampling算法具有很强的数据
依赖性,其本身不能直接并行。研究者为了进行加速,采用了下述3种牺牲数据
13
中国科学院软件研究所硕士论文
依赖性和收敛速度的方法进行并行:
Dirichlet Compound Multinomial LDA(DCM-LDA)[24]:该方法探索了在不
同处理器上分布不同数据的方法,Gibbs sampling 将在各个处理器上独立
采样估计参数不会进行任何通讯和同步。最后,对主题进行一次全局的归
类。
Approximate Distributed LDA (AD-LDA)[25] :, 该方法每个处理器在一次
迭代中都会独立进行一次本地 Gibbs sampling 接着进行一次全局更新通
讯。由于 Gibbs sampling 只在本地进行,且只有一次循环后才更新信息,
因此该方法被称为近似分布式 LDA。
Asynchronous distributed LDA (AS-LDA) [26]:在该方法中摒弃了所有的全
局通讯,与工作极为不一样。每个处理器进行一次本地 Gibbs sampling 后,
会随机和其他处理器通讯,而不会进行全局通讯。
LDA算法往往要处理大量的文档,消耗大量内存较难在GPU上全都装下。因
此有较多的基于CPU集群的LDA实现,而GPU实现则更多的着重于内存消耗的优
化。
在CPU集群环境下,Zhiyuan Liu等提出的PLDA+是获得了显著的加速比以及
接近完美线性扩展的AD-LDA算法实现。他们主要提出了以下4大优化策略:数据
划分放置,流水线处理,单词绑定和基于优先度的调度。这四大优化策略很好的
克服了在内存以及通讯上的瓶颈。
而在单机的GPU环境下,由Mian Lu等提出的GLDA也对单CPU获得了15倍的
加速比。Mian Lu的工作贡献主要在如何在相对CPU可访问的虚拟内存空间极其
有限的显存中存储相关信息。主要采取了以下3种策略:
1.按需生成文档-主题的计数器,而非提前预生成所有的文档-主题计数器。
2.对于稀疏矩阵采用了压缩存储的方式。
3.对单词进行划分,轮流占用GPU进行计算。
GLDA作为LDA的CUDA版实现,虽然他声称其通过多种策略在极其有限的
显存空间存储了极大的数据集,但他使用了较直接和朴素的方式来做计算。
GLDA将每个单词分配一个work-group,而每个线程都计算一个主题概率但额外
引入了规约操作进行新主题的选择。并且他基本没有考虑通讯以及同步的优化,
其他的一些细节也没有被GLDA考虑在内。这使得GLDA未能完全发挥出GPU的
计算潜力,虽然有一定加速但采用训练模型的参数依然将耗费许多时间。
14
中国科学院软件研究所硕士论文
15
中国科学院软件研究所硕士论文
第三章 并行优化思路及具体策略
机器学习算法因需不断迭代逼近最优解有密集计算,因反复访问训练集或待
检测目标的密集访存,因检测规则的复杂造成的程序条件逻辑复杂性。而对于
GPU 本身,则有着并行计算核心数多理论计算峰值高,显存带宽相对窄访存延迟
大,并因共享指令发射装备具有条件分歧的特点。虽然直接朴素的在 GPU 上实
现某个机器学习算法会有一些效果,但尚不能完全发挥出 GPU 的并行计算能力
达到理想的加速效果。
结合机器学习算法本身的 3 大特点和 GPU 设备硬件架构 3 大特性,对机器学
习算法在 GPU 上优化时首要应考虑其并行粒度的选择,这是并行的基础问题将
决定整个优化工作的框架和潜在空间;其次要考虑的访存优化问题,这是并行加
速的关键问题只有减少访存的延迟才能填满 GPU 的流水线使得 GPU 真正发挥出
并行计算能力;最后还特别要注意负载均衡问题,当所有其他优化都做到最佳时
整个实现的瓶颈在于任务量最多的线程,因为任务量往往和输入有关运行时才能
决定,因此负载均衡问题是并行优化的难点。
3.1 并行粒度对并行加速的影响
将一个算法或程序并行化实现的基石是寻找其可并行性,而在多数情况中算
法往往在不同的尺度下有着独立性和可并行性。并行粒度至少会有较粗并行粒度
与较细并行粒度两种。因此,选择何种并行粒度是当对某个程序进行并行时所需
要回答的第一问题,将决定整个并行工作的大方向。
特别是在 GPU 依赖于大量轻量线程快速切换掩盖访存延迟并且对同步与通
讯弱支持的硬件特点。并行粒度选择由于往往还将决定可发起的线程数和所需交
换信息量,将极大的影响 GPU 并行优化的效果。除了访存延迟掩盖与通讯问题,
并行粒度与其他技术结合还对解决负载均衡有所帮助,相关问题将在第五章进行
介绍。
3.1.1 并行粒度与访存掩盖延迟
GPU 具有数目众多的计算核心,和极高的并行计算峰值。但显存访存带宽明
显无法同时满足如此多计算核心同时发起的访存需要。为了掩盖延迟,GPU 引
入了轻量线程,线程切换时直接切换寄存器堆,避免了 CPU 上线程切换时相关
寄存器入栈和出栈进行现场保护与恢复的开销。所以,当 GPU 遇到访存或其他
耗时指令时几乎不费代价的切换到其他进行计算的线程,用计算时间掩盖延迟。
16
中国科学院软件研究所硕士论文
3.1.2 并行粒度与同步
3.1.3 并行粒度动态选择
总体来说,粗细两种并行粒度各有其优缺点。粗粒度并行各个进程的独立性
较强互相依赖少,可减少同步和通讯开销,但由于任务数相对较少有可能无法有
效掩盖访存延迟。另一方面,细粒度并行使得能并行的任务数变多能提供更多可
调度的 wavefront 数有利于掩盖访存及耗时长的运算,将众多计算核心充分利用,
但由于细小任务间的依赖度更大可能将引入更多的同步和通讯开销。
因此,选择并行粒度应该结合具体的情况。不同的算法,所需处理的数据量
17
中国科学院软件研究所硕士论文
和数据间的依赖关系各有不同。当数据量较大,粗粒度并行可以发起足够多的线
程时粗粒度不会在掩盖延迟上有任何劣势,是不错的选择。同样当算法的数据依
赖性极少而数据量相对较少时,细粒度也不会有额外在通讯商的开销。当然,更
多时候情况会比较复杂,往往会存在有一定数据量但又不足够大,并存在一定的
数据依赖关系的情况,此时就应该考虑好哪一方的瓶颈更大做好各方面的平衡,
选择最合适的并行粒度。
另一个经常碰到的问题是,数据量与数据依赖性可能是依赖于算法的输入
的,而非一成不变,更可能在运行中发生改变。事实上,我们采取了一种变换并
行粒度的方式动态应对这一问题,根据输入的特点动态选择相对更好的并行粒
度,以变化来应对变化。
3.2 访存问题对并行加速的影响
键问题。
3.2.1 访存具体优化策略
本节将主要讨论如何减少访存延迟,克服相关瓶颈。减少访存延迟的思路主
要有 2 条,一是通过寻找 CPU 上 cache 类似的解决方案,减少访存指令本身特
别是重复读取数据的开销;二是设法减少算法实现中访存指令的数目。下面将介
绍 3 种在此 2 种思路下设计的访存具体优化策略。
和很多其他算法类似,机器学习算法往往会有多个计算步骤,前一个计算步
骤的输出又往往是后一个步骤的输入。显然,不同的计算步骤往往有着不同的逻
辑意义,在书写代码时往往会倾向于将有不同逻辑意义的代码写入到不同的函数
19
中国科学院软件研究所硕士论文
(3)使用循环缓冲减少访存
机器学习算法的一大特点是从大量训练数据集中进行遍历从而寻找关键点
或不断迭代逼近最优解。在遍历整个庞大的数据集时往往有多种遍历顺序的可供
选择,虽然大多数机器学习算法的不同遍历顺序在计算结果上没有不同,但遍历
数据集顺序则将根本上决定整个算法的访存模式和实现的数据流关系。
事实上,选择合理的遍历顺序的选择并结合循环缓冲技术可能有减少访存指
令。当遍历训练数据集时,若满足本轮遍历所需要的信息的一部分也是下轮遍历
所需要的,则可以考虑采用循环缓冲。所谓循环缓冲是一个分成若干份进行循环
使用的 local memory 缓冲区,当进行完本轮的循环遍历后将在淘汰那部分数据空
间上加载新一轮循环所需要的数据。这样,每次循环只需要更新一部分数据,而
每份数据都能参与多次循环从而起到了提高计算访存比和减少 global memory 访
问的作用。
3.2.2 访存优化策略选择与平衡
3.3 负载均衡问题对并行加速的影响
虽然在程序开始运行时,每个计算核心都能被公平的分到任务数。但对于机
器学习算法而言,其往往有较复杂的逻辑,不同的任务的计算量并不见得一样。
具体的每个任务是计算时间长还是短只有运行时根据算法内在的判断逻辑才能
知道。因此,在任务划分阶段是无法保证每个计算核心能公平的布置任务,必然
有的计算核心运行时间长有的则短。虽然运行时间长的计算核心它自己并不会像
人那样抱怨这种不公平,但很显然整个程序的运行时间将由运算量最大的那个线
程决定。运算量最大的线程是整个算法实现的瓶颈,负载均衡是避免计算核心运
算能力被浪费的关键。
特别的,GPU 作为 SIMD(Single Instruction Multiple Data)思想指导下设计
的计算设备,其芯片面积主要用于 ALU(Arithmetic Logical Unit)和片上寄存器
的设计,逻辑部件十分简单多个计算核心需要共享同一套指令发射元件。因此,
相 应 的 当 遇 到条 件 分 歧时 GPU 有 着一 个 独 特的 条 件 分歧 问 题 。即 同 一 个
wavefront 中的线程若走不通的分支,则因所有核心公用一套指令发射元件,执
行时间等于各个分支执行的时间之和而不是像 CPU 中为最长的分支。因此,对
于 GPU 而言不仅有着和 CPU 一样的传统意义上的负载不均衡,更因为 GPU 独
特的条件分歧特点,当遇到逻辑复杂的机器学习算法将加剧 work-group 内部的
负载不均衡时,这是整个并行优化的难点。
3.3.1 负载均衡具体优化策略
本节将主要讨论如何处理负载不均衡问题,从而提高设备占用率达到最
终提高性能的目的。在 GPU 上做到负载均衡主要有 2 个层次:一是要处理 GPU
同 一 个 work-group 中 因 为 机 器 学 习 算 法 复 杂 逻 辑 造 成 的 条 件 分 歧 , 使 得
work-group 内每个计算核心的任务量是平均的;二是要让每个 computing unit 的
任务量也要趋于平均。具体来说,提出了以下 3 种负载均衡的优化策略。
21
中国科学院软件研究所硕士论文
(1)任务队列:消除条件分歧
图 10 条件分歧时间开销示意图
由于发生条件分歧的前提是同一个 wavefront 中有线程走不同的分支路径。
一个很自然的想法是将走同一个分支的线程凑到一个 wavefront 中运行,从而从
根本上消除条件分歧。为了达到凑 wavefront 的目的,需要在 local memory 中维
护 2 个分别保存 2 个分支任务的队列。具体来说,当 64 个线程进行条件判断后
不是直接执行分支语句,而是将任务分别加入到合适的队列中。只有当队列中至
少凑满了一个 wavefront 或其他合适的 wavefront 大小倍数后,任务队列中的任务
才会被同一个 wavefront 执行。由此,当执行分支语句时,wavefront 中的任务总
是走同一个分支的。上图中的情况将演变为下图,虽然有一些维护队列操作的开
销,但执行分支 1 和分支 2 的总时间仅为原时间的一半,如图 11 所示。
图 11 队列消去条件分歧时间开销示意图
事实上,这种在 local memory 维护队列的方式并没有完全消除条件分支分歧,
上图中 64 个线程分别有 32 个线程将串行执行入队 1 和入队 2 对队列进行维护时
其实也是条件分歧。由于队列位于 local memory,由于是片上资源维护队列时使
用的 local 原子操作也非常快速,入队的开销其实非常小。因此,用维护队列很
小的开销来替代执行时间长的分支语句进行条件分歧,从而提高分支语句执行的
效率是十分值得的。
(2) 动态变换并行粒度:提高设备利用率
和多重循环等十分复杂,分支极多的条件判断。当分支过多时,需要维护很多的
队列,这显然是不现实的,local memory 队列消除条件分歧的策略只适用于分支
数较少的情况。
因此,将处理 work-group 内负载不均衡的思路由避免产生条件分歧的前提,
转换到避免条件分歧带来的恶性结果上来。条件分歧导致 work-group 中负载不
均衡的根本原因在于执行某一个分支语句时,执行不走该分支线程的计算核心都
将空闲,使得整个设备的占有率变低。因此,可考虑保留条件分歧但在执行时设
法提高设备占用率。
在前面 3.1 节对并行粒度的讨论中,本文已介绍过算法的并行粒度往往有多
个层次。因此,可以考虑当出现条件分歧后选择更细粒度的并行将原本的一个任
务拆分到多个线程来执行。很显然,分支路径不同任务数也不同,因此采用的并
行粒度也应该不同,在有些情况下由于活跃线程数还远高于 wavefront 的一半,
此时即使仅拆分成 2 倍的效果也会不好,假设 wavefront 活跃线程数为 33 拆分为
2 倍后有 66 个线程超过了 wavefront 大小,将不得不发起一个只有 2 个活跃线程
的 wavefront,依然有着低效率的问题。
为了进行并行粒度的变换,事实上依然需要在 local memory 上维护一个数据
结构保存所有走现在正在执行分支路径的任务。每次进入一个分支时,各个线程
将从 local memory 的数据结构中读取该分支需要处理的任务,退出分支前将清空
该数据结构并写入新分支中活跃的任务。而在写入任务后,各个线程将变换并行
粒度且重新分配一次任务。原来的任务将会被拆分成更多也更细小的任务,所有
线程将读取保存了任务的数据结构,重新分配一个更细小的任务进行执行。执行
完成后,有必要的话通过一次归约操作将各细小任务的合并为原来相对较大的任
务。虽然变换粒度的策略引入了维护数据结构和进行归约的开销,但是合理使用
能使得 GPU 计算资源充分利用更加接近理论计算峰值,有效避免了负载不均衡
对机器算法实现的不利影响。
(3)基于统计趋势划分:缓和全局负载不均衡
和其他的并行计算平台一样,GPU 也还忍受着全局负载不均衡的问题,即
computing units 之间任务负载的不平衡。即使 work-group 内的负载不均衡已经完
全处理好,但不同 work-group 依然非常可能要花不同的时间,这就导致整个应
用的瓶颈在于任务量最多的 work-group。
与 work-group 局部负载不均衡相比,全局负载不均衡更难处理。这主要是因
为 GPU 缺乏全局同步和通讯机制的硬件支持,很难在 work-group 之间调度任务。
因此即使用软件技术将前面所叙述过的队列和变换粒度的策略同样运用到全局
负载不均衡问题的处理上,由于必须使用 global memory 替代只能 work-group 内
共享 local memory 作为存储介质,其读取速度以及相关的原子操作都十分慢造成
23
中国科学院软件研究所硕士论文
维护数据结构的开销极大,甚至将超过负载均衡后的收益。
因此,在无硬件直接支持高效全局通讯以及任务调度的情况下,需要考虑一
个开销小的策略来缓解全局负载不均衡。对于机器学习算法而言,总是会有一些
热点地区会有更多的计算,计算机视觉中目标所在的图像部分就是这种热点地区
的典型例子。很显然,热点地区在整个数据集中的分布必然不是均匀的分布,但
在遍历数据集进行寻找和迭代时,可以让 work-group 交替处理不同部分的数据。
这样从统计上来看,work-group 处理的任务量将更加趋于平均,从而一定程度上
缓解了负载不均衡的问题。由于让 work-group 交替处理不同部分的数据,只是
数据划分上的改变,相对于负载均衡的收益而言开销极小,所以对提升性能有一
定的帮助。
3.3.2 负载均衡优化策略选择与平衡
24
中国科学院软件研究所硕士论文
第四章 案例分析
本章将在几个案例中实际运用前三章中的讨论过的优化分析思路和具体优
化策略,来验证分析上述思路和策略的有效性。具体来说,主要选择了 2 个计算
机视觉(Viola-Jones 人脸检测和 SIFT 特征)和 1 个自然语言处理(LDA 文本分类
算法)讨论了具体的不同机器学习算法的特点,以及针对这些具体特点如何选择
恰当的策略,并进行试验进行论证。
4.1Viola-Jones 人脸检测算法优化
4.1.1 具体优化策略
(1)并行粒度选择
事实上,Viola-Jones 人脸检测算法具有天然的可并行性。很显然,不同尺寸
的图片中是否检测出人脸是互相之间独立的,固定尺寸的图片中不同检测窗口是
否检测出人脸也是互相独立的,检测窗口在级联分类器的某一级中不同 haar 特
征的计算也是互相不依赖的。整个 Viola-Jones 在这 3 个层次上都具有可并行性。
而在这 3 层可并行中,由于图片重现被放缩的尺寸非常有限远低于 100,数
目过少远远不能满足发起足够多线程掩盖耗时长指令延迟的目的;而同一尺寸图
中的检测窗口数目就十分大了,若检测窗口为 20*20 图片为 512*512 则总的检测
窗口数为(512-20)*(512-20)=242064 个远高于所需要的计算核心数的 5~6
倍,并且值得注意的是不同检测窗口直接完全独立不需任何通讯和归约。而对于
不同的 haar 特征计算,其数目更加巨大远超过所需要的线程数,但不同的 haar
特征值计算后需要归约到一起来和阈值比较判断是否通过本级分类器,若以该粒
度并行则会引入额外开销。
因此,在 3 层并行中以每个线程负责 1 个检测窗口为最佳选择,此时有足够
25
中国科学院软件研究所硕士论文
(2)访存优化策略
每一个检测窗口在通过每一级级联分类器时,都需要在其窗口范围内读取积
分图的数值对 haar 特征值进行计算。由于积分图将任意面积的 haar 特征值计算
都简化为了 4 次数据读取,2 次加法和 2 次减法操作,其计算访存比很低访存的
频率很高,因此检测窗口通过分类器是一个访存密集的过程。对访存进行优化是
提升人脸检测性能的关键。
从单个检测窗口中访存模式分析来看,当检测窗口逐一通过级联分类器各级
时,都是在检测窗口范围内访问积分图计算 haar 特征值。因此 20*20 大小的检
测窗口内有不少数据点将在高达数十级每级可能有上百个特征值需要计算的级
联分类器中进行重复读取。由于每个检测窗口内访存的高度的确定和密集性,依
据 4.2.1 节分析应考虑使用 local memory 作为手动 cache 替代 image buffer 的
26
中国科学院软件研究所硕士论文
自动 cache 机制,从而避免了不同级的分类器再次访问数据时已被错误的淘汰从
而保证了 100%的命中率。
另一方面,非常值得注意的是相邻的检测窗口仅仅是以步长为 1 个或 2 个像
素移动有相当大面积的图像是共享的,故还应该考虑 work-group 内不同线程共
享 local memory 中数据的问题。若 work-group 按照比较直观的方法用 1 维进行
组织线程,每个线程负责左右相邻的检测窗口,则 local memory 大小为 20*
(19+work-group 中线程数)。事实上,可以考虑采用二维方式组织 work-group
内线程在左右和上下 2 个方向上相邻检测窗口上检测。虽然二维的组织方式在实
现上要稍微麻烦,特别是偏移量的计算较为麻烦,但却能在保持检测窗口数目不
变 的 情 况 下 减 少 local memory 的 使 用 , 此 时 local memory 使 用 的 大 小 为
(work-group 数的 2 次根+19)*(work-group 数的 2 次根+19)远低于一维组织
local memory 的形式。从表 2 中对不同访存优化可以看出,采用二维组织 local
memory 作为手动 cache 的效果最好。
访存策略 命中率 对活跃线程数影响
Image Buffer cache 较低 无
1 维 local mem 手动 cache 100% 相对大
2 维 local mem 手动 cache 100% 相对小
表 2 cache 策略比较
(3)负载均衡优化策略
Viola-Jones 人脸检测算法设计时以串行执行为指导思想,其级联分类器的
设计实质上是一种快速排除法。级联分类器中前面级分类器的 Haar 特征数量较
少,用于快速排除明显不是人脸的区域,只有比较有潜力的区域才会到后面特征
数量较多的级分类器上处理,而一旦某个检测窗口在某一级上失败则会被判定并
无人脸不会被后面的级分类器检测。由于级分类器的这种设计,为检测部分引入
了条件分支分歧,进而造成了 work-group 内部的负载不均衡问题。因此,对于
Viola-Jones 人脸检测算法如何处理好负载均衡问题是提升 GPU 实现及优化效果
的难点。
由于级联分类器的级数很多,也就造成了条件分支路径很多,虽然有一半的
分支路径是不做任何事情直接退出线程,但由于级分类的级数一般在 30 以上而
且后面的级分类器 haar 特征值可能高达数百上千。这意味着如果采用队列消除
条件分支分歧便需要在 local memory 中维护所有数十个分支路径的队列,这显
然是不现实的,而且逐个队列检测是否已满开销也非常大。
由于级联分类器分支路径众多,逻辑复杂,而且前面进行并行粒度分析时发
现有多层并行性存在,因此将考虑使用变化并行粒度的方式从消除条件分支分歧
影响的角度入手解决条件分支分歧。具体的策略为在 local memory 维护一个数
据结构保存当前还幸存的检测窗口。当某一级级数很高的分类器开始时,首先读
取数据结构中的任务,然后用多线程处理一个检测窗口而不是一个线程负责一个
27
中国科学院软件研究所硕士论文
窗口,使得每个线程都有工作能做。当每个线程计算完它们被分配的 haar 特征
后,它们进行一次归约来决定该检测窗口是否通过本级分类器。当所有窗口都被
处理后,原本的数据结构被清空,而后写入新的通过本级分类器的窗口供下一级
检测时检测。
4.1.2 优化效果测试
(1)正确性检测
为了验证程序正确性,我们使用卡耐基梅隆著名的人脸检测数据集进行
了测试。不同图片的尺寸参数如下表 3:
图片编号 图片大小 人脸数
1 256 * 337 1
2 469 * 375 4
3 500 * 500 6
4 696 * 510 12
5 623 * 805 9
6 662 * 874 7
7 1280 * 1024 56
表 3 测试图片参数
如图所示,对于各种类型的照片中不同位置和不同大小的人脸都有良好的检
测效果。输出的结果和串行的 CPU 版本完全一致。
图 12 人脸检测准确性测试效果图
(2)性能检测
为了验证实现的性能,我们继续使用卡耐基梅隆著名的人脸检测数据集进行
了分别在 Nvidia 和 AMD 的平台上测试,并与在 CPU 上的 OpenCV 人脸检测性
能做对比。设备的硬件参数如表 4。
28
中国科学院软件研究所硕士论文
图 13 检测时间
相对于 CPU,不同设备相对于 CPU 的加速比具体为:
效果相对一般。其原因是大尺寸的图片可并行性更高,访存的次数也更多,因此
合理的并行粒度选择更容易发挥出 GPU 的并行计算能力,而访存优化策略则提
供了更多的收益。而人脸数目较多时意味着有更多的检测窗口会进入到级联分类
器的后面若干级,不容易被淘汰。由于区域不同这些窗口必然会分布在更多的
work-group 中造成更多的 work-group 受条件分支分歧影响。虽然动态变化并行
粒度一定程度上消除了条件分支分歧的影响,但并不是完美的绝对的解决,因此
人脸数较多的图片加速效果会受一些影响。
4.2.1 具体优化策略
(1)并行粒度选择
在前面建立尺度空间和定位关键点的计算步骤中,并行粒度都非常明确,即
每个像素的计算和判别都是独立的。这些像素点数目众多能发起足够线程且互相
之间不需要任何通讯,是 GPU 上并行的理想粒度。虽然大图的像素点数目众多
有可能超过最多支持的线程数,但可以依旧使用 Persistent thread 进行处理。
比较难处理的部分主要在运用了直方图统计的关键点方向分配和描述符生
成中。他们都需要对非常小的范围内的所有像素点计算并统计方向与强度。然后,
这些结果被统计成直方图来确定准确的方向或者是用来描绘图像的特征。
在著名开源 SIFTGPU 的实现中,为了避免规约操作直接将每个特征点被分
配到一个线程。这样特征点将串行计算领域中像素的方向和强度然后逐一累加到
直方图中。该策略的问题是有的图像(如标准测试图 lena.jpg 中)的关键点数量
较少可能只在 100 左右,这些少量的关键点不足以开辟足够的线程数去隐藏访存
延迟。
为了避免这种地利用率的情况发生,本文选择一个更细粒度的并行,将每一
个关键点分配给一个工作组。显然的,在小的邻域内的每个像素的方向和强度计
算能被同时处理。但在直方图的累加中依然存在冲突,因为可能有多个像素同时
30
中国科学院软件研究所硕士论文
(2)访存优化
在创建高斯金字塔的过程中,高斯模糊被反复使用来生成金子塔的各层图
像。这就引入了大量的 global memory 访存,成为了该步骤的最大瓶颈。
在一次高斯模糊独立的计算过程中,很显然每个新生成的像素计算是互相独
立的。值得注意的是,相近的两个像素往往会共享一部分的图像部分和中间计算
结果,如果这些计算过程完全独立则无法重用。为了重用中间计算结果,事实上
可以将高斯模糊拆成 2 部在横向和纵向分别进行。先在横向高斯模糊生成的中间
结果再乘上纵向高斯模糊时的因子后进行累加即为二维高斯卷积的结果。由于一
般情况下,程序员将按照逻辑独立性划分函数和 kernel 接口,那么整个建立金子
塔过程中数据流如下。
31
中国科学院软件研究所硕士论文
图 15 尺度空间生成的数据流图
为了减少 global memory 访存,我们可考虑合并两个分别在不同方向进行
Gaussian Blur 的 kernel。在合并后的 kernel 中,纵向的卷积操作后,中间结果不
写入较慢 Global memory 而是写入 local memory。这样,横向的卷积就能从 local
memory 中直接取到输入数据避免了 global memory 访问。
此外,数据流图显示一次 Gaussian Blur 的输入输出数据是相邻的两层,正好
是产生 1 层 DoG 的输入。虽然功能逻辑上独立,我们将相减和 Gaussian Blur 也
合并。因此,DoG 金字塔的生成将不需要额外的 global memory 读取而只依赖于
Gaussian Blur 的中间数据。
一次 Gaussian Blur 的输出也正是下次 Gaussian Blur 的输入,所以也存在将
两个以及多个 Gaussian Blur 合并的机会。进一步的,还可将 DoG(差分金子塔)
生成这一更加逻辑无关的步骤合并入 kernel,从而避免生成 DoG 图层时对两层
高斯金子塔的读取。因此,在生成尺度空间时对访存进行优化的关键在于以数据
流为脉络和依据,对逻辑独立的 kernel 进行合并,用 local memory 和 private
memory 等片上资源访问替代 global memory 访问。
值得注意的是,合并 kernel 也不是合并的越多越好。虽然合并 kernel 的数越
多 global memory 的访问就越少,但也会消耗更多的 local memory。Local memory
的过度消耗将大大降低活跃的线程数,则访存延迟将难以被掩盖。在尺度空间生
成步骤访存优化对比 CLSIFT 和 SIFTGPU 对比如表 6:
Global memory 访问 数据重用 活跃线程数
CLSIFT nOctave×nLayer 手动 cache(100%命中) 足够多
SIFTGPU 3 nOctave×nLayer 自动 cache 多
表 6 CLSIFT 与 SIFTGPU 在尺度空间生成步骤访存优化对比
除了尺度空间的生成,在关键点定位时对尺度空间的遍历也涉及很多的
global memory 读取。一种普遍接受习以为常的遍历顺序是先左到右,再自上而
32
中国科学院软件研究所硕士论文
下遍历完一层后继续下一层的左右上下遍历,从而完成整个空间的寻找。但值得
注意的是,寻找关键点时不仅需要的是当前遍历的图层,还需要相邻的上下 2 个
图层寻找 3 维的极值点。因此,每个点都要与他身边的三维空间的 26 个点进行
对比,并且所有的层都将作为前一层,正在使用层和后一层在检查中分别使用。
所以我们选择的处理顺序是在同一组中穿越各层的方式而不是在同一层中按照
本层图像的大小进行顺序的处理。并且,我们在局部内存中使用三个环形缓存,
这使得在处理时,每层可以迅速的消除和更新,如所示。使用环形缓存的好处在
于,对于每一层的数据从全局内存的读取只需要一次并扮演三个角色,减少了全
局内存的访问。
此外,虽然朴素的认为 26 个对比是必不可少的,但是我们将其变成寻找最
值和对比检测像素点。特定的情况下,我们首先获得同意水平线上联系的三个点
的附加值作为中间结果。接着,我们获得垂直方向上的连续三个点的极值作为中
间结果,也就是说,在同一层中相邻九个点的极值。最后,我们获得了三层的极
值,并且用已经检测到的关键点来进行比较。环形缓存在存储中间结果的方面显
示了他的价值。在环形缓存中重用中间结果,使得 CLSIFT 只需要并行的完成 6
次对比。因此,在该步骤中 CLSIFT 和 SIFTGPU 的对比如
图 16 环形缓冲
线程数量 运算操作数
CLSIFT 64×nKeypoint ~ NeighborRegionSize /8
s
SIFTGPU nKeypoints NeighborRegionSize
表 7 CLSIFT 与 SIFTGPU 在尺度空间搜索关键点访存优化对比
(3)负载均衡优化
当在整个尺度空间遍历寻找关键点时,显然不会是所有的点都满足需要
33
中国科学院软件研究所硕士论文
图 17 发生条件分支分歧的时间轴
在局部内存中设置队列和索引帮助 CLSIFT 来处理这些问题。这一个工作组
中,当 wavefront 运行来寻找极值,队列的索引会原子加,并且此时这个点会被
存放在队列中并被索引指出。并且,response 和曲率不会计算,除非队列的大小
超过了 wavefront 的大小或者是到了循环结束的时候。通过使用队列,分支被减
少。图 7 的结果变成图 18 的结果。
图 18 任务队列消去条件分支分歧的时间轴
对比图 17 和图 18,可以肯定的是队列减少了分支并且提高了运算速度。通
过测试我们知道,如果我们只进行一次计算,一些点将进入队列,此时的时间消
耗并不比没有队列时候的情况高。所以没有副作用,维持队列消耗很少但是得到
很高的效果。
除了 work-group 内的负载不均衡,sift 在 GPU 的实现同样因为关键点在图片
内分布的不均匀也还忍受着全局负载不均衡的问题。即使 work-group 内的负载
不均衡已经完全被任务队列处理好,整个应用的瓶颈在于处理关键点最多的
work-group。由于 global memory 的访问以及原子操作开销过大且缺少全局同步
的硬件支持,前面所叙述过的队列以及其他的变换粒度的策略难以使用,这些策
略运用到全局的开销甚至将超过负载均衡后的收益。
因此,需要考虑寻找一个开销小的策略来缓解全局负载不均衡。在统计趋势
上,很显然关键点在图片的二维空间里不会服从均匀分布,在关键点边沿和物体
附件关键点较多而较为平缓的背景上数目较少。但值得注意的是,某一块区域关
键点在高斯金字塔和差分高斯金子塔不同层中应该趋于服从均匀分布,因为物体
或者边沿的特征在不同尺度上都会展现出一定的特征。因此,应该基于不同层次
上的均匀分布对 work-group 进行划分,即完成一组图层的搜索后不同 work-group
交换搜索的区域继续检索从而使得各个 work-group 处理的任务量将更加趋于平
均,从而一定程度上缓解了负载不均衡的问题。
从全局负载均衡的角度上来说,扫描完每一层后即让 work-group 交换搜索的
区域效果会更好关键点的分布应该更趋于平均。但是若每一层就交换则环形缓冲
的策略会因上下层区域变化无法实施,引入更多的访存。考虑到高斯金字塔和差
34
中国科学院软件研究所硕士论文
分高斯金字塔本身就以放缩不同尺寸进行分组,因此可以考虑不同大小的图组
中,work-group 的区域进行互换,使得负载均衡和访存优化上进行平衡取得总体
上较好的结果。
4.2.2 优化效果测试
(1)正确性检测
图 19 GPU(左)与 CPU(右)检测效果对比
(2)性能检测
图 20 3 种实现的不同计算步骤在不同平台上性能
显然,CLSIFT 中所应用的优化策略使得其在整个算法过程中获得了良好的
性能。CLSIFT 对于 lena.jpg 的处理速度在 GPU 上分别达到了 43.4FPS,这比 CPU
的 10PFS 的速度要快了很多,同时也比已知的最快的 SIFTGPU 版本的 13FPS 快。
使用一组内容相同但大小不一的图像作为测试用例,测试了 CLSIFT,SIFTGPU
以及 OpenCV 的性能随图片大小变化趋势。依据图 21,CLSIFT 在各种情况下都
能实时的完成任务。在图片较小时有高达近 50FPS 的处理速度,甚至对 1080P
的高清图像 CLSIFT 依然有 25FPS 或 13.5FPS 的处理速度,相对于 OpenCV 的
2FPS 多和 SIFTGPU 的不到 10FPS 有可观的加速比。
值得注意的是,CLSIFT 在图片较小时对 SIFTGPU 的优势更为明显,随着图
片增大这一优势有减少的趋势。这主要是因为大图片有较多的关键点,此时
SIFTGPU 在分配方向和生成特征步骤中由于并行粒度较粗造成的设备利用率下
降的问题得到了一些缓解,减少了性能差距。
36
中国科学院软件研究所硕士论文
4.3.1 具体优化策略
(1)并行粒度选择
37
中国科学院软件研究所硕士论文
中每个单词的采样是独立的,而单词的每一个主题的概率计算也是独立的,具有
2 个层次的并行性。值得注意的是,一般而言待分类文档集的单词量是巨大的,
将远超过所需掩盖延迟的线程数甚至超过了 GPU 支持的最多线程数。因此,无
论采取哪种并行粒度都需要引入 Persistent thread 的策略保证实现能对所有单词
都正确处理。
若采用细粒度的并行方式,则每个单词将分配到一个 work-group 上计算,每
个线程计算一个主题的概率,之后规约找出最大可能的概率再重新分配主题和更
新信息,如下代码。
For all work-groups in parallel do
Initialize to progress one word only
For all threads in parallel do
Sampleone topic basing on other words’ topics and counters, ignoring the data dependency.
Reduce operation to find the most probable topic to be the new one
Update word’s topic and counter
很显然,这种细粒度的并行方式在主题数较小的情况下将降低设备效率,引
发一些问题。具体为:
1. 在某些较极端情况下,主题数较小可能远低于 64 的 wavefront 的大小。造
成大量的线程和计算设备空闲。
2. 各个线程计算主题概率后需要一次规约操作来获得最可能的新主题,在规
约过程中一些线程势必要空闲。
3. 规约前各个主题的概率和一些中间结果必须存储在 local memory,导致
GPU 片上资源消耗增多,使得活跃线程数变少潜在影响了延迟的掩盖。
由于单词数一般是巨大的,将每个单词分配到一个线程中进行计算采用粗粒
度的并行也是可以考虑的,此时每个主题的概率计算式串行的,不会出现因为主
题数小于 wavefront 大小导致线程空闲,也不会存在规约带来的额外开销和 local
memory 消耗。在各个主题概率串行逐个计算的过程中,这一最值就能被记下。
但该粗粒度并行也存在如下的问题:
1. 当采用粗粒度并行时,将会有更多的单词同时进行采样并更新所分配的主
题。这将对数据依赖带来更大的破坏,更多的单词进行采样时依据的旧数
据而不是新数据。这将导致收敛的速度变慢。.
2. 更多的单词同时进行采样并更新所分配的主题还意味着更多的 global
memory 上的原子操作和数据竞争。这也将使得更新信息的速度变慢。
综上所述,无论是细粒度还是粗粒度的并行都有着其各自优点和不足。因此
在实践才用了根据输入规模和特点动态决定并行粒度的方法。当主题数超过
wavefront 大小时,采用细粒度的主题概率计算并行,使得计算并行的前提下尽
可能减少数据依赖的破坏保证收敛的速度,并有效减少数据竞争。而当主题数较
小可能造成线程空闲过多时采用粗粒度的单词并行,避免 wavefront 中线程空闲
和规约操作的开销。
此外,值得注意的是作为蒙特卡洛算法,Gibbs Sampling 在采样过程中需要
大量的随机数。而 GPU 的 kernel 中并不直接提供 RNG (Random Number Generator)
的 API 和扩展,若使用 CPU 串行生成再上传到 GPU 将引入极大的开销而且将占
据宝贵的存储资源。因此,将研究 GPU 上实现 RNG 的方法。
38
中国科学院软件研究所硕士论文
伪随机数产生算法中应用最广泛的是线性同余法。所谓线性同余算法是将随
机数种子与 2 个满足一定特殊要求的质数做线性变换后取余数生成下一个伪随
机数,如公式。
39
中国科学院软件研究所硕士论文
图 22 硬件全局同步支持示意图
GroupID: work-group 的 ID
OutFlag: 该 work-group 的同步标志,可为 0 或 1,表示该 work-group 是否到达
全局同步点。
OutMask : 其 他 work-group 的 ID 掩 码 数 组 , 表 示 该 work-group 哪 些 其 他
work-group 所依赖,需要向他们的发送同步到达信息。
InFlags:从片上网络收到的其他 work-groups 的同步信号信息标志数组。
InMask: 其他 work-group 的 ID 掩码数组,表示该 work-group 依赖于哪些其他
work-group,需要向等待他们的送来的同步到达信息。
Pattern: 行为决定逻辑,决定何时对标志位进行全 clear,全 set,以及轮询等待
等操作。
Sync: 根据 inflags 标志数组以及 pattern 逻辑做出同步判别逻辑。当每收到一个
inflags 更新信号,对 inflags 和 pattern 进行一轮检查判断是否满足同步条件。
Packet generator logic: 根据 outMask 掩码,生成发送到其他 work-group 的 outflag
包。
Packet receives logic: 接收由其他 work-group 发送到本 work-group 的 outflag 包,
并在 inflags 中保存。.
4.3.2 优化效果测试
(1)正确性检测
为了验证 GPU 并行实现的正确性,选取了 1000 篇英文新闻由 CPU 和 GPU
分别进行文本分类。实验结果表明,两者给出了相似的分类效果,但不 100%一
致。比如,CPU 与 GPU 分别给出经贸相关主题中最高概率的 20 个单词分别为:
CPU:
Stock price market rate roseshare dollar bond tradindustry fell month
centdateline dealer treasuri York yield govern decemb novemb
GPU:
Price stock market exchange trade trade bond York rate trader
rosedollar share Chicago jefferi industry fell future feder secur
虽然结果只是相似,但很显然这些单词都有着经贸相关性,这 2 种结果都是
能被人理解的。造成这一差别的原因主要有:
1.如 2.3 节所述,LDA 算法本身不能并行。AD-LDA 并行实现 LDA 是以牺
牲数据依赖性为代价的,因此 AD-LDA 算法和串行实现相比结果肯定有差别。
2.Gibbs Sampling 作为蒙特卡洛算法在计算过程中需要用到随机数,即使是
40
中国科学院软件研究所硕士论文
串行的实现 2 次运行的结果也会有不完全一致的地方。随机数的存在也使得结果
会有差别。
3.GPU 上的 FPU 和 CPU 的运算结果不完全一致,在多次迭代累中计误差,
将造成结果上的差异。
为了验证 GPU 运算精度对结果的影响,本文进行了一些实验。实验中,GPU
只发起一个线程工作来维护数据的依赖性,并让 CPU 和 GPU 使用同一个随机数
种子来消除随机数不同的影响。实验记录了多种主题数下 GPU 分别以 float 与
double 两种数据类型进行运算,和 CPU 以 float 类型进行运算时,在某一个单词
在某一个主题上的主题概率差的绝对值,如下图。
Compute Unit(CU) 48 3 4
Cores 1536 192 4
Wavefronts Size 32 64 1
Flops 2.37T Flops 131.52 G Flops 11.32G Flops
Local Mem/CU 48KB 16KB No Info.
Local mem banks 32 32 No Info.
Register file/CU 128KB 128KB No Info.
表 9 测试平台参数
依旧对 1000 英文新闻进行 1000 次迭代,OpenCL 在 APU 和 Nvidia GPU 上
相对于 CPU 的加速比分别为 1.35 和 40,比较可观,如表 10:
平台 时间 加速比
Intel Core2 Q9550 527s None
(CPU 实现)
GLDA 开源项目 36s 15
A-6 389s 1.35
GTX 680 13.6s 40
表 10 性能测试结果
从上表可知,LDA 的 GPU 实现最高达到了 40 倍的加速比,非常可观。但
GTX-680 和 A-6 两个不同平台上表现差异较大,这主要是因为 2 大硬件平台在
以下 3 方面的差异。
1. GTX680 本身有更多的计算核心和更高的理论计算峰值在并行度很高时更
具有优势,而 AD-LDA 忽略单词间采样的依赖关系后每个单词的计算十分独立。
2. 此外 GTX680 具有更多的 local memory 和 private memory 片上资源有利于
发起更多 Persistent thread 数。
3. 最为重要的是,A-6 将普通的 DDR3 主机内存中的一部分独立划分作为显
存,而 DDR3 与 GDDR5 相比带宽更窄访存延迟更大。
42
中国科学院软件研究所硕士论文
第五章 总结与未来工作展望
5.1 工作成果总结
与大多数算法有很大不同,机器学习算法本身并未包含解决问题的逻辑。它
们大多基于统计从大量的训练数据中提取规则训练模型,从而得到可推断其他待
检测数据的模型或规则。因此,机器学习算法有着如下的特点:
1.迭代训练模型以及逼近最优解时的密集计算特点。
2.因反复访问训练集或待检测目标的密集 I/O 特点。
3.检测规则的复杂造成的程序条件逻辑复杂性。
因此,机器学习算法在训练阶段往往会消耗很长的时间,而在检测部分则往
往难以满足实时性要求强的应用场景要求。针对这一问题,本文研究了基于
OpenCL 在 GPU 并行实现并优化机器学习算法的方法,并针对机器学习算法的特
点在以下三个方面提出了具体的优化策略。
(1)并行粒度策略
机器学习算法的可并行性是进行 GPU 并行的根基性问题,而很多时候机器学
习算法本身可以在不同层次上进行并行。对于 GPU 而言,选择何种并行粒度将
决定整个并行实现的主体框架和优化空间。一般而言,粗粒度并行各个线程的独
立性较强互相依赖少,无同步和通讯开销,但由于任务数相对较少无足够线程切
换填满流水线掩盖延迟。而细粒度并行使得能并行的任务数变多能提供更多可调
度的 wavefront 数将众多计算核心充分利用,但更可能将引入更多的同步和通讯
开销。因此,本文从具体算法的特点出发,从算法并行性、数据依赖以及 GPU
设备本身特点 3 方面入手研究粗和细之间进行合理取舍的方法。
在 Viola-Jones 人脸检测中,虽然有检测窗口和特征值计算 2 层可并行性,由
于检测窗口数目本身已经超过所需活跃线程数且可以避免特征值计算并行额外
的归约开销,因此选择较粗粒度的检测窗口并行粒度并使用 Persistent thread 策
略只发起足够的线程数来处理过大的图像。而在 SIFT 特征提取中,由于特征点
可能过少方向分配和描述子生成往往无法发起足够多的线程使得设备使用率低
下,因此采用各个线程分区域首先在子直方图上统计,再归约为总直方图的策略
挖掘更细粒度的并行从而有效利用 GPU 的计算能力。而在 LDA 算法中,也存在
单词和主题概率计算的 2 层可并行性,无论是细粒度还是粗粒度的并行都有着其
各自优点和不足。因此采取了根据输入规模和特点动态决定并行粒度的方法。当
主题数超过 wavefront 大小时,采用细粒度的主题概率计算并行,尽可能减少数
据依赖的破坏保证收敛的速度。而当主题数较小可能造成线程空闲过多时采用粗
粒度的单词并行,避免 wavefront 中线程空闲和规约操作的开销。
43
中国科学院软件研究所硕士论文
(2)访存优化策略
在训练阶段和检测阶段机器学习算法都需要频繁的访问训练样本集和待检
测数据,由于 global memory 访问延迟较大如何填满 GPU 流水线喂饱 GPU 并行
计算能力是优化的关键问题。本文主要立足于具体算法的访存模式进行访存优化:
一是从访存局部性和存储层次入手,研究 local memory 作为手动 cache 与自动
cache 的优势;二是从数据流入手,合并逻辑独立但数据流上联系的 kernel 以及
设置循环缓冲将数据角色互换来减少访存;三是平衡好片上读写速度很快的寄存
器以及 local memory 使用与用来掩盖访存延迟的活跃 wavefront 数进行合理平衡
和取舍。
在 Viola-Jones 人脸检测算法中,主要是设计了 2 维的 local memory 作为手动
cache,达到了 100%的命中率并尽量减少了片上资源使用。SIFT 算法中除了将 local
memory 作为手动 cache 使用,在尺度空间生成步骤依据数据流图对逻辑独立的
kernel 进行合并,在尺度空间中寻找关键点时则使用了循环缓冲。Kernel merge
和循环缓冲都有效的减少了 global memory 的访存。而在 LDA 文本分类算法的计
算过程中每次迭代后都需要读取最新的数据本身没有数据重用,但每次迭代后的
全局同步中的 global memory 原子操作和访存有很大提升空间,本文在软件实现
一个无锁的全局同步后进一步设想了利用片上资源实现的硬件全局同步机制彻
底解决因访存和原子操作带来的高消耗。
(3)负载均衡策略
虽然在任务划分很容易能做到任务数的平均,但由于每个任务所走的逻辑分
支不一样其耗时只有运行时才能决定,所以绝对的负载均衡在逻辑负载的机器学
习算法中很难实现。由于 GPU 特有的条件分支分歧问题,负载均衡更是 GPU 优
化的难点问题。对于 work-group 内的由于条件分支分歧引发的负载不均衡,本
文主要从消除条件分支分歧的来源和消除条件分支分歧的影响 2 方面分别提出
了任务队列和动态变换并行粒度的策略,前者适用于分支较少的情况后者时候分
支较多的情况。而在 work-group 间的全局负载均衡问题,为了避免全局调度的
开销比负载均衡受益还大,主要是采用了简单的基于统计趋势的任务划分方法,
缓解了全局负载均衡问题。
在 Viola-Jones 人脸检测算法中,由于级联分类器的级数一般有 2,30 之多,造
成条件判断语句的分支很多,故采用了动态变化并行粒度的方案消去条件分支分
歧造成的设备利用率下降的影响。而在 SIFT 的关键点检索中,由于只需要判断 3
个条件分支较少,则采用了队列的方式当队列里的任务数凑满一个 wavefront 的
倍数后再运行,从而直接从根源上消去了条件分支分歧。而针对 SIFT 的全局负
载不均衡,则利用关键点在同一区域不同图层分布区域均匀的特点,让
work-group 搜索完一组图层后互换区域扫描使得处理任务量趋于一致,缓解问
题。
总体来说,本文很好的总结了现有机器学习算法本身的 3 大特点,并针对性
44
中国科学院软件研究所硕士论文
5.2 未来研究
45
中国科学院软件研究所硕士论文
参考文献
[1]. Denning, P.J.. Computer Science: The Discipline (PDF). Encyclopedia of
Computer Science. 2000.
[2]. TH Cormen,CE Leiserson, and RL Rivest. Introductions to Algorithms. MIT
Press, 1990
[3]. Bishop C M. Pattern recognition and machine learning[M]. New York: springer,
2006.
[4]. Mayer-Schönberger V, Cukier K. Big data: A revolution that will transform how
we live, work, and think[M]. Houghton Mifflin Harcourt, 2013.
[5]. Cook S. CUDA Programming: A Developer's Guide to Parallel Computing with
GPUs[M]. Newnes, 2012.
[6]. Khronos OpenCL Working Group. The OpenCL Specification; 2011[J]. URL
http://www. khronos. org/opencl.
[7]. Viola P, Jones M. Rapid Object detection using a boosted cascade of simple
features[C]//Computer Vision and Pattern Recognition, 2001. CVPR 2001.
Proceedings of the 2001 IEEE Computer Society Conference on. IEEE, 2001, 1:
I-511-I-518 vol. 1.
[8]. Viola P, Jones M J. Robust real-time face detection[J]. International journal of
computer vision, 2004, 57(2): 137-154.
[9]. willowgarage, opencv, http://opencv.willowgarage.com/wiki/
[10]. Ghorayeb H, Steux B, Laurgeau C. Boosted algorithms for visual object
detection on graphics processing units[M]//Computer Vision–ACCV 2006.
Springer Berlin Heidelberg, 2006: 254-263.
[11]. Sharma B, Thota R, Vydyanathan N, et al. Towards a robust, real-time face
processing system using cuda-enabled gpus[C]//High Performance Computing
(HiPC), 2009 International Conference on. IEEE, 2009: 368-377.
[12]. Oro David, Fernández C, Saeta J R, et al. Real-time GPU-based face
detection in HD video sequences[C]//Computer Vision Workshops (ICCV
Workshops), 2011 IEEE International Conference on. IEEE, 2011: 530-537.
[13]. Lowe D G. Object recognition from local scale-invariant
features[C]//Computer vision, 1999. The proceedings of the seventh IEEE
international conference on. Ieee, 1999, 2: 1150-1157.
[14]. Hefenbrock D, Oberg J, Thanh N, et al. Accelerating Viola-Jones Face
Detection to FPGA-Level Using GPUs[C]//FCCM. 2010: 11-18.
[15]. Lowe D G. Local feature view clustering for 3D object
46
中国科学院软件研究所硕士论文
[30]. Duane Merrill, Michael Gariand, Andrew Grimshaw, “High Performance and
Scalable GPU Graph Traversal”: 2011.
[31]. Timo Aila, Samuli Laine, “Understanding the efficiency of ray traversal on
GPUs”, Proceedings of the Conference on High Performance Graphics 2009:
145-150 August 2009.
[32]. Xiao, Shucai, and Wu-chun Feng. "Inter-block GPU communication via fast
barrier synchronization." Parallel & Distributed Processing (IPDPS), 2010 IEEE
International Symposium on. IEEE, 2010.
[33]. Aila T, Laine S. Understanding the efficiency of ray traversal on
GPUs[C]//Proceedings of the Conference on High Performance Graphics 2009.
ACM, 2009: 145-149.
[34]. Volkov, Vasily, and James Demmel. "LU, QR and Cholesky factorizations
using vector capabilities of GPUs." EECS Department, University of California,
Berkeley, Tech. Rep. UCB/EECS-2008-49, May (2008): 2008-49.
[35]. Fatica, Massimiliano. "Accelerating Linpack with CUDA on heterogenous
clusters." Proceedings of 2nd Workshop on General Purpose Processing on
Graphics Processing Units. ACM, 2009.
[36]. Panetta, Jairo, et al. "Accelerating Kirchhoff migration by CPU and GPU
cooperation." Computer Architecture and High Performance Computing, 2009.
SBAC-PAD'09. 21st International Symposium on. IEEE, 2009
48
中国科学院软件研究所硕士论文
简历
基本情况
王伟俨,男,湖南省邵阳市人,1989 年出生。中国科学院软件研究所计算机
软件与理论专业硕士研究生。
教育背景
2011.9——至今 中国科学院大学(培养单位:软件研究所)攻读工学硕士学位
2007.9——2011.7 华中科技大学计算机科学与技术学院计算机科学与技术专
业获工学学士学位
2008.9——2011.7 华中科技大学外国语学院英语专业获文学学士学位(第二学
位)
获奖情况
2012 年 AMD GPU\APU 异构编程大赛全国第 3 名
2009 年全国大学生数学建模大赛湖北省二等奖
华中科技大学 2009 年度科技创新先进个人荣誉称号
2008 年华中科技大学飞航杯数学建模大赛优胜奖
2008 年华中科技大学飞航杯 ACM 校园赛三等奖
2011 年华中科技大学优秀毕业生
2010 年华中科技大学校级优秀学生干部
2009 年自强奖学金
社会兼职
CSDN 论坛 OpenCL 及异构计算版块版主及 CSDN 领域顾问
研究兴趣
机器学习,并行计算
联系方式
通讯地址:北京市海淀区中关村南四街 4 号,中国科学院软件研究所并行软件
与计算科学实验室。
邮编:100190
E-mail:[email protected]
49
中国科学院软件研究所硕士论文
研究生期间发表的论文
1. Wang Weiyan, Zhang Y, Yan S, et al. Parallelization and performance optimization
on face detection algorithm with OpenCL: A case study[J]. Tsinghua Science and
Technology, 2012, 17(3): 287-295.
2. Weiyan Wang, Yunquan Zhang, Guoping Long, Shengen Yan and Haipeng Jia
CLSIFT: An Optimization Study of the Scale Invariant Feature Transform on GPUs
IEEE 15th International Conference on. High Performance Computing and
Communication 2013
3. Jia H, Zhang Y, Wang Weiyan, et al. Accelerating Viola-Jones Facce Detection
Algorithm on GPUs[C]//High Performance Computing and Communication & 2012
IEEE 9th International Conference on Embedded Software and Systems
(HPCC-ICESS), 2012 IEEE 14th International Conference on. IEEE, 2012: 396-403.
其他学术性成果
1.计算机视觉算法优化工作进入著名开源项目 OpenCV 函数库(该领域的工业界
事实标准)
2. 2012 年 AMD GPU\APU 异构编程大赛全国第 3 名
50
中国科学院软件研究所硕士论文
致谢
白驹过隙,转眼间我已经在中国科学院软件所度过了近三年的美好时光,又
将踏上新的人生旅途。在这三年里,我有幸能受到国内高性能计算领域颇有造诣
的老师们指导,并在朝夕相处中获得了很多同窗的帮助和友谊,最重要的亲身感
受到了中国科学院勇攀科学高峰的精神以及严谨务实的学术氛围。在临别之际,
往日美好的一幕幕又浮现在我的眼前,我希望能对所有陪伴我走过这美好三年的
人们道一声谢谢。
首先,我想要衷心感谢的是我现在的导师龙国平副研究员。您不仅在硕士在
读的最后一年里以导师身份指导我,而且在我大四时进入实验室实习时就对我在
具体技术问题有很多的指导和帮助。您借助自己在计算机体系结构的经验和心得
进行指导,让我更深入的理解 GPU 硬件结构的特点。而您在思考问题和写作的
方法上给我了不少好的建议,也让我有很大的收获。在此,我对您所付出的辛劳
表示最真诚的感谢!
其次,我还想对研一和研二的导师张云泉研究员表达深深的谢意。张老师一
方面对学术严肃认真,另一方面在生活上却平易近人,在学习和生活上都给予我
很大的帮助。虽然我最终没有转博,但张老师还是给我提供了很多的学术交流机
会,让我在和学术界、工业界的前辈的交流中看到了新的一片天地,获得了更多
更快的成长。除了具体的技术知识,我从您身上还学到了一些沟通交流的软技巧。
在此,我想对您给予的帮助和关心表示诚挚的谢意!
此外,我想由衷的感谢实验室的李玉成研究员、孙家昶研究员、曹建文研究
员、李会元研究员、徐进研究员、杨超研究员、姚继峰高级工程师、马文静副研
究员、邓攀副研究员,王婷副研究员,张常有副研究员,马菲菲副研究员。你们
在计算机科学领域的深厚造诣以及严谨治学的态度是我学习的榜样。尤其要感谢
马文静老师对本文提出了很多宝贵和细致的建议!
衷心的感谢实验室的张先轶、刘芳芳、解庆春、杨聪利、吴学淞等员工,感
谢你们对实验室的辛勤工作和在工程上学习上对我的帮助和支持。衷心的感谢实
验室的郭丹、李希代、李佳晨和张广婷 4 位秘书,感谢你们多年如一日不怕繁琐
不畏麻烦的服务和支持。
衷心的感谢我的师兄师姐颜深根、贾海鹏、张樱、王茜、刘益群、袁良、乔
海军、肖玄基、庞旭、蒋丽媛等,你们在学习和生活上为我提供了很多宝贵的帮
助和建议,特别是颜深根师兄和王茜师姐给予了我很多启发。衷心的感谢我的同
级同窗孙乔,单炜琨,张慧荣和袁伟,感谢你们和我一起度过在科院的这些一起
成长的美好日子,入学甚至保送复试的日子还仿如隔日。衷心的感谢我的师弟吴
振华、王迪林、敖玉龙、张鹏等,感谢你们给实验室带来新的欢笑和乐趣。
51
中国科学院软件研究所硕士论文
衷心的感谢我的父母,你们不仅用心血养育了我,而且一直是我最坚强的后
盾。衷心的感谢在北京的外公、外婆、舅舅、舅妈以及妹妹,你们让我不仅在异
乡吃到家乡菜还感受到了家的味道。
最后,谨向百忙中抽出宝贵时间评审本论文的专家和学者致以最诚挚的谢
意!
52