OpenCL模型

2024-08-25

OpenCL模型 篇1

GPU已经不再局限于3D图形处理了, 由最早以游戏为主要代表的图形应用, 到现在大规模并行超级计算机和处理大批量并行浮点运算, 尤其在动画渲染、气象研究、能源勘探、生物医疗、金融分析、地理信息系统等各个领域发挥着重要作用。“天河一号A”超级计算机是GPU应用的典型代表, 它采用了GPU和CPU混合架构, 并使用了超过14000颗CPU, 其中配备了2048颗我国自主研发的飞腾FT-1000八核心处理器, Tesla M2050 GPU7168颗, 总运算能力2.5PFLOPS, 曾在2010年11月获得全球速度最快超级计算机的头衔。它的成功已经充分证明了GPU在数据计算方面的重要性。

为了提高DCT变换的速度以及扩展更多的应用, 文中主要分析面向Open CL模型的DCT变换的并行化。通过结合Open CL语言和GPU的并行特性, 充分发掘其中可以并行计算的部分, 针对基于GPU的DCT变换的性能进行优化。

1 Open CL

随着GPU可编程性不断增强, 各种编程工具的不断推出, 例如Nvidia的CUDA、AMD的Brook+、Apple的Open CL、IBM的CBE、Intel的Larrabee, 这些工具使GPU通用计算编程的复杂性大幅度降低, 已逐步成为一种新型可编程高性能并行计算资源。对于编程人员来说他可以选择不同的语言或者API进行编程, 文中选用Open CL编程。

1.1 Open CL的组成

Open CL最早是由Apple公司提出, 在Intel、AMD、NVIDIA等巨头的参与下, 2008年12月已形成第一版标准。Open CL全称Open Computing Language[3,4], 即“开放计算语言”, 为编写跨平台的GPU计算的程序提供了方便。

Open CL的组成包含三个部分, 如下:

1) Open CL编程语言。又被称为Open CL C编程语言。它是基于ISO C99标准的一个扩展子集, 主要用来编写Kernel程序的语言, 能运行在任何类型的微处理器上。

2) Open CL平台API。它定义了协同执行的单个处理器程序找到Open CL设备所用的函数和函数的功能, 以及Open CL应用创建上下文的函数。

3) Open CL运行时API。它用于管理上下文进行命令队列的创建和运行时发生的其他操作。

图形里面也有很多API, 比如Open GL、Direct X是针对图形的, Open CL是针对并行计算的API。这些构成便于主机程序启动Kernel程序, 并为并行计算提供了一个有效的开发平台。Open CL作为业界公认的第一个异构计算开发语言标准, 正逐渐被各主要计算平台所采用。文中采用的异构处理平台为多核CPU和GPU。

1.2 Open CL平台模型

Open CL平台模型为开发人员提供了在计算设备上执行的Open CL C函数。主机 (Host) 是Open CL平台模型中的核心设备, 它能够连接一个或多个Open CL计算设备 (Compute Device) 。其中每个Open CL计算设备又由一个或多个计算单元 (Compute Unit) 组成, 每个计算单元由一个或多个处理单元 (Processing Element) 组成, 各种计算操作都是在处理单元中完成的。例如AMD Radeon HD7970包含有32组CU, 每组CU包含64个PE。Host端是Open CL程序的入口和出口, 控制着计算设备中处理单元需要进行的计算, 从而实现管理平台模型中所有计算资源。计算命令通过应用程序从Host端向各个Open CL计算设备的处理单元进行传送。GPU通过单指令多数据 (SIMD) 指令类型来支持数据并行计算。在单指令多数据流的结构中, 单一控制部件向每条流水线分派指令, 同样的指令被所有处理部件同时执行。

