面向未来计算-异构开发技术社区

GPU/APU加速库、算法及应用

通过和全球业界伙伴、高校、研究机构之间的广泛合作AMD一直致力于异构计算生态系统的建立和发展。我们将APU/GPU异构开发资源分享于此,并持续更新中,给开发人员以启发和参考;同时,我们希望能抛砖引玉,期待大家的参与与贡献,不断丰富和完善异构开发资源!

如果您需要添加资源或更详细信息,请联系xiaomin1.zhang@amd.com

一、开源库源代码优化

  • 1、图像处理相关
  • 2、视频处理与多媒体技术
  • 3、数据加密、压缩与管理
  • 4、网络防御
  • 5、数学库

二、算法及应用优化

  • 1、计算机视觉相关
  • 2、经典数学问题并行优化
  • 3、数据挖掘与人工智能
  • 4、其他

三、更多开发工具与库

*感谢MULTICOREWARE公司(MCW)的支持,以下带*号资料由MCW公司提供。

一、开源库源代码优化

1、图像处理相关

GIMP*

GIMP是一个GNU图像处理程序,是一个功能强大的Photoshop的替代软件,基于GTK+开发,可以再Windows, Linux和Mac下运行。然而,GIMP图像处理性能低,一直是个很大的问题。

通过优化GIMP核心库GEGL和BABL,我们可以提高了GIMP的图像处理性能。优化后的GEGL利用GPU实现了色彩空间转换,而不是使用串行的BABL,转换效率明显提升。我们还可以进一步优化了GEGL和GIMP之间的数据传输,并利用OpenCL对超过20个算法进行了优化,都取得了非常明显的性能提升。

OpenCV*

OpenCV 是一个知名的开源图像处理工具包。我们为OpenCV实现了一系列基于OpenCL加速的API,包括人脸识别算法等复杂算法。其中人脸识别算法被应用到一个叫IrfanView的图像处理软件里面。通过OpenCV的加速,这个软件具备了在大量照片中过滤人物照的功能。除此以外,一些更底层的算法同样有GPU的版本,这些算法方便开发人员用多个算法构造一个pipeline型的复杂应用,从而充分发挥GPU和CPU的综合性能。

人脸识别在IrfanView当中的应用在AFDS2012当中有单独的报告来展示。

ImageMagick*

ImageMagick 是一个开源的图像处理库和个人照片增强工具。它将数百个应用集合成一个库。它可以处理各种各样的图片格式,包括DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG, and TIFF. 用户可以使用ImageMagick来对图像进行缩放,翻转,备份,旋转,扭曲,裁剪,转换,调节颜色,应用各种特效或者是绘制文本、线、多边形、椭圆和贝塞尔曲线。我们使用OpenCL来优化ImageMagick处理图像的过程,在AMD Trinity平台下得到90倍的加速。下面试进行的修改:

  • 使用OpenCL优化图像处理中的滤镜
  • 引用了一个OpenCL管理组件,它包含了一个OpenCL后台程序,可以用来管理所有的OpenCL操作,例如在图像处理命令之外执行kernel程序,这个功能提高了整体效率。
  • 用OpenCL优化了JPEG解码。
  • 使用x86和x86-64指令来优化霍夫曼解码和编码过程。

这些工作已在AFDS2012公开发布。 

JPEG for Browsers*

JPEG是在网页上使用最频繁,有着非常大的影响力一项图片压缩技术。

我们实现了libjpeg-turbo的OpenCL加速版本,优化了JPEG解码算法,并集成进Chromium,加速后的解码算法包括了baseline模式和progressive模式,支持不同的JPEG采样比率(4:1:1, 4:2:2(H), 4:2:2(V), 4:4:4)。

2、视频处理与多媒体技术

X264*

X264 是一个开源的,世界领先的H264视频编码库,无论在质量,速度,还是在下载量上看都是排名靠前的编码器。据估计,已有超过10亿的下载量。许多视频处理相关的第三方应用程序都把x264作为其内在的H264编码器,其中就有非常著名的VLC播放器,视频转码器Handbrake等等的。

我们的工作就是对x264的look ahead的功能采用OpenCL来进行优化。Look ahead的工作主要是通过对每个视频帧进行计算,其中包括计算MV,判断场景切成等等,来确定该帧的帧类型(I帧, P帧和B帧),从而供x264编码器的后续编码流程来使用。我们通过优化该部分的功能,使得编码器的一部分计算转移到了GPU上,这样在利用GPU的情况下,提高了CPU处理在整个编码器流程中更加有效的工作。

我们已经在 AMD主办的AFDS2012的会议上,展示了look ahead 功能的优化。

VLC*

VLC是世界上下载量最多的、免费的、开源的跨平台多媒体播放器,其框架支持大多数类型的多媒体文件的播放。在优化工作中,我们将AMD APU独有的“steady video”硬件特性集成到VLC中,在播放过程中可以减少视频的抖动。我们使用OpenCL优化了VLC的scale过滤器,在播放期间可以快速的放大或缩小视频。VLC中的De-noise过滤器是用来减少视频中的噪点。对De-noise过滤器我们也使用OpenCL进行了优化。在AMD APU平台上,这些特性和优化可以获得更好的视频播放体验。

这些工作在AFDS2012期间已经发布。

Handbrake*

Handbrake是非常流行的视频转码应用程序,其使用了x264编码器作为H264编码器。我们实现了“OpenCL-scale”,在Handbrake的工作管线中使用OpenCL优化了scale过滤器;实现了“OpenCL-x264”,使用OpenCL优化了x264编码器;实现了“Hardware-decode”,使用AMD硬件解码功能实现了硬件解码;而且优化了Handbrake的转码流程。

FFMPEG*

FFmpeg是一款领先的多媒体框架。其能够解码,编码,转码,封装,解封装,流处理,滤波以及支持播放用户可能会遇到的几乎所有的视频格式。它支持目前的领先的最广泛的格式,无论格式是否由一个标准委员会,一个社区或一个公司设计的。我们集成AMD硬件解码器(DXVA2和OpenDecode)、OpenCL加速滤波器以及AMD的硬件编码器(OpenEncode)到FFmpeg中。同时,还对许多FFmpeg中的滤波器进行了优化,比如deshake和scale。对处理单一视频的Thumbnail操作进行了优化。我们还实现了interop功能,这个功能使视频数据在视频解码器和后续的视频后处理操作保证数据在GPU中。

