OpenCL异构并行编程在遥感影像处理中的应用

2018-11-26 09:33于梦华
电脑知识与技术 2018年23期

于梦华

摘要:OpenCL是众多异构并行计算平台的一个通用的编程框架,并行计算领域因为OpenCL模型的加入,基于异构系统的算法加速越来越多地被应用于遥感图像处理中。在遥感图像处理方面,众多的图像处理的算法程序都是针对像素的操作,需要逐像素的循环迭代进行。这些类型算法的处理过程都具有以下特点:数据量丰富,需要进行较密集的计算;数据处理方式固定,每个像素执行相同的操作,具有较高的自动化程度;数据处理过程并行性较高,各像素计算形式相同,且相邻像素间的交互是局部的。所以,遥感影像的多数处理算法适合于基于GPU的算法并行改进方式。

关键词:OpenCL;CPU+GPU;并行改进;算法加速;加速比

中图分类号:P208 文献标识码:A 文章编号:1009-3044(2018)23-0084-03

Abstract: OpenCL is a universal programming framework for heterogeneous parallel computing platforms. Because of the addition of the OpenCL model, algorithm acceleration based on heterogeneous systems is increasingly used in remote sensing image processing.In remote sensing image processing, many image processing algorithms are aimed at the operation of pixels and need to be iteratively cycled by pixels.The processing methods of these types of algorithms all have the following characteristics: the data volume is abundant, and more intensive calculations are needed; the data processing methods are fixed, each pixel performs the same operation, and has a high degree of automation; the data processing process has high parallelism. Each pixel is calculated in the same form, and the interaction between adjacent pixels is local. Therefore, most of the processing algorithms for remote sensing images are suitable for parallel improvement of GPU-based algorithms.

Key words: OpenCL; CPU + GPU; parallel improvement; algorithm acceleration; acceleration ratio

OpenCL异构并行编程模型是以OpenCL软件模型为基础构建的CPU+GPU异构系统平台,在异构系统平台上实现影像处理算法的并行计算,理论上可以大大提升影像处理算法的速度。OpenCL提供了基于数据和基于任务两种并行方式,它同时支持多种显卡设备,支持OpenCL的平台在迅速增长,众多硬件平台厂商采用和支持或计划支持OpenCL,OpenCL模型的跨平台通用性,得到了研究学者的广泛支持,它的适用范围在不断扩大[1]。

随着集成电路技术的发展进步和异构并行计算架构的发展,目前,多核心CPU并行與CPU+GPU异构并行两种并行算法改进模式已经成为算法并行计算研究中常用的方式。虽然在国内外研究中并行模型在其它多种研究领域都得到了发展,但是由于异构并行系统的应用复杂性与并行软件模型的局限性,基于GPU的并行计算一始终未在遥感影像处理领域得到发展。CUDA并行计算模型架构的推出才使GPU并行计算逐渐被应用到遥感影像处理领域[2]。但CUDA模型不具有跨平台的通用性,在多核新时代并行程序的开发需求,应该有一个通用的标准模型来开发算法程序,使得算法能够在所有完全不同的设备上进行执行,由此OpenCL出现了。OpenCL是一个通用标准编程的框架,OpenCL即是语言同时也是一种编程架构,它包含有大量的API函数,这些函数可以实现硬件间的通信[3]。类C语言顾名思义是C语言的一种延伸,它是内核函数的编写依据,包含有许多用于并行计算的运行库,API函数负责完成主机端和设备端之间的通信。

OpenCL是面向GPU、CPU和其他处理器通用计算编程的行业标准框架。现阶段异构系统编程已经变成一种十分重要的并行计算编程平台,OpenCL是满足这些异构系统编程需求的第一个通用的行业标准[4]。OpenCL的架构由平台模型(Platform Model),执行模型(Execution Model),内存模型(Memory Model),编程模型(Programming Model)四种模型组成。

1 OpenCL软件模型