Open CL采用存储器类型的层次结构, 如图1所示[5], 开发人员可以利用这些存储器来编程。这些存储器类型包括:全局、常数、局部和私有存储器。全局存储器可以由主机程序动态地分配, 并支持主机和设备的读写访问操作。常数存储器支持主机的读写访问操作, 并且支持设备的只读访问操作。局部存储器可以由主机动态地分配, 也可以由设备代码静态地分配。主机不能访问Open CL中的局部存储器。私有存储器在计算单元内部, 与处理单元能交换数据。

2 DCT在GPU上的并行化实现

为了方便开发人员在GPU平台上进行编程, 提高开发效率, 目前, 各大厂商提供了很多高效、直观的开发平台, 即CAL、Brook+、CUDA、Open CL等, 这些平台有各自的特点。文中主要从Open CL角度进行分析DCT变换的并行化。

2.1 DCT变换的工作原理

1974年, Ahmed, Natarajan和Rao首先提出了DCT (Discrete Cosine Transform) 算法, DCT全称为离散余弦变换[6,7,8]。DCT变换与K-L变换的准最优正交变换非常相似, 能将图像的大部分能量集中到直流系数中, 并且其算法快速有效, 因而有利于软件和硬件实现。K-L变换 (Karhunen-Loeve Transform) , 由卡尔胡宁 (Karhumen) 与勒夫 (Loeve) 分别提出[9]。其具有将图像能量集中于某些系数中的能力, 一个能把最多的能量集中于最少的系数上的变换所产生的重建误差最小, 但是采用实际电路完成十分困难。因此, 目前在MPEG-4和JPEG2000的静态纹理编码中主要采用DWT变换实现, 而其他多数图像和视频编码中选择采用DCT变换进行实现。

针对二维图像的DCT变换, 其变换过程如下:

1) 对图像块的每行进行一维DCT变换。

2) 对经行变换的块的每列再进行一维DCT变换。

其中, 一维DCT变换采用线性变换Y=HX实现, 它将N维向量X通过变换矩阵H转换成新的N维向量Y。公式如式 (1) 所示[10]:

DCT变换的变换核H第k行第n列的元素定义如公式 (2) 所示:

其中k=0, 1, 2..., N-1, n=0, 1, 2..., N-1

从式 (2) 可以证明得到, DCT变换核Hkn是为无理数, H是正交矩阵且DCT完全可逆的, 变换对于输入的整数图像数据而言, 进行DCT变换时需要进行大量的浮点运算, 容易导致图在像轻微失真, 另外还需要进行大量的乘法和除法运算, 软件和硬件不易实时实现, 这将不利于在实时的多媒体和视频领域的广泛应用, 尤其是在医学图像、遥感成像等特定领域是不允许的。

2.2 DCT变换的并行化

DCT变换在GPU上的实现步骤, 如下:

1) 将原始数据从Host端的内存传送到Device端的显存, 将原始图像分成8×8的块, 每个线程根据对应的索引号读取显存中某个块中的一列到GPU的内存中。

2) 每个线程根据对应的索引号先对某个块中的一列做一维8点DCT快速正变换, 再对变换以后的块中的某行做一维8点DCT快速正变换, 结果为变换后的块。

3) 每个线程根据对应的索引号把某个块中的一列从GPU的内存传送到显存中。

2.3 DCT变换的并行化实现

Open CL的执行模型可以分为两部分, 如图所示。一部分是在Host上执行的主程序, 另一部分是在Open CL设备上执行的Kernel程序, Open CL通过主程序来定义上下文并管理内核程序在Open CL设备的执行。

1) 主程序

执行在Host端的主程序, 如下:

2) Kernerl程序

执行在OpenCL设备上的Kernerl程序, 如下:

3 实验结果及分析

1) 测试环境

文中采用的的硬件和操作系统等配置如下:

(1) Windows 7 X64位操作系统;

(2) Intel (R) Core (TM) i7-3770 4核;内存8GB;500G硬盘;

(3) 显卡:AMD Radeon HD 5650、AMD Radeon HD 6950和AMD Radeon HD 7970。