3、数据压缩、加密以及管理

Crypto++*

Crypto++ (也被称为CryptoPP)是一个自由且开源的关于加密算法与加密方案的C++类库。它已经被广泛应用于学术界、开源项目、非商业项目以及商业领域。据估计,有超过200个项目使用了Crypto++。AES(Advanced Encryption Standard)是Crypto++的众多加密算法中一个以高性能著称的分组密码算法。由于它在一些通用模式中有着较小的上下文依赖,我们可以用并行计算显著地优化它的性能。在过去,通过优化初始pipeline的方式,我们可以灵活运用CPU计算力(例如AES-NI)与OpenCL GPU处理能力取得预期的总体处理性能。

这项工作被公布在AFDS2012

Hadoop / Mahout*

Apache Hadoop是一个支持数据密集型分布式应用的开源软件框架。它支持在由日常硬件组成的大型集群上运行应用程序。Hadoop框架透明地为应用程序提供可依赖性与数据转移。Apache Mahout是一个可扩展机器学习库的集合。

我们实现了在GPU上的Map阶段(Map-phase)排序算法优化,与Reduce阶段(Reduce-phace)归并排序算法优化。MCW在此基础上实现了 Aparapi矩阵相乘,并且使用 OpenCL、JOCL 和Aparapi根据测试用例做出了性能比较。其他相关工作包括I/O分析、MD5校验和(checksum)、压缩、调度,与使用JNI代替JOCL后的性能结果测试。其他实现的项目包括 CRC CheckSum加速,Mahout K-Means加速与一个新的GPU压缩算法。

Memcached*

Memcached是数据库缓存机制,通常被一些公司当做一种重要的优化基础设施来响应大量的互联网驱动的数据库查询,例如google和facebook。

我们实现了一个memcached的基准测试工具,对memcached内部结构的性能做了一些优化,以及通过UDP多端口回复进行网络优化。使用OpenCL实现了memcached的哈希查找功能,通过一个循环的缓冲区技术减少了memcached中"get" 的延迟。

4、网络防御

Snort*

Snort是一个由Sourcefire开发的开放源代码的网络入侵检测与防御系统。使用了侦测签章,通讯协议以及基于异常的检测的侦测方法的Snort是全世界最广泛使用的入侵预防与侦测软件。

我们在配置文件中增加了OpenCL加速选项,利用循环缓冲区实现了深度包检测,当一次存储多个包传递给GPU处理的时候,能够得到期望的效果。

5、数学库

clAmdBlas

BLAS (Basic Linear Algebra Subprograms)是最核心最基本的数学库之一,其包含了一组高质量的向量、矩阵计算子程序,如矩阵乘加操作等。BLAS在科学计算等领域具备广泛的应用,也是另一些大型数学库如LAPACK和LINPACK的支撑。BLAS有三个级别的API,分别完成向量-向量操作、矩阵-向量操作和矩阵-矩阵操作。BLAS在GPU上可以获得很好的加速效果,目前AMD在ACML基础上完成了OpenCL版本的BLAS数学库,并进行免费发布。

具体信息可参考:http://developer.amd.com/tools-and-sdks/heterogeneous-computing/amd-accelerated-parallel-processing-math-libraries/

clMAGMA

LAPACK(Linear Algebra PACKage)是用于数值计算的线性代数函数库。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。MAGMA是由美国田纳西大学发起的面向于异构计算系统的LAPACK库,其OpenCL目前版本为1.0,我们可以从下面地址获取更具体的信息:http://icl.cs.utk.edu/magma/

二、OpenCL优化应用项目

1、计算机视觉相关

基于局部域考察的图像模糊化算法的加速实现(表面模糊,高斯模糊)图像模糊化

图像模糊化算法的特点是根据被考察点的局部域特征对被考察点的颜色进行调整,由于各被考察点的局部域相对独立,这类算法比较适合于用GPU进行优化,我们通过OpenCL并行编程,并行处理各图像点的局部域,能将图像模糊化的速度提高5倍以上。

基于Haar  Cascades分类器的人脸检测方法的OpenCL加速实现

用haar 级联分类器对图像特征进行提取的过程就是将图像分割各成指定尺寸的窗口,对每一个窗口用级联分类器进行过滤,由于各窗口的过滤相互独立,这种算法比较合适于用GPU进行优化,我们通过OpenCL并行编程,对人脸检测中,各个窗口的过滤,积分图的计算 都进行了并行化,总体上能提高人脸检测时间5至10倍。

基于纹理匹配的图像修复算法的加速实现

基于纹理的图像修复过程涉及两个步骤,首先是从待修复区域边界的点集中寻找一个优先级最高的点,然后为该点在整个图像区域中进行搜索,找到最佳匹配方块,这两个步骤的操作都可以表示成对多个独立数据的并发操作,比较适合于用GPU进行优化,我们通过OpenCL编程,优化了基于纹理的图像修复中这两个步骤,使总体的加速比达到5倍以上。

基于非局部均值的图像去噪算法的 OpenCL 加速实现

非局部均值算法通过利用数字图像中大量的冗余信息,建立待去噪像素点邻域与搜索区域的像素点邻域的相似函数,计算搜索区域各像素点与待去噪像素点的相似度权重,然后对搜索区域内的像素点进行加权平均,从而得到去噪点的新的灰度值。该算法在纹理, 边缘信息的保持,以及去噪效果方面是目前最好的两种算法之一,  由于非局部算法是从像素点到像素点逐个进行处理的,故其计算复杂度较大,但对于各个被考察像素点来说,对其领域和搜索区域的操作都是独立的,比较适合GPU加速。我们通过OpenCL编程,对该算法实现了30倍以上的加速比。

三维人体运动视觉重建与跟踪系统的GPU实现