平台模型是由一个主机端设备(Host)和许多个OpenCL的设备端设备(Device)组成,主机端设备可选择为FPGA软核处理器、ARM处理器、x86处理器等,OpenCL设备端设备的主要任务是算法的密集计算部分,设备端设备可以是GPU、FPGA、DSP等[5]。

在OpenCL的平台模型中,一个OpenCL的设备端设备包含多个计算单元CU,而一个计算单元中又包含有多个程序处理单元PE,所有程序算法中的计算操作的处理都是在最小的处理单元上进行的。程序的启动与运行结束和对计算单元的控制都由主机端来负责,一个并行算法的计算程序是由主机端启动程序运行,然后主机端的控制单元向设备端发送开始计算的指令,设备端设备的处理单元在计算完成后将计算的结果反馈给主机端,最后由主机来输出计算结果[6]。

四种不同存储方式的内存类型构成了OpenCL的内存模型:全局内存(global memory):全局内存是指相同计算单元内处理单元的共享内存,计算单元内的每个处理单元都可以读写全局内存中的数据。常量内存(constant memory):常量内存是在程序运行中始终保持不变的内存,不受其他数据操作的影响,算法中的常量参数可以存放在常量内存中,减少读写数据对时间的消耗。局部内存(local memory):局部内存是在小范围内共享的内存,这个小范围包含一个工作组中的处理单元,这些处理单元可以实现对局部内存中数据的任意操作。私有内存(private memory):私有内存顾名思义是不能共享的内存,它只属于每个处理单元本身,计算单元内的每个处理单元都拥有只属于自己的内存,对其的读写操作只有处理单元可以完成。

OpenCL的程序分为两个部分,一部分是主程序在主机端运行,这部分程序负责存储空间的分配、参数的定义、管理设备端设备;另一部分是实现并行算法的核心内核程序,这部分程序在设备端运行。两者之间的联系主要是通过OpenCL API定义的上下文,主机端可以通过上下文管理在设备端运行的内核函数。

OpenCL执行模型核心的部分就是管理内核函数程序在设备端上成功运行,在将要执行的算法程序交予设备端之前,需要为内核函数程序建立一个合适的索引空间,这个索引空间同时也是内核函数程序的执行空间,称为NDRange。根据后续算法的需要,可以对索引空间指定维数,索引空间的维数可以是一维、二维或三维。在索引空间中,每一个工作节点(work-item)都拥有自己唯一独立的全局索引号(global ID),在同一个设备端设备中,所有的工作节点都需要执行相同的内核函数程序,但不同节点的操作的数据可以不相同,输出的计算结果也可以是不同的。OpenCL不仅要为所有的工作组中的工作节点分配全局索引,同时也要为整个工作组创建工作组空间(work group),工作组空间的维度与全局索引空间的维度相同,它的作用为把整体的索引空间分割为一个个小的工作空间,有利于局部操作。全局空间中每个工作组空间都有一个唯一的工作组索引号,而且所有的工作节点统一分配使得每个工作组空间中都包含有相同数量的工作节点。在同一个工作组空间内部,每个工作节点在这个工作组中的都拥有自己的局部索引号(local ID),以方便索引。

2 Kernel函数与OpenCL模型优化策略

Kernel函数即OpenCL内核函数是在设备端并行执行的函数,是OpenCL模型中最关键的核心函数,由__kernel限定符进行标识。一个OpenCL应用包含两个部分:宿主机程序和一个或多个内核函数,内核函数是在OpenCL设备端执行的函数,OpenCL并没有规定主机端程序工作的具体细节,只是对主机端与内核对象如何交互进行了定义。内核函数完成一个应用中的具体计算工作,通常都是算法密集计算部分的简单函数,应用通过内核函数将主机端传入的输入内存对象转化为输出内存对象后再反馈给主机。OpenCL的内核函数构建是通过类C语言来实现,所有的应用实现都必须支持OpenCL内核函数。

