基于GPU的GeoEye-1影像正射纠正

2016-12-26 11:58李紫凝王洁茹
地理空间信息 2016年4期
关键词:分块线程内存

颜 源,张 靖,李紫凝,王洁茹

(1.长江航道测量中心,湖北 武汉 430010;2.武汉大学,湖北 武汉 430079)

基于GPU的GeoEye-1影像正射纠正

颜 源1,张 靖2,李紫凝1,王洁茹1

(1.长江航道测量中心,湖北 武汉 430010;2.武汉大学,湖北 武汉 430079)

在介绍和分析GPU并行编程方法的基础上,给出了在GPU上进行GeoEye-1影像正射纠正的算法过程。利用NVIDIA Quadro 600显卡对31 985像素×15 251像素的3波段GeoEye-1影像进行正射纠正,其总体速度比没有加速的算法提升40%以上。试验结果表明,采用GPU并行处理技术可以提升遥感影像处理效率。

正射纠正;并行计算;GPU;CUDA;GeoEye-1

由于卫星影像在成像过程中受到地形起伏的影响,导致像点发生位移,定位精度较低,可以满足影像浏览、景观地图制作等不需要高几何精度的项目需要,但对于一些要求高精度影像、需要生产DOM的项目,如城市规划、地理国情普查等,未进行正射纠正的影像不能满足精度要求,需要对其进行正射纠正。

GPU计算就是运用GPU来加速通用科学和工程应用程序。GPU具有数以千计的计算核心,能够快速处理繁重的计算任务,可实现前所未有的应用程序性能[1]。GPU加速程序编写关键在于分解任务,合理分配GPU各线程的计算。

1 基于GPU的正射纠正

1.1 GPU并行编程方法

GPU具有比CPU多得多的处理核心,能够使数以千计的线程同时计算,适合进行高密度的计算[1]。CUDA是NVIDIA推出的通用计算架构,该架构能够使GPU解决非常复杂的计算问题,并支持C语言扩展。

CUDA程序分为host端和device端。host端利用CPU进行串行处理运算量较小的任务,如数据准备、内存管理、数据传输等,device端利用GPU进行高计算密度的并行处理。CPU和GPU相互配合,充分利用各自优势,可大幅提升计算效率。CUDA程序可通过在Visual Studio中的集成调试工具Nsight(http:// www.nvidia.com/object/nsight.html)进行开发调试,其操作方法与在Visual Studio开发环境中调试C/C++代码类似,为编写CUDA程序提供了方便。

CUDA程序以线程为执行单元,若干个线程构成线程块,线程块的执行相互独立,线程块内的线程共享Shared Memory,线程块之间共享Global Memory[1]。设定线程块数为N,线程块内的线程数为M,则总线程数为N×M。线程块和线程数的多少与GPU的参数有关。CUDA程序通过调用核函数来启动多线程执行并行计算。核函数的调用模式为kernel〈〈〈blockNum, threadNum〉〉〉(function argument),〈〈〈…〉〉〉为核函数的执行配置语法。核函数内通过线程块索引blockIdx和线程索引threadIdx来定位像素,像素在for循环中的索引为index,for循环语句的结构为for( index = threadIdx.x+blockId.x*threadNum; index〈nPixels;index += threadNum *blockNum)。nPixels为影像块的像素数,blockNum、threadNum分别为线程块数、线程数。

1.2 RPC正射纠正

为了避免纠正后影像出现像素空白区,纠正时一般采用反解法,即从空白影像出发,逐像素反解其在原始影像的像素坐标,然后通过内插获取该像素的灰度值[2]。GeoEye-1提供了RPC模型代替严格成像模型,RPC模型形式简单,可获得与严格成像模型一致的精度,是目前高分辨率卫星广泛采用的几何模型[3-5],采用RPC模型生成正射遥感影像是其重要应用[6-8]。

1.3 算法过程

1.3.1 总体思想

将计算量大的部分分配给GPU,CPU则负责数据准备、内存分配、逻辑处理、数据传输等;对于用反解法进行正射纠正来说,计算量大的部分主要是像点坐标计算和灰度重采样,这一部分可分配给GPU计算;影像读写、DEM读取、RPC参数读取等计算量较小的任务分配给CPU。高分遥感影像数据量普遍较大,如果一次全部读入内存,可能会导致内存不足。为了在内存有限的条件下进行大数据量的计算,必须对影像进行分块纠正。一次读入一定大小的块,纠正完成后,写出到磁盘,再读入下一块,继续同样的纠正过程,直到最后的块纠正完成。为了简化程序编写,实验程序是基于开放遥感平台OpenRS来完成的。

1.3.2 程序实现流程

如图1所示,host端读入DEM、RPC文件,计算纠正后影像大小,创建输出影像,分块读入原始影像并拷贝到device端。device端设计两个核函数,分别负责像点坐标计算和灰度重采样,灰度重采样选择双线性内插方法。

图1 基于GPU的正射纠正过程

2 精度和速度分析

为检验基于GPU的遥感影像正射校正的精度和速度,下面以云南省楚雄彝族自治州的Geoeye-1数据作为实验对象。影像分辨率1.65 m,影像大小31 985列、15 251行、3波段、2.72 GB。DEM采用美国提供的90 m分辨率的免费SRTM数据。数据测试电脑配置:4核CPU、3.3 GHz,显卡NVIdIA Quadro 600,计算能力2.1。为分析GPU加速的性能,编写了基于GPU加速和单核CPU处理两种正射纠正程序。

1)精度是速度的基础,首先进行精度分析。参照对象选择ENVI正射纠正结果。将单核CPU的纠正结果、GPU加速的正射纠正结果与ENVI正射纠正结果进行比较,通过ENVI链接地理坐标,查看相同坐标是否定位在同一地物。