基于视觉信息的三维人体姿态跟踪和三维人体表面点云重建,是计算机视觉领域的重要研究方向,相关技术在虚拟现实、电影动画、智能监控、高级人机交互、体育和医疗等领域具有广阔的应用前景。人体运动三维重建与跟踪的主要目标是从图像和视频信息中恢复和估计以参数表示的人体姿态,求解真实人体在三维世界坐标系中的位置和姿态参数。由于问题的复杂度较高,计算量较大,一直以来都是计算机视觉领域的一个挑战性难题。目前,随着计算机硬件系统的不断升级和计算机视觉理论的继续完善,建立应用级的人体姿态重建系统已成为极具商业前景的研究项目,而GPU计算在计算机视觉中的普及应用为构建实时、快速的人体姿态重建系统提供了契机。

基于OpenCL的Adaboost并行人脸检测算法

Boosting是一个将一个弱学习算法提升为强学习算法的过程,主要应用在机器学习领域中,比如运动目标检测和识别等, Adaboost算法(Adaptive Boosting)是最具代表性的算法之一。Adaboost算法及与之相关的积分图运算过程具有很高的并行性。在基于CPU的算法中,Haar小波基函数的特征值计算是串行求值的过程,与之对应的窗口扫描过程也是串行的。利用GPU的高度并行计算特性,我们可以将Haar小波基特征值计算过程以及窗口扫描过程并行化,从而大大加快算法运行速度。

基于OpenCL的SIFT算法优化设计

在计算机视觉领域,图像匹配是解决许多具有挑战性难题的基石,例如: 物体、场景识别,从多幅图像中恢复3维结构,立体匹配以及动作追踪。 SIFT (Scale-invariant feature transform,尺度不变特征转换) 是一种很好的用来侦测和描述图象局部特征的算法,它通过从训练图象集中提取大量的特征点,从而获得识别的图象的大量信息,最大程度上减小遮挡和噪声对检测图象的影响。我们结合OpenCV提供的API和OpenCL编程,提高了SIFT的执行性能,尤其对高清图片的处理相对CPU更加从容。

图像重采样算法的GPU优化

图像重采样是利用插值手段放大缩小图像,达到目标分辨率。它是图像处理中的基本操作。为了保持图像的准确信息,很多不同的插值算法被开发出来。作为一种基本操作,重采样具有很重要的应用场景和市场基础。我们选用开源的H.264/SVC的参考软件模型中的重采样算法作为优化依据,通过任务并行和数据并行来优化亚像素的插值滤波器运算。

视频图像去隔行算法GPU优化

隔行扫描是视频采集中一种常见的手段,它通常把每帧图像分为两场进行隔行采集,这样可以在阴极射线管为基础的显示器上很好的恢复运动图像。然而,在数字图像领域则会造成隔行失真。因此,很多不同的视频去隔行算法被开发出来,其有助于提高人们对隔行视频的体验效果,在视频处理领域有重要作用。我们选用开源的VLC播放器的视频去隔行算法作为优化依据,通过任务并行和数据并行来优化其各种运算。

基于GPU加速的3D超声图像去噪

三维医学图像在现在的医疗诊断中发挥着很大的作用,但是由于3D超声成像机制使得采集到的3D超声图像都存在着相干斑噪声,影响了医疗诊断,目前已经有一些相应的去噪算法,但是由于数据量太大处理速度很慢,GPU并行计算的出现使得3D超声图像的实时处理成为了可能。我们在3D SRAD算法的基础上提出了基于GPU的并行加速算法,该算法对串行算法进行了细化和分解,利用GPU的并行计算能力,能大大提高计算速度。

基于GPU的HARRIS角点快速提取的研究与实现

角点检测在目标检测跟踪、物体识别、图像配准、3D重建、立体视觉等方面都有着重要的应用。Harris算法就是通过分析图像局部灰度值实现角点提取的一种重要算法,但是该算法利用高斯滤波,有大量卷积和邻域操作,导致运算量较大,实时处理能力较差。结合GPU体系结构特点,我们研究了一种基于GPU实现Harris角点检测的并行算法以达到角点的快速提取,并对提取出的角点进行了角点的匹配,可以利用匹配的角点完成对非接触物体的实时测量和感知,为物联网在物物感知上提供了一种新的方法和手段。如机场、车站旅客的行李体积计算、高速公路车辆超载的判定等等。这种基于harris角点检测的图像匹配技术对非接触测量有着广泛的实际应用前景。

基于GPU的图像小波变换的研究和实现

通过小波分解可以减少图像分辨率,降低图像维度,在降低运算量的同时还可以保持图像特征信息,是很多图像处理应用的基础。但由于其运算复杂,在CPU上的串行实现占用CPU的运算时间长,严重影响了计算效率,涉及到大规模数据处理时更是难于满足实时性要求。结合GPU的结构体系特点,我们研究了小波变换的算法,并将其改造为适于并行计算的矩阵表达形式,实现了一种基于GPU的图像小波变换并行处理,它能有效提升图像分解效率,基本满足大规模数据图像处理的实时性要求。

基于OpenCL的三维模型凸包生成算法

在计算机软件以及电脑游戏中,三维凸包的计算常见于三维模型的碰撞检测、体积近似计算、三维空间分析、几何相似度计算、三维模型分割与分块等诸多应用。对于复杂物体,如何快速精确的构造三维物体的凸包一直是技术难点。为了三维凸包的快速生成和实时计算,我们提出一种基于GPU的三维凸包快速并行生成算法。该算法采用了基于OpenCL 架构的局部内存读写、流数据缩减等加速方法,并通过GPU实现了map、vector、queue等数据结构,更充分地利用了GPU的并行处理能力。实验结果表明,与基于CPU的算法相比,该算法可以精确计算三维凸包,并且可以并且获得13-16倍的计算速度提升。

基于广义势力场的3D骨架抽取算法的GPU OpenCL实现

3D骨架在很多领域内有着重要的应用,如碰撞检测、虚拟导航、科学分析、模式识别、模型渲染、形状分析、表面重建、动作规划等。在进行骨架抽取时,计算量和准确度是解决问题的关键。有着显著的鲁棒性和灵活性的基于广义势力场的曲线骨架抽取算法却因为面临着沉重的计算负荷而无法突出其优势。它是通过模拟物理学中的势力场,寻找3D物体上的势力平衡的点,形成其一维表示—曲线骨架,因此需要计算每个内部点所受的势力总和,计算量大。但是该算法本身具有高度可并行性,若能挖掘其运算能力,提高性能,可得到进一步的广泛应用。