2) 构建环境

构建OpenCL环境的具体步骤如下:

第1步:下载。

下载最新的AMD driver, AMD APP SDK。本实验中采用:

(1) AMD SDK:AMD-APP-SDK-v2.8-Windows-64.exe

(2) AMD Driver:12-10_win7_win8_64_dd_ccc_whql.exe

第2步:安装。

依次安装AMD Driver和AMD APP SDK。AMD APP SDK目前支持的IDE有:Visual Studio。在安装过程中会自动添加一部分环境变量。

第3步:查看。

在程序→运行→cmd中键入clinfo, 查看输出信息, 如果所有计算设备都能找到, 则安装成功。

第4步:编译。

编译SDK Sample中的样例。在$ (AMDAPPSDKSAMPLESROOT) samplesopencl目录下的Open CLSamples.sln解决方案, 包含了多个Open CL工程。用户可根据需要选择相应工程, 并设置为启动项目, 然后进行build和debug。可执行文件保存在$ (AMDAPPS-DKSAMPLESROOT) samplesopenclbin相应目录下。

第5步:当开发人员创建自己的Open CL项目时, 可以通过两种方法进行编译。

(1) 在解决方案资源管理器中按照向导建立工程, 并按照步骤4进行编译和调试。

(2) 用户可以在SDK中的模板工程 (Template) 对源码进行修改并编译执行。

3) 实验结果

实验结果如表1所示, 单位:ms。

通过测试, 实验结果表明, DCT并行化变换速度比原来常用的DCT变换速度有明显提高, 并且显卡性能越好, 采用并行化后, 速度提高越多, 节省了大量的时间。

4 结论

GPU作为一种非常有潜力的计算工具, 仍在不断发展。文中通过对面向Open CL模型的DCT变换的并行化方法的分析和实现, 探讨了Open CL的关键技术, 并且提出了一种把传统串行DCT快速变换映射到GPU的并行化方法, 在实验过程中, 对比采用C语言和Open CL语言编写的DCT变换, 基于Open CL开发的应用程序可以最佳地调用异构系统中的所有计算资源, 最大化发挥计算能力, 真正体现异构计算的高效节能优势。

参考文献

[1]Youngsub Ko, Youngmin Yi, Soonhoi Ha.An efficient parallelization technique for x264 encoder on heterogeneous platforms consist ing of CPUs and GPUs.Journal of Real-Time Image Processing, 2013 (01) .

[2]Changmin Lee, Won Woo Ro, Jean-Luc Gaudiot.Boosting CUDA Applications with CPU–GPU Hybrid Computing[J].International Journal of Parallel Programming.2013 (05) .

[3]Cheong Ghil Kim, Yong Soo Choi.A high performance parallel DCT with OpenCL on heterogeneous computing environment[J].Multi media Tools and Applications.2013.05 (64) :475-489.

[4]陈钢, 吴百锋.面向OpenCL模型的GPU性能优化[J].计算机辅助设计与图形学学报, 2011 (04) :571-580.

[5]李焱, 张云泉, 王可, 等.异构平台上基于OpenCL的FFT实现与优化[J].计算机科学, 2011 (08) :284-296.

[6]阮军, 韩定定.基于CUDA的DCT快速变换实现方法[J].微电子学与计算机, 2009 (08) :201-210.

[7]Wei-Jhe Hsu, Hsueh-Ming Hang, Yi-Fu Chen.Motion Estimation and DCT Coding Combined Scheme for H.264/AVC Codec[C].In ternational Computer Symposium.2013 (21) :413-421.

[8]Dariusz Rafal Augustyn, Sebastian Zederowski.Applying CUDA Technology in DCT-Based Method of Query Selectivity Estimation[J].Advances in Intelligent Systems and Computing.2013 (185) :3-12.

上一篇:地图编辑器下一篇:手术室药品管理的方法