时间:2024-07-06
莫德林,戴晨光,张振超,胡玲
(信息工程大学地理空间信息学院,郑州450001)
一种基于OpenACC的遥感影像正射纠正快速实现方法
莫德林,戴晨光,张振超,胡玲
(信息工程大学地理空间信息学院,郑州450001)
利用CUDA语言移植旧程序时需要重新设计算法,花费较多的时间,效率不高。针对这一问题,本文在分析正射纠正算法并行性的基础上,提出一种基于OpenACC的遥感影像正射纠正快速实现方法,并与基于CUDA的正射纠正方法进行对比。通过正射纠正实验表明,OpenACC能通过对源代码的较小改动将其移植到GPU中,获得一定的加速比,其可移植性好,代码开发效率较高。
OpenACC;CUDA;正射纠正;加速比
多核的CPU和众核的GPU(Graphic Processing Unit,即图形处理器)已经成为目前大多数计算机中最重要的两种处理器,科研人员积极寻找专业领域与GPU并行处理的结合点,对GPU并行计算进行了有益的探索。数字正射影像是地球空间数据框架的一个基础数据层[1],被视为快速成图与更新的重要手段。因此,提高数字正射影像的生产效率具有重要的作用。杨靖宇[2]提出一种基于CUDA(Compute Unified Device Architecture,统一计算设备架构)的遥感影像正射纠正GPU-CPU协同处理方法,实现了重采样操作的GPU细粒度并行化。然而,初次接触GPU的科研人员往往需要较长的时间才能完全掌握CUDA程序的编写与优化[3]。为此,PGI、Cray和NVIDIA3家公司联合创立OpenACC应用编程接口标准。OpenACC使得科研人员能够更加自由地将时间投入到自己的研究中,而又能在更短的时间内使程序得到加速。本文实现了一种基于OpenACC的遥感影像正射纠正方法,通过将计算密集区域加载到GPU上进行并行计算,提高了算法的执行效率。
OpenACC借鉴OpenMP的导语(directive)模式,在原始代码上添加导语,告诉编译器将哪些代码块加载到加速器上执行、如何在主机与加速器之间移动数据[4]。如果编译器不支持OpenACC标准或支持选项没有打开,编译器将忽略所有的OpenACC导语,编译出的程序只在CPU上运行。OpenACC程序不必对原始代码作过多的修改,可以让相同的代码在多核CPU、GPU或任何编译器支持的其他类型的并行硬件上运行[5]。
在C/C++语言中,用语言本身提供的#pragam机制来引入OpenACC导语。OpenACC导语在C/C++语言中的语法是:
#pragma acc directive-name[clause[[,]clause]…]new-line
OpenACC导语包含四个部分[5]:
①数据管理
数据管理导语包括data构件和update导语。data构件指明的标量、数组和子数组都会在加速器内存上开辟空间。进入本区域时,数据被从主机复制到加速器内存,离开本区域时,数据被从设备复制到主机内存。update导语用在显式或隐式数据区域中,使加速器内存中数组的值和主机内存中相应数组的值相互传递。
②工作管理
工作管理导语包括parallel构件、kernel构件和loop构件。OpenACC提供两个计算构件(parallel和kernels),并能详细指定并行方式(gang、worker、vector的值,对应于CUDA的grid、block、thread的值),通过编译器将循环转换为高效的低层级语言代码(CUDA/OpenCL)。loop构件可以描述执行这个循环的并行类型,还可以声明循环的私有变量、数组和归约操作。
③其他语法
其他语法包括cache构件、host_data构件、wait导语和declare构件。Cache构件指定哪些数组元素或子数组需要为循环体而预取到最高层级的缓存中,host_data构件使加速器上数据的地址在主机上可用,wait导语使主机等待一个异步活的完成declare构件指定的变量或数组需要在加速器内存上开辟空间。
④运行时例程
OpenACC提供多个运行时例程,可以设置加速器设备的参数,如例程acc_set_device_type告诉运行时环境使用哪种类型的设备来执行加速器parallel区域和kernels区域。
数字微分纠正中,一般是利用反解公式求解坐标变换系数,计算对应像元的坐标,然后进行灰度重采样,最后将重采样后的灰度值赋值给纠正后的像元。影像灰度重采样操作是典型的计算密集型模块,其处理流程相对固定,每个数据点上的计算形式相同,数据点之间相互独立,具有内在的并行性,因此非常适合GPU并行处理。由于遥感影像的数据量一般都比较大,相对于坐标变换系数的求解,重采样操作将耗费更多的时间,所以正射纠正并行化的重点应该是重采样操作的并行化[3]。正射纠正的流程如图1所示。
图1中虚线框内是并行计算区域。要将并行计算区域加载到加速器上进行计算,必须先设定环境以及将数据复制到加速器内存上。
图1 正射纠正流程图
基于OpenACC的正射纠正步骤如下:
①环境设定;
//设定执行并行计算区域的设备类型
void acc_set_device_type(acc_device_t);
②使用data构件将原始影像、结果影像和DEM数据复制进显存;
#pragma acc data copyin(SourceImage[0:width*height])
③使用kernels指令定义核心;
#pragma acc kernels present_or_copyin (SourceImage[0:width*height]){
④使用loop指令定义外层循环;
#pragma acc loop independent
for(….){
⑤使用loop指令定义内层循环;
#pragma acc loop independent
for(…){
//计算坐标变换系数、灰度重采样以及灰度赋值,同时把结果放入目标内存
}}}
⑥将结果复制到主机端,释放空间。
//#pragma acc update host();
void acc_shutdown(acc_device_t);//断开程序与加速器设备的连接
本文使用的实验平台CPU为Intel(R)Core(TM) i5,内存大小为4GB,显卡为NVIDIA Quadro FX 3700。实验平台的软件开发环境为:Windows7 32位操作系统,PGI编译器;NVIDIA公司提供的CUDA 5.0版本的开发包。
本文使用的实验数据为2009年获取的河南登封某地区DMC航摄影像,地面采样间隔为0.25米。正射纠正所用的DEM数据为影像多视匹配获得的点云数据经过滤波获得,将其内插为0.25米规则格网数据。表1为不同范围大小的影像基于CUDA与基于OpenACC的正射纠正时间对比结果。
由表1可见,基于CUDA和基于OpenACC的并行算法与基于CPU的串行算法相比,都能获得一定的加速比,且加速比随着数据量的增大而增大。在数据量较小时,加速效果并不明显。这是因为基于CUDA和基于OpenACC的并行计算过程中,要在主机和加速器之间进行数据传递,这将耗费一定的时间资源,如果数据量较小,则在加速器上运算时间与数据传递时间之比也小,加速效果则不明显。当数据量增大,在加速器上运算满载时,运算时间与数据传递时间之比合理,则能达到最大的加速比。
CUDA程序经过优化后,其加速比较OpenACC大。其原因是CUDA程序经过存储器优化后,可大大减少存储访问的时间。在OpenACC中,数据传递与访问是隐式进行的,无法使用类似CUDA的共享内存,所以其访存时间要比CUDA程序长。然而,从代码开发的效率方面看,OpenACC程序只需要在串行代码中增加OpenACC指令,就能将指定的并行区域加载到GPU上,取得10倍左右的加速比。这种方式保留了代码的通用性,不破坏原代码,开发速度快,既可并行执行又可恢复串行执行。而且,在硬件升级时,重新编译一次代码即可,不必手工修改代码。更为重要的是,随着编译器的进一步优化和硬件技术的发展,OpenACC与CUDA在底层技术实现上的差距将会越来越小[6],而且支持OpenACC指令的设备将不仅仅限于CUDA设备,还将扩展到其他更多厂商的硬件加速器,从而提高OpenACC程序的可移植性。
表1 GPU粗粒度并行下灰度重采样时间结果表
本文以正射纠正算法为对象,通过在串行代码的基础上加入OpenACC指令,将坐标计算、灰度重采样计算以及灰度赋值区域加载到GPU上,得到较高的加速比,提高了算法的执行效率。这种方法不仅效率高,且不改变原来的代码结构,大大增强了代码的可移植性,对其他的影像处理算法有一定的参考价值。
[1]耿则勋,张保明,范大昭.数字摄影测量学[M].北京:测绘出版社,2010.8.
[2]杨靖宇,张永生,李正国等.遥感影像正射纠正的GPU-CPU协同处理研究[J].武汉大学学报(信息科学版),2011,36(9):1043-1046.
[3]张舒,褚艳利.GPU高性能运算之CUDA[M].北京:中国水利水电出版社,2009.
[4]Tetsuya Hoshino,Naoya Maruyama,Satoshi Matsuoka. CUDA vs OpenACC:Performance Case Studies with Kernel Benchmarks and a Memory-Bound CFD Application[C]. 13th IEEE/ACM International Symposium on Cluster, Cloud,and Grid Computing,2013(136-143).
[5]"The OpenACCApplication Programming Interface,Version 1.0,"November 2011.
[6]曾文权,胡玉贵,何拥军等.一种基于OPENACC的GPU加速实现高斯模糊算法[J].计算机技术与发展,2013,23(7):147-151.
A Fast Implementation M ethod of Remote Sensing Image Ortho-rectification Based on OpenACC
MO De-lin,DAIChen-guang,ZHANG Zhen-chao,HU Ling
(Institude of Geospatial Information,Information Engineering University,Zhengzhou 450001,China)
Algorithms need to be redesigned when using CUDA to transplant old programs.This will cost a long period of time,which leads to a low efficiency.Aiming at solving this problem,a fast implementationmethod of remote sensing image ortho-rectification based on OpenACC is proposed,and compared with ortho-rectification based on CUDA in this paper.Ortho-rectification experiments show that OpenACC can transplant program to the GPU with small changes,and get a speed up ratio.The portability is good,and the efficiency of code development is high.
OpenACC;CUDA;Ortho-rectification;Accelerated ratio
P231
B
10.3969/j.issn.1001-0270.2014.02.21
2014-01-20
莫德林(1988-),男,广西贵港人,硕士研究生,主要从事遥感图像处理的研究。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!