通过分析基于广义势力场的3D骨架抽取算法的并行结构,给出了其CPU和GPU的OpenCL的实现。

2、经典数学问题并行优化

B样条曲线几何插值算法的GPU实现

B样条在计算机图形学中有非常广泛的应用,特别是计算机辅助设计、制造和工程(CAD,CAM,CAE),也是很多业界广泛采用的标准的一部分,例如IGES, STEP,和PHIGS,并且是许多标准计算机图形包的一部分。在实际应用中往往要建立高精度模型,此时数据量和计算量都非常大。几何插值算法由Maekawa等人在2007年时提出,该算法通过寻找插值点到当前生成的B样条参数曲线的最近点,以此为基础迭代调整控制点直到插值点与生成曲线之间的距离达到精度要求。该算法既能用于局部调整,也能用于整条曲线的插值,且具有一定的并行性。

通过分析几何插值算法的并行结构,设计适用于OpenCL框架的计算流程,给出了B样条曲线几何插值算法的GPU实现。

大型非负矩阵分解算法(NMF)的OpenCL加速实现

近些年由于社区网络服务(如微博,人人,甚至是每个网站对相关业务对象附带的推荐系统)需求的激增以及应用范围的不断扩大,网络聚类算法的不断完善与改进成为趋势。人们需要响应更迅速、精度更准确的聚类管理。非负矩阵分解算法(NMF)是解决网络聚类问题的十分有效的办法,对大型网络进行聚类划分的问题可归结为对大型邻接矩阵进行NMF分解,且NMF分解过程涉及很多的矩阵运算和数组归约操作, 可利用GPU给出速度上令人满意的结果。我们通过OpenCL编程,对NMF分解过程中的矩阵乘法,点积,数组求和,矩阵模块度计算等步骤都进行了并行化,使整体NMF过程能达到30倍以上的加速比,我们的加速方法还特别支持对稀疏格式存储矩阵(CSR)的NMF分解。由于该算法在网络上有很大的应用价值,其响应速度和性能是我们应该优先考虑的.

基于OpenCL的自适应快速傅里叶变换(FFT)算法的实现与优化

快速傅里叶变换(Fast Fourier Transform, FFT),是离散傅里叶变换(Discrete Fourier Transform, DFT)的快速算法。采用快速算法能使计算机计算离散傅里叶变换所需要的乘法册数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越明显。作为二十世纪科学和工程界最具影响力的十大算法之一,FFT在数字滤波、计算大整数乘法、求解偏微分方程和信号分解等领域有着广泛的应用。

由于FFT算法本身的复杂度,使得在不同的输入规模下,不同的分解策略除了浮点运算次数不一样外,其访存结构也截然不同,因而会导致截然不同的性能。根据GPU的架构特性,Stockham自排序算法没有耗时的位排序操作,适合在GPU上的实现。

基于GPU的稀疏矩阵LU分解

稀疏矩阵LU分解是线性代数中的一项基本运算,在电路仿真、结构力学、经济建模等许多领域有着广泛的应用。这一步骤是当前SPICE (Simulation Program with Integrated Circuit Emphasis)电路仿真器的主要性能瓶颈。稀疏矩阵LU分解的基本算法是G/P left-looking算法。该算法较强的数据依赖性使得它的并行化十分困难。同时,数据间的高依赖性还造成并行G/P left-looking算法只能高效运行在共享内存的计算设备上。但由于共享内存的CPU核数通常很有限(大多数商用CPU都不超过6核),稀疏矩阵LU分解在多核CPU上性能无法进一步提升。GPU具有共享内存的众核结构,且拥有更高的内存带宽,为该问题提供了一个可能的解决方案。

大型常微分方程系统的Parareal算法GPU实现

大型常微分方程在很多学科领域内有着重要的应用,如自动控制、各种电子学装置的设计、弹道的计算、飞机和导弹飞行的稳定性的研究、化学反应过程稳定性的研究等。在求解大型常微分系统时,计算量是解决问题的关键。Parareal算法最初由Lions,Maday和Turinici在2001年提出,它使用粗细两层时间剖分,在粗网格上进行串行的预估,在细网格上实现并行的校正。该算法可实现的并行化规模大,局限小,在许多实际应用中都体现了自身的优势和潜力。

哈密顿回路问题OpenCL解题程序

基于OpenCL API开发图论经典问题——哈密顿回路问题的解题程序。最终程序以一个有向图作为输入,程序在此有向图中寻找哈密顿回路,如果找到,则输出一条找到的哈密顿回路;如果找不到,则输出该有向图不是哈密顿图。

基于DTW算法和OpenCL的子序列检测实现

子序列检测(Subsequence Similarity Search)是许多时间序列数据处理问题中一个重要组成部分。DTW(Dynamic Time Warping)距离在越来越多的研究中被证明是最好的距离度量方式。但传统DTW距离计算在CPU上的实现是子序列检测过程中性能上的主要瓶颈。我们提出了一种基于OpenCL和AMD GPU平台的并行DTW算法实现,得到了在性能上相比于目前最好的CPU实现一到两个数量级的提高。

基于OpenCL二维Mallat算法并行实现

Mallat在图像分解与重构的塔式算法启发下,根据多分辨率理论,提出了小波分解与重构的快速算法,称为Mallat算法。我们实现了基于OpenCL并行的二维Mallat算法,并将其应用于图像融合处理中。

3、数据挖掘与人工智能

基于GPU实现的马尔可夫决策过程(Markov Decision Process)并行值迭代算法

马尔可夫决策过程是一个随机动态系统的最优过程,可以被用来解决包括运筹学、药物决策的制定、强化学习、经济学、机器人导航以及游戏等实际问题。根据马尔可夫决策过程,我们定义了一个“外出游玩”的模型,在这个模型中,只要给出了起始地点,模型会自动生成一条最佳的外出游玩路线。在马尔可夫决策过程中,策略迭代和值迭代是两种典型的实现算法。在这里,我们选择了用值迭代算法来实现“外出游玩”模型。为了能够凸显出GPU的加速能力,我们给出了马尔可夫决策过程值迭代算法的CPU实现和GPU实现。从实验结果可以得出,运用GPU实现模型比用CPU实现模型在性能上提高了很多。