图2 采用GPU编程的正射纠正结果和局部放大图

图3 ENVI软件正射纠正结果和局部放大图

图4 只采用CPU进行正射纠正的结果和局部放大图

图2~图4均在ENVI的地理坐标链接状态下,即局部放大图中红色十字丝的交叉点坐标相等。从3幅局部放大图可以看出,红色十字丝均定位在同一处,表明本实验编写的GPU加速及单核CPU正射纠正程序正确,其纠正精度与ENVI一致。

2)速度分析。多次运行程序,统计各次影像读取部分时间和总运行时间。

从表1可以看出,GPU加速的正射纠正程序相对于未加速的程序,速度可提升约40%。随着影像数据量的增加,计算量增大,这种优势会更加明显。对于遥感影像处理来说,除了计算量大之外,影响程序速度的另一个主要原因就是影像读取。从表中可看出,对于单核CPU、GPU加速2种正射纠正程序,影像读取的时间分别占整个程序运行时间的44%和76%。要减少影像读取的时间,就要尽量减少读取影像次数,若内存和显存都足够大,可以尽量读取较大的影像块,并拷贝到显存,以减少影像读取的频率,从而减少CPU的运行时间。

表1 正射纠正时间统计

GPU加速程序中,数据主要存储在GPU的Global Memory。由于Global Memory访问延迟在400~600个时钟周期,其访存效率较低,但其分配的空间位于显存,可分配的容量最大。 Local Memory和Shared Memory设有缓存机制,比Global Memory访存效率高,但容量都很小,不能作为影像数据的主要存储类型。

在已有硬件条件下要提升遥感影像的并行化计算效率,可以从以下几个方面来考虑:

1)优化算法结构。确定算法中的串行和并行部分,尽量分解为能并行化执行的结构,充分利用GPU的性能,同时也要综合考虑并行化效率和host端与device端之间数据传输的时间消耗。

2)优化存储器的使用。尽可能多地使用Local Memory和Shared Memory,减少对Global Memory的访存。

3)优化指令流。采用合适指令,避免线程冲突,尽量减少条件选择等逻辑运算。

4)优化影像读写性能。遥感影像的分块读写几乎要占用约一半的处理时间,影像读写的效率直接影响整个程序的性能。程序采用GDAL库进行影像分块读写,其总体效率并不高[9];可以考虑采用内存文件映射技术进行影像读写,以减少I/O操作,在分块读写大数据量的遥感影像时,I/O效率会得到大幅提升。

3 结 语

遥感影像处理大多是基于像素进行,像素之间的计算模式相同,各波段的计算模式也相同。其处理模式可分为2步:①基于像素坐标对各像素进行一系列数学运算,若不存在几何处理,则得到的是各像素坐标新灰度值;若存在几何处理,则变换得到新的像素坐标;②对新像素坐标赋灰度值,也就是灰度重采样。这2步都是基于像素进行同质的计算,因此遥感影像处理算法大多都可用GPU作并行化处理。在解决了各种算法并行化的瓶颈问题之后,另一个重要问题就是影像I/O,较好的解决办法是通过内存文件映射方式来读写影像,可大幅提升文件I/O效率。

[1] Jason S,Edward K.高性能编程之CUDA实战[M].北京:机械工业出版社,2011

[2] 王佩军,徐亚明.摄影测量学[M].武汉:武汉大学出版社,2010 [3] 宋伟东,陈静波,王伟玺.高分辨率遥感影像单片定位及正射纠正方法[J].辽宁工程技术大学学报:自然科学版,2009,28(1):37-39

[4] 苏逸平,陈春华.高分遥感影像Geoeye-1正射纠正研究[J].地理空间信息,2011,9(3):48-50

[5] 张柯南,阚明哲.GeoEye-1卫星简介及其遥感影像处理技术实践[J].城市勘测,2010(3):80-81

[6] 王海侠,高飞,胡小华.基于RPC模型的QuickBird影像正射纠正研究[J].现代测绘,2010,33(6):13-15

[7] 王红平,刘修国,罗红霞,等.基于RPC模型的IRS_P5影像正射校正[J].中国地质大学学报,2010,35(3):486-488

[8] 宋伟东,陈静波,王伟玺.高分辨率遥感影像单片定位及正射纠正方法[J].辽宁工程技术大学学报,2009,28(1):37-39

[9] 李民录.GDAL源码剖析与开发指南[M].北京:人民邮电出版社,2014

P231

B

1672-4623(2016)04-0070-03

10.3969/j.issn.1672-4623.2016.04.023

颜源,硕士,工程师,主要从事卫星遥感数据处理和在长江航道测绘中的应用工作。

2015-03-26。

项目来源:国家自然科学基金资助项目(41301367)。

猜你喜欢
分块线程内存
钢结构工程分块滑移安装施工方法探讨
基于C#线程实验探究
分块矩阵在线性代数中的应用
基于国产化环境的线程池模型研究与实现
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
浅谈linux多线程协作
内存搭配DDR4、DDR3L还是DDR3?
基于两级分块的文件同步方法
分块矩阵在矩阵证明题中的应用