说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

专访西电黄宝林:《基于GPU的并行NMF网络聚类算法》获奖背后故事

HTML文档下载 WORD文档下载 PDF文档下载
在2012 AMD APU/GPU异构开发大赛上,来自于西安电子科技大学的黄宝林、周洋、陈晓伟脱颖而出,他们在朱虎明老师的带领下,组队参赛并凭借作品《基于GPU的并行NMF网络聚类算法》成功获奖。

CSDN专稿 异构开发正在受到更多人关注,在 2012 AMD APU/GPU异构开发大赛上,来自于西安电子科技大学的黄宝林、周洋、陈晓伟脱颖而出,他们在朱虎明老师的带领下,组队参赛并凭借作品《基于GPU的并行NMF网络聚类算法》成功获奖,CSDN记者日前就作品选题、算法设计以及对异构开发的看法等话题采访了这个团队代表黄宝林。

获奖团队(左起):周洋、陈晓伟、黄宝林

以下是对话内容:

CSDN记者:请先简单介绍一下你们的专业和研究方向。

黄宝林:我们都是属于西安电子科技大学智能感知与图像理解实验室。研究生期间的研究方向为网络数据挖掘、智能优化算法及其应用等。

CSDN记者:请谈谈你们参加异构编程大赛提交的项目内容。

黄宝林:我们参加比赛的作品题目是“基于GPU的并行NMF网络聚类算法”。

网络聚类是指在复杂的网络数据中提取出网络对象的聚类信息,揭示网络中真实存在的聚类结构。这个问题也一直是数据挖掘、模式识别等领域的热点问题之一。

非负矩阵分解算法(NMF)是实现大规模数据处理与分析的一种有效工具。NMF同时是解决复杂网络聚类问题的一个十分有效的算法。

由于NMF算法时间复杂度比较高,不能满足大规模网络聚类的时间要求。在比赛中,我们提出了两种基于GPU的NMF加速算法,并且取得了比较好的加速效果。

CSDN记者:你们是怎么选题(想到)并决定做这个点的?

黄宝林:网络聚类是我们读研期间一直在做的研究课题。在此期间,阅读了大量的相关论文,对一些主流的网络聚类算法有一些了解。在比赛的选题过程中也提出了多个不同的方案,选择的依据主要是以下几个方面:
第一:选定的算法一定是主流的,也就是算法是被大家认可并且是有效的。
第二:算法需要通过并行化来提高效率。
第三:算法要适合于采用GPU进行并行化处理。

NMF算法很好的满足了上述的要求:

首先非负矩阵分解在解决网络聚类,尤其是重叠网络聚类问题上是有效地,它的聚类准确性很高。同时NMF算法不仅能处理这一类问题,在其他的领域,诸如文本分析,人脸检测,图像分割等,都有广泛的应用。

最后NMF算法的时间复杂度比较高,我们的问题中它的复杂度是O(kN2)。串行的NMF算法最多能处理5000个节点的网络。另外NMF的算法主体部分都是是矩阵的相关操作,很适合于用GPU来处理。

CSDN记者:参赛作品设计过程中有哪些困难?如何解决的?

黄宝林:首先是算法的调试问题。因为算法迭代部分的主体都放到了GPU上进行,迭代过程中不用回传数据。因此如果程序中某个核函数有了错误就很难发现,当时也没发现能对核函数进行单步调试的工具。我们在调试中基本上都是靠printf语句对处理的中间结果进行显示。不过这个笨办法确实很有效。在后期我们发现AMD发布了CodeXL调试工具,那时候算法已经基本调试完毕了。不过在后面对算法进行优化过程中,CodeXL还是帮了我们大忙。 

在优化过程中,首先考虑的是典型的矩阵操作(包括矩阵相乘,转置等)。一般的方法都是对结果矩阵进行映射,仅仅利用global memory进行读写数据。然而,发现这样优化效率并不高,最终我们考虑利用local memory,进行了改进,将多个线程分块放到group中,一个group中的线程同时读写显存,显存的读写连续性得到了保证,速度就得到了提高。

遇到另一个比较重要是数据的存储问题,也就是网络数据的存储。如果直接存储邻接矩阵,显存很容易就被占满。比赛用的AMD 7770显卡只有1G的显存,如果直接存储邻接矩阵的话,网络规模大于10000的时候,数据就存不下了。

解决方案就是利用稀疏表示(CSR)的方法进行存储。但是对CSR表示之后的矩阵进行相乘操作又会出现问题:很难进行右乘操作。为了解决这个问题,只好事先要保存两份网络的邻接矩阵数据,一份以基于行的CSR格式存储,另一份以基于列的CSR格式存储,虽然是两份数据的存储,但是相比于直接存储邻接矩阵能节省大约90%的空间。最终结果显示,经过稀疏表示之后的算法不仅解决了数据存储的问题,而且速度竟然也比原来更快了。

CSDN记者:怎么设计/实现并行化?(开发者很关注什么样的算法适合并行,你怎么看)

黄宝林:在这次比赛过程中,我们首先实现了最简单的并行版本,然后逐步深入地优化各个细节。这个过程中,调试工具CodeXL给了很大的帮助,CodeXL可以以表格的形式列出每个核函数运行时间,通过查看表格,我们可以看出哪些核函数需要进一步优化,从而不断地优化各个核函数。

首先,GPU是图形处理器,它对图像、矩阵等操作具有很高的效率,所以如果算法涉及到图像或矩阵的相关操作,可以采用GPU进行并行化。

其次,如果某个问题可以分解为很多子问题,而子问题之间又是相对独立的,那么我们认为对该问题并行化可能会取得好的效果。

CSDN记者:如何接触到异构编程的?如何上手异构编程的?对异构编程的未来怎么看?

黄宝林:接触到异构计算,主要是通过朱老师开的高性能计算的课程吧。而且之前师兄也参加过相关的比赛,因此我们对OpenCL,CUDA也并不陌生。整个过程中朱老师给与了很多的帮助。

开始的时候主要是看书,除了AMD公司的异构计算系列丛书之外,还看了”The OpenCL Programming Book”,”OpenCL in Action”,AMD的OpenCL大学教程。对概念有了了解之后就是把环境搭好进行动手编程。从简单的例子看起,然后再根据别人的例子进行修改,观察结果,再修改,再观察结果以此重复。

相信异构计算在未来能够得到更大的推广。

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