通过分析马尔可夫决策过程值迭代算法,结合“外出游玩”模型,我们给出了基于状态并行的值迭代算法。通过给出基于CPU的值迭代算法的实现和基于GPU并行值迭代算法的实现,GPU强大的加速能力体现的淋漓尽致。

基于GPU的脑网络分析算法加速

探索人脑连接模式和脑部病变的科学研究中,对于大脑复杂网络结构的研究起着至关重要的作用。然而,大规模脑网络建立和分析的计算量巨大,以致于在此前关于脑网络的研究中,大部分工作仅停留在以脑区为单位的粗尺度分析上。这种规模的脑网络通常包含约100个网络节点。而以体素为单位建立的脑网络,可包含2万至10万个节点,因此能够更精确和细致地反映出脑网络的微观结构。为了消除大规模网络分析中的计算瓶颈,我们提出了一种基于AMD GPU的脑体素网络分析的加速平台。

基于GPU的并行支撑矢量机排序学习

排序学习在信息检索等领域发挥着越来越重要的作用, 而通过支撑矢量机的分类方法进行排序也成为机器学习中的一个研究热点。支撑矢量机目前已经有比较成熟的串行快速训练算法, 比如SMO、SVMlight等。 但是, 对于大规模数据挖掘问题, 训练速度仍然是制约支撑矢量机实际应用的瓶颈。我们提出了基于GPU实现的并行支撑矢量机排序学习的优化方案, 扩展了改进的SMO方法的数据并行特性, 并实现了在ATI Stream SDK平台上基于OpenCL标准的计算过程。在LETOR排序学习标准数据集上的测试结果表明, 提出的算法具有很好的加速性能。

基于OpenCL和基因表达式的K-means聚类算法

k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。但由于传统的k均值聚类算法受到初始k个初始聚类中心的限制,为此有人提出并实现了基于基因表达式编程的自动聚类算法(GEP-Cluster),解决了未知聚类个数的问题。然而,GEP-Cluster算法在大数据情况下的收敛速度相对较慢,而该算法的计算适应度函数部分存在着可并行性。为此,我们基于OpenCL开放运算语言,对适应值计算并行化,进而提出一种基于OpenCL和基因表达式编程的聚类算法(OCLGEP-Cluster)。经过实验表明,OCLGEP-Cluster算法对数据规模较大的情况下,算法性能得到较好的提高。

基于OpenCL的并行人工蜂群算法

人工蜂群算法(Artificial Bee Colony)是基于蜜蜂群体觅食行为而提出的一种相对比较新的群体智能算法。该算法模拟了真实世界蜜蜂群体采蜜行为,蜜蜂根据各自的分工进行不同的采蜜活动。在采蜜过程中,由于独有的角色转换机制、以及在自组织模式下实现信息的交流和共享,从而使蜜蜂寻找到最优蜜源。人工蜂群算法具有天然的并行性,我们完成了基于GPU加速的人工蜂群算法并行程序设计和优化,通过采用OpenCL并行编程模型,使得算法得到了很好的加速效果。

基于Ferns的增强现实并行跟踪算法

移动增强现实是虚拟现实在移动通信领域的应用,跟踪注册是增强现实系统的核心技术,而基于自然特征的跟踪注册是目前的研究热点。Random ferns(随机厥)是一种半朴素贝叶斯分类器,通过ferns分类器训练,可以实现稳定且较快速的实时跟踪注册。通过GPU加速可以大大提升训练以及跟踪注册的速度,克服速度瓶颈,使得这项技术可以得到更为广泛的应用,例如移动设备。

大规模图划分算法GPU加速实现

大规模网络划分算法是指一类通过给定图的信息,通过分析这些点的内在联系,从网络中抽象出一些“社区”的算法。我们选择了Newman在他2011年的论文上提到的针对高重叠性网络的划分算法,致力于利用GPU高并发度的特性,对原有的图划分算法进行加速。我们通过分析算法中各层并行度以及剖析算法加速的主要瓶颈,设计出该算法的Opencl-GPU版本。我们在测试中达到了平均10倍的加速比,最高可到20倍。

4、其他

GPU加速的函数图像绘制器

利用OpenCL进行GPU上的并行牛顿迭代法,对任意f(x, y)=0方程绘制图像。可以支持各种函数、解析几何方程图像的绘制。其速度比同等原理的CPU程序快几十倍(使用AMD HD7970显卡与最新四核CPU进行比较),可以极快地绘制非常复杂美丽的函数图像。

基于GPU的软件GPS接收机

软件GPS接收机的快速捕获算法需要大量的FFT操作以及可并行化运算,采用GPU单元可以大大提高软件接收机的工作效率。

雷达模糊函数计算的GPU加速

雷达模糊函数在雷达系统设计中是非常有力的分析工具,可以评估雷达发射信号的距离、多普勒分辨性能。对于高分辨率合成孔径雷达的信号选择,系统分辨率要求信号具有大时宽和大带宽,这样在计算模糊函数时存在计算量大、耗时长的问题,采用普通CPU计算难以满足实时信号处理的需求。从雷达模糊函数的特点出发,其输出形式为二维矩阵,各点计算时具有独立性,符合并行计算中的SIMD(单指令多数据)模型,因此非常适合采用并行方式计算实现。采用基于AMD平台HD7770显卡GPU加速的计算方法,得到了约257倍加速比,大大提高了计算效率,为高分辨率探测雷达波形设计提供了良好的计算支撑。

归一化植被指数(NDVI)算法的并行化实现

NDVI是目前应用最广泛的一种植被指数。植被指数是遥感监测地面植物生长和分布的一种方法。当遥感器测量地面反射光谱时,不仅测得地面植物的反射光谱,还测得土壤的反射光谱。当光照射在植物上时,近红外波段的光大部分被植物反射回来,可见光波段的光则大部分被植物吸收,通过对近红外和红波段反射率的线性或非线性组合,可以消除土壤光谱的影响,得到的特征指数称为植被指数。我们基于APU/GPU异构架构实现了NDVI算法。

三、更多开发工具和库

1.drawElements Quality Program