内核函数的执行必须构建内核对象和程序对象,在图像处理应用中可以开辟的内存对象有一维的数据块(buffers)和二维的图像对象(images),两种对象均可以实现图像数据在内核与主机端之间的交互。在主机端开辟所需的内存对象,把内核函数执行过程中所需的参数传入内核函数,为了完成向内核函数参数的传递,必须定义内核对象,内核对象可以通过API函数进行处理,可以通过函数设置内核参数和查询内核函数信息。内核对象由程序对象完成创建,程序对象包括程序源代码中的内核函数的集合,它的主要用途为针对设备端设备进行内核的编译,它还有利于程序的构建和程序中错误信息的查询。通俗来讲,程序对象就像包含一组内核函数的动态库,程序对象可以由外部的二进制码和类C语言创建,构建程序,调用已有内核函数排队执行。

3 试验及结果分析

为验证OpenCL异构并行编程模型在遥感影像处理中的应用可行性,以遥感影像中畸变差改正算法为依据进行算法改进,并选取实验数据进行实验分析,得出OpenCL异构并行编程在遥感影像处理中的应用可行性。

由于普通数码相机的普及,使得利用普通数码相机进行数字摄影测量处理是当前摄影测量界的研究热点之一。普通数码相机不同于量测型相机经过了严格的检校,非量测型相机存在较大的镜头畸变,如果不对影像数据进行畸变差改正则无法满足后续处理的精度要求,因此必须对非量测相机影像进行畸变差改正。

数码相机作为非量测型相机,主要存在的误差包括严重的CCD安装误差、镜头的光学畸变产生的误差以及CCD 面阵内畸变差等。经过相机检校得到相应的畸变参数,根据所得到的畸变参数对非量测型相机影像进行畸变差改正,可以保证影像后续处理环节的精度。

研究试验选取影像数据为SONY相机拍摄的广西地区的无畸变影像数据,影像的像幅大小:7396*4924,影像数量为50张:根据试验需要选取软硬件平台,试验环境和平台信息如表1和表2:

用OpenCL程序对所选取的数据做畸变差改正处理,采用两种方式进行处理,两种方式分别为调用GPU的CPU+GPU方式和传统CPU串行处理方式,记录两区域数据每种方式的每张影像处理用时,对影像数据求得平均每张影像CPU和CPU+GPU用时见表3:

表3结果可以看出CPU+GPU方式算法加速效果明显,平均加速比为每张影像加速比的平均值。但畸变差改正平均每张影像的用时包含主机端CPU影像读取与向GPU传递参数的时间,仅仅这个加速比不足以体现GPU的计算能力带来的加速效果,因此进一步计算平均每张影像计算部分的加速比如表4:

4 结束语

本文针对提升遥感影像处理算法速度问题,提出了基于OpenCL异构并行改进方式,调用GPU实现算法加速的方法,基于该方法实现了无人机影像的畸变差改正程序开发并利用实际飞行数据进行了试验验证。试验证明这种方法可以达到良好的加速效果,整体加速比为5.789倍,计算部分加速比最高达53倍多。展望整个遥感影像处理全流程中,许多含有密集运算的影像处理算法都可以通过此方式实现算法的加速。算法的加速效果与设备的配置和算法中计算任务的分配方式均有关系,具体的结论有待于后续进一步的深入研究。

参考文献:

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

[2] 肖汉.基于CPU+GPU 的影像匹配高效能异构并行计算研究[D].武汉大学,2011.

[3] 赵铠楠.谈CUDA和OpenCL 的差异和发展前景[J].科技经济市场:2015(12).

[4] 熊英,罗琼.基于OpenCL的NDVI算法的并行化实现[J].电脑开发与应用,2013,26(11):77-78.

[5] 马歌,肖汉.基于OpenCL的Prewitt算法的并行实现[J].现代电子技术,2014,37(20):103-106.

[6] 张清华.基于OpenCL的神经网络BP算法研究及实现[D].昆明理工大學,2010.

【通联编辑:代影】