drawElements Quality Program(dEQP)是一个强大的工具包,它为OpenGL ES和OpenCL的GPU的准确性,精密性,功能的一致性以及稳定性提供了一个基准。它不但能够为不同的供应商和不同的GPU架构之间提供细节化的质量比较,而且还能够为测试发现的问题提供分析和调试的功能。在GPU平台的设计,部署和应用开发阶段可以使用dEQP。在IP选择的分析过程中,关于不同设备的能力问题,dEQP能够作为一个展示商品质量或者为开发者提供向导的独立的基准。

链接地址:http://www.drawelements.com/products/deqp

2.Xcelerit SDK

在促进程序员的开发效率的过程中,Xcelerit SDK是一个提高密集型计算应用性能的软件工具包。从一个简单的顺序执行,没有并行结构,并且是低级别的编译器指令等的源代码,Xcelerit SDK可以为各种各样的目标处理器生成高度优化的代码。这些各种各样的处理器包括多核的CPU,GPU以及它们的二者的结合。这些编程接口是很直观的,而且适合许多不同类型的算法,如蒙特卡洛,有限差分,或基于格的方法。Xcelerit SDK以定量执行需要一个灵活的内部解决方案的繁重计算为目的。用户可以集中精力于算法的核心以及他们所面临的的问题,并且他们可以产生高性能的程序。

链接地址:http://www.xcelerit.com/xcelerit-sdk

3.Triton Ocean SDK

在建模水模型的过程中,如果对性能有关键性的要求,那么要想建模出很真实的水模型是很困难的。Triton Ocean SDK可以为你在创建3D水模型,为创建用于海事训练的足够逼真的海洋模型或者为游戏寻找AAA级质量的海洋模型节省很多的工程开销。Trion能够自适应你的系统,利用它能够发现的任何的并行计算的能力。它能够充分利用通用GPU(GPGPU)技术,像OpenCL和DirectX11的计算着色器(DirectCompute)去加速模拟一次千重浪。在可能的情况下,从用快速傅里叶变换来模拟海浪的各个方面到产生和渲染海洋模型的网格,3D海浪的模拟都是在GPU上完成的。

链接地址:http://sundog-soft.com/sds/features/ocean-and-water-rendering-with-triton/

4.CAPS工作台

CAPS是一些内部的或者第三方的全面的工具,它能够满足你高效开发高性能并行应用的所有需求。

链接地址:http://www.caps-entreprise.com/products/caps-workbench/

5.用于ARM的PGCL OpenCL编译器

PGCL用于编译和运行在ST-Ericsson NovaThor U8500和后续平台的OpenCL1.1的嵌入式配置应用的OpenCL框架,这些平台使用单独的ARM核作为OpenCL主机,使用多个ARM核作为OpenCL计算设备。

链接地址:http://www.pgroup.com/products/pgcl.htm

6.Par4All

Par4All是一个用于C和Fortran顺序程序的自动进行并行和优化的编译器。这种源到源的编译器的目标是让现存的应用能够运行在各种各样的目标硬件上,例如多核系统,高性能计算机和GPUs。Pat4All创建了新的代码,应用的原始代码没有改变。

链接地址:http://www.par4all.org/features/

7.OpenCL编译器工具

OCL是一个功能强大的,结构紧凑的一套工具,它能够为开发者提供更多的内核编译选择。OCL能够让你在应用的运行过程中消除昂贵的内核编译时间。有了OCL工具,在开发过程中,开发者可以直接将内核(明文或者密文)的源代码嵌入到程序的二进制文件中,不需要分发内核源代码,但是仍然保持了运行编译的灵活性。你不仅可以将源代码嵌入到OpenCL二进制文件中,你还可以嵌入编译好的内核,这样就减少了你的应用在运行时对额外的内核编译所需的开销。OCL带有脱机OpenCL编译器(oclcc),ELF文件生成器(ocleif),加密工具和有用的程序库,这些都将帮助我们简化OpenCL内核的编译过程。

链接地址:http://clusterchimps.org/ocltools.php

8.CAPS编译器

CAPS编译器是以基于指令的OpenACC和OpenHMPP的标准为基础的,CAPS编译器使得开发者能够逐步构建适合于各种各样的多核系统(例如AMD GPUs)的可移植的的应用。源到源的CAPS编译器集成了强大的数据并行代码生成器,该生成器可以生成OpenCL代码。CAPS编译器依赖产生主机应用二进制文件的原来的CPU编译器和产生应用加速部分的二进制文件的硬件供应商编译器。

链接地址:http://www.caps-entreprise.com/products/caps-compilers/

9.CLU

计算语言工具(CLU)是一种轻量级的API,旨在帮助编程者对OpenCL的探索,学习和快速编码。该API降低了初始化OpenCL设备,上下文,内核以及参数等的复杂性。当然,如果程序员希望能够进行更底层,更复杂的编码,CLU也保留了对更底层的OpenCL API调用的能力。

链接地址:https://github.com/Computing-Language-Utility/CLU

10.OpenCLTemplate.DLL

OpenCL Template是一种工具,这种工具使得我们能够更加简单方便的使用Microsoft Visual C#。OpenCL Template里面包含了OpenCL编辑器,这种编辑器是一种能够快速对你的代码进行编译,并且检查你的代码是否正在正确的运行的工具。

链接地址:http://www.cmsoft.com.br/index.php?opti>

11.OpenCL内核编译器

CLCC是一种命令行的OpenCL内核编译器,它有着很多为了称赞的特点:

  • 在运行主机代码之前能够进行内核编译检查
  • 动态绑定OpenCL的函数指针,因此所有负荷标准的OpenCL实现都是被支持的
  • 在Visual Studio的集成(F4)中支持MS Visual C++的错误语法
  • 扩展的编译错误和警告反馈

链接地址:http://www.organicvectory.com/index.php?opti>

12.pocl

可移植的计算语言的目的是使得OpenCL标准成为开放的源码实现,这样OpenCL标准就很容易适应于新的目标。这个项目的其中一个目标是提高OpenCL程序移植过程中的性能,避免进行目标依赖的手动优化。一个“固有”的目标被包含在内,它允许在主机(CPU)上运行OpenCL内核。

链接地址:http://pocl.sourceforge.net/

13.libcoprthr

libcoprthr库是一个开源的OpenCL运行时的实现,支持多核的x86_64和ARM处理器。尽管当前的版本还没有通过一致性测试,但是该库已经通过了一个简易的替换测试,它支持几种不同的复杂的OpenCL应用,并且表现除了良好的性能。

链接地址:http://www.browndeertechnology.com/coprthr_libocl.htm

14.Webkit的WebCL

WebCL是Khronos的一个新活动,它定义了如何将Javascript绑定到OpenCL。Webkit的WebCL项目是开源Webkit浏览器引擎的WebCL的早期实现。

链接地址:https://github.com/SRA-SiliconValley/webkit-webcl

15.火狐的WebCL

火狐的Nokia WebCL原型。

链接地址:https://github.com/toaarnio/webcl-firefox

16.SnuCL

SnuCL是一个开源的OpenCL框架,它是由首尔国立大学开发的可以自由查看的开源软件。它将原来的OpenCL语义延伸到异构集群环境。目标集群环境包括一个单独的主机节点和多计算节点。

链接地址:http://aces.snu.ac.kr/Center_for_Manycore_Programming/SnuCL.html

17.ScalaCL

ScalaCL使得程序员能够以一种非常自然的方式在GPUs上运行Scala代码(将JavaCL绑定带OpenCL的API上)。

链接地址:https://code.google.com/p/scalacl/

18.Ruby-OpenCL

Ruby-OpenCL是将Ruby绑定到OpenCL。

链接地址:http://rubyforge.org/projects/ruby-opencl/

19.QtOpenCL

QtOpenCL是QtCore和QtOpenGL模块的一系列的扩展类,它使得OpenCL能够用于Qt4.6.2和Qt4.7。

链接地址:http://doc.qt.digia.com/opencl-snapshot/index.html

20.PyOpenCL

PyOpenCL使得你能够通过Python访问GPUs和很多其他的并行计算设备。

链接地址:https://pypi.python.org/pypi/pyopencl

21.OpenTK

Open工具包是一个高级的,低层的C#库,它封装了OpenGL,OpenCL和OpenAL。它适合游戏,科学应用以及任何需要3D图形,音频或者计算功能的项目。

链接地址:http://www.opentk.com/

22.OpenCL.Net

OpenCL.Net提供了对OpenCL API的绑定,它尽可能的接近OpenCL 1.1规范,是一个更像.Net的API的更高层次的抽象。

链接地址:https://sourceforge.net/projects/openclnet/?source=navbar

23.Java OpenCL

JOCL项目提供了一种更容易将Java代码绑定到OpenCL API的方式。

链接地址:http://jogamp.org/jocl/www/

24.JavaCL

JavaCL很好的将OpenCL封装进Java API中。看看现在谁在使用JavaCL。

链接地址:https://code.google.com/p/javacl/

25.FortranCL

FortranCL是Fortran 90的OpenCL接口。它允许编程者直接在Fortran中调用OpenCL并行编程框架,因此开发者可以使用图形处理器(GPU)和其他的处理器对他们的Fortran代码进行加速。

链接地址:https://code.google.com/p/fortrancl/

26.CLythe

CLyther是一个刚刚标准化的引擎,它使得Python开发者能够很容易的利用OpenCL所带来的好处。

链接地址:http://srossross.github.io/Clyther/index.html

27.Cloo

Cloo是一个开源的很容易使用和管理的库,它使得.NET/Mono应用能够充分利用OpenCL的好处。

链接地址:http://cloo.sourceforge.net/

28.cl4d

cl4d是对OpenCL C API的面向对象的包装,它是用D编程语言编写的。

链接地址:https://bitbucket.org/trass3r/cl4d/wiki/Home

29.Barracuda

Barracuda应用于Ruby语言的OpenCL库,能够在Mac os x上安装,支持有符号的整数和浮点数。与同一硬件上非异构环境下运行相比,对整数到浮点数的测试表明,Barracuda能够取得高达10倍的速度增加。

链接地址:http://gnuu.org/2009/08/30/barracuda-an-opencl-library-for-ruby/

30.Aparapi

Aparapi使得Java开发者能够通过在GPU上执行数据并行的代码段而不是局限于本地的CPU来利用GPU和APU设备的计算能力。它是通过在运行时将Java字节码转化为OpenCL代码并且在GPU上执行。

链接地址:https://code.google.com/p/aparapi/

31.ViennaCL

ViennaCL是一个针对众核架构(GPUs, MIC)和多核CPU计算的免费、开源的线性代数库GPU。这个类库是用C++实现的并且支持OpenCL和OpenMP。除了核心的功能和许多其它特性,像是支持BLAS level 1-3和迭代求解器,最新发布版ViennaCL 1.4.1 还包括对Intel的MIC平台(Xeon Phi)的支持以及突出设有一个GEMM kernel,使得在AMD HD7970上能达到超过1.3 TFLOPs 。

链接地址: http://viennacl.sourceforge.net/

32.VexCL

VexCL是为OpenCL设计的一个向量表达式类库,以便于开发者使用C++进行OpenCL的开发。VexCL力求减少开发OpenCL应用程序所需的样板代码量。此类库提供了为向量运算、还原、稀疏矩阵向量乘等提供了方便直观的表示。另外,还支持多设备和甚至是多平台上的计算。

链接地址:https://github.com/ddemidov/vexcl#readme

33.STDCL

标准计算层库为OpenCL提供了一个简化的编程接口,设计目的是为了采用一种新方式来支持最典型的使用案例,而这种方式是由大家熟知的传统的针对C编程的UNIX API所启发的。

链接地址:http://www.browndeertechnology.com/coprthr_stdcl.htm

34.StarPU

SrarPU是针对CPU/GPU混合结构的任务编程类库,支持优化的异构调度、数据传输和集群通信。

链接地址:http://runtime.bordeaux.inria.fr/StarPU/

35.opencl-toolbox

opencl-toolbox 是一个开源的工具包,支持Matlab和OpenCL的无缝集成。

链接地址:https://code.google.com/p/opencl-toolbox/

36.ocl-radix-sort

ocl-radix-sort 是一个C++类,用来支持在OpenCL中为整数链表排序,而不需借助其它的类库或者SDK.

链接地址: https://code.google.com/p/ocl-radix-sort/

37.Libra SDK

Libra SDK非常复杂的运行时,包含了大规模加速软件计算的相关API、样例程序和文档。使用Libra SDK开发和设计基于CPU和GPU的高性能软件是很强大而方便的。在一般的编程环境中,相比使用原生的OpenCL,采用众所周知的简单API标准接口,你的程序代码会更少并且拥有巨大的性能。成百上千的高性能的函数和运算都关注如标准的数学,密集和稀疏矩阵或向量的运算,同样也包括高性能的随机数生成、比较、条件运算、fft、方程解算器等。

链接地址: http://www.gpusystems.com/libra.aspx

38.libclc

Libclc是个开源的BSD/MIT双许可实现了OpenCL C编程语言的库要求。libclc被设计成可移植、可扩展的。为此,它提供了大部分的库要求的通用实现,允许目标在个体功能的粒度上覆盖通用实现。

链接地址:http://libclc.llvm.org/

39.libCL

LibCL针对OpenCL高性能计算的开源类库。相比专注于一个特殊领域,LibCL打算囊括众多的并行算法。目标是为了提供一个关于kernel和数据结构的全面性知识库,从基本的原语操作如排序、搜索和代数学到计算研究和可视化的高级算法系统,以适用以视觉为中心的计算。LibCL提供了一套封装了OpenCL API的C++类的核心集,以及简单的错误处理和日志记录的基础支持。

链接地址:http://libcl.org/index.html

40.OpenCL Studio

OpenCL Studio将OpenCL和OpenGL集成进一个简单的开发环境以支持高性能计算和可视化。它集成的源码编辑器、交互式脚本语言和开元的并行算法库都支持复合GPU计算解决方案的开发。编辑器隐藏了许多底层API的复杂性,为进入并行计算和可视化提供良好的开始。

链接地址:http://www.opencldev.com/

41.clpp

Clpp是一个OpenCL数据并行原语库。它是数据并行算法原语如并行前缀和(“扫描”)、并行排序、并行缩减的类库。诸如此类的原语是一系列数据并行算法的重要组成块,包括了排序、流压缩和构建数据结构如树和总计区域表。

链接地址: https://code.google.com/p/clpp/

42.CLOGS

CLOGS是针对OpenCL C++API上层的高级操作的类库。设计目标为了集成其他的OpenCL代码,包括使用OpenCL事件的同步。目前,支持基数排序和独占扫描。

链接地址:http://sourceforge.net/apps/trac/clogs/wiki

43.CLETE

计算层表达式模板引擎是一种软件技术,能够实现基于OpenCL设备如GPU的C++容器类的自动加速。CLETE的使用不要求特殊的工具或者编译器,并且适和任何的C++编译器。

链接地址:http://www.browndeertechnology.com/coprthr_clete.htm

44.ocl-emu

OpenCL仿真器调试器是一项起源于AMD的项目。它允许开发者编译和调试OpenCL内核像C++程序一样。此项目的目标是为OpenCL开发者提供针对MS visual studio C++ 开发和调试环境的全面支持。

链接地址: https://code.google.com/p/ocl-emu/

45.LuxMark

LuxMark是一个易用的OpenCL基准测试工具

链接地址:http://www.luxrender.net/wiki/LuxMark

46.CLBenchmark

CLBenchmark是第一个专业的OpenCL基准测试程序来测量和比较不同硬件架构的处理能力。CLBenchmark采用OpenCL标准来测量桌面级CPU和GPU的计算性能,提供了一种公正的方式来测试和比较不同平台上的OpenCL实现的计算性能。

链接地址:http://kishonti.net/product_clbenchmark.jsp

47.Basemark CL

Basemark CL为设备制造商、半导体公司和他们的生态系统提供了各种性能评估功能来测试和优化在桌面和嵌入式设备中的OpenCL实现。它全面的基准测试工具提供了一个客观的关于OpenCL实现间的比较。

链接地址:http://www.rightware.com/benchmarking-software/product-catalog/

48.GPU Caps Viewer

GPU Caps Viewer 是一个针对Windows XP和Vista的OpenGL和OpenCL图形显卡工具。

链接地址:http://www.ozone3d.net/gpu_caps_viewer/

49.Accent ZIP 密码恢复

Accent ZIP 密码恢复是基于AMD显卡的,其恢复ZIP压缩文件密码的速度比只基于CPU的恢复技术快高达60倍。

链接地址:http://passwordrecoverytools.com/zip-password.asp

50.Accent RAR密码恢复

Accent RAR密码恢复使用AMD卡来提升搜索速度,每块卡都能获得高达40倍的加速。此软件使用GPU技术来为RAR 3.x文件恢复密码。

链接地址:http://passwordrecoverytools.com/rar-password.asp

51.Accent OFFICE 密码恢复

Accent OFFICE 密码恢复为任何使用了独特的优化代码以求适应AMD处理器优势的电脑提供顶级的密码恢复速度。通过利用AMD显卡以及流或OpenCL技术,Accent OFFICE 密码恢复的密码恢复速度相比CPU方案而言,快了高达60倍。

链接地址:http://passwordrecoverytools.com/office-password.asp

52.Aviary W8 SDK

Aviary的易于集成的跨平台的SDK现在能用于Windows 8了。使用Aviary,开发者能在几分钟内就可添加一个功能强大且直观的图片编辑器到windows 8的应用程序中。Aviary的特效是通过使用新型异构计算语言C++ AMP来实现的。计算是在位于AMD的APU内部的高性能并行图像处理单元(GPU)核上完成的。运用CAMP 允许即刻实现全范围特效的加工处理,根据AMD的基准测试研究,平均比具有可比性的处理器快了16倍。

链接地址:http://aviary.com/w8

53.Website Creator X6

Uses UVD 使用UVD

链接地址: http://www.corel.com/corel/product/index.jsp?pid=prod4870070&cid=catalog20038&segid=7800004

54.ArrayFire

ArrayFire是一个快速的软件类库,针对基于易用api的GPU计算。它的基于数组的函数集使得GPU编程很方便。ArrayFire可供C、C++、Fortran以及Python使用,而言集成进AMD硬件中。对于大部分用户而言是免费的!

链接地址:http://www.accelereyes.com/arrayfire_tour