基于cuda的格网数字高程模型邻域分析的系统和方法

文档序号:6377064阅读:166来源:国知局
专利名称:基于cuda的格网数字高程模型邻域分析的系统和方法
技术领域
本发明属于高性能地理信息计算领域。具体涉及一种基于CUDA(Compute UnifiedDevice Architecture,计算机统一架构体系)技术的格网 DEM(Digital Elevation Model,数字高程模型)邻域分析的通用加速系统。
背景技术
在地理信息系统(Geographicallnformation System, GIS)领域,数字高程模型(Digital Elevation Model,DEM)常被用来描述区域地貌形态的空间分布。目前应用广泛的DEM模型分为两类格网DEM和三角网DEM。格网DEM是给定范围内规则格网点的高程值模型。基于格网DEM的邻域分析(如,坡度、坡向分析、边缘检测、滤波变化等等),以其可以提取出很多基础性数据,而成为一类重要的空间分析。格网DEM邻域分析的特点是每个值的 计算都需要通过邻域模板找到附近的格网点数值,再按照模板算子求得最终处理结果。因此这类分析面临两个问题一是计算密集,对于每个结果值的计算都需要进行一个邻域模板的计算;二是数据量较大,工业生产的DEM数据常常达到GB量级。因此需要高性能的地理信息计算,来支撑邻域分析更广泛的应用。基于GTO的通用计算(General Purpose GPU,GPGPU),一直是高性能计算的重要方向。其核心思想是在显卡芯片上,增加用于计算的晶体管数量,降低用于寄存器的晶体管数量,使得同样工艺、同样体积的芯片中,GPU的计算能力较CPU提高上百倍。Nvidia公司提出了 CUDA(Compute Unified Device Architecture,计算机统一架构体系)技术,让开发者可以直接用标准C语言写出在GPU芯片上运行的通用计算应用程序,而不需要熟悉GPU芯片的指令。但是CUDA技术也有缺陷其计算模型不够通用。由于GPU芯片减少了大量用于缓存的寄存器数量,因此传统CPU中的缓存技术、流水线技术、指令乱序执行等优化技术无法复用。需要开发自己考虑如何从存储器件获取数据以及规则化指令执行的细节问题。因此将传统的基于CPU的程序移植到GPU芯片上,需要重新设计并编写代码,移植成本巨大。如何将传统的算法应用于CUDA环境是GPU高性能研究领域的需要解决的问题。目前,已有很多研究将CUDA的高性能计算应用于GIS领域,尤其是DEM处理领域,如范国忠等研究过地杂波快速仿真[1],赵向辉等研究过汇流分析并行算法[2],刘二永等研究过基于CUDA和DEM的IDW并行算法分析M,高勇等研究过基于通视分析M等。但是这些研究都只是将一个算子应用于CUDA优化,还没有研究给出一个更通用的方案。

发明内容
本发明提出了一种基于CUDA的格网DEM邻域分析的通用加速系统,目的是提供一个通用的加速系统和方法,既能利用GPU高性能地处理格网DEM邻域分析问题,又能复用CUDA加速格网DEM邻域分析过程中相同的部分,简化开发过程。为了达到上述目的,本发明的技术方案如下—种基于CUDA的格网数字高程模型邻域分析的系统,包括数据10模块、函数调度模块、核函数模块、邻域分析算子,其特征是,所述数据IO模块,独占一个线程,该线程称为IO线程,提供数据读写支持;所述函数调度模块,负责协调数据的IO线程和CUDA核函数(CUDA中在GPU上执行的函数)的执行;该模块开辟出多个内存块用作缓冲区,同时启动多个线程,一个线程负责数据10,即IO线程;其余线程称为worker线程,其个数与主机的GPU数量一致,每个worker线程对应一个GPU ;这样的作用是让数据IO和CUDA函数执行并行执行,提高计算性能;所述核函数模块,负责将数据从内存缓冲区中拷贝到GPU芯片的存储器上,调用CUDA核函数对数据进行计算,并在计算结束后将数据从GPU芯片的存储器拷贝到内存中;所述邻域分析算子,被核函数模块调用,用以执行邻域分析中单个邻域模板的数据计算;所述邻域分析算子对外以函数接口提供,由系统使用者实现。本发明同时提供一种基于CUDA的格网DEM邻域分析的方法,包括如下步骤 I)实现邻域分析的函数,并将该函数指针传给CUDA核函数,进行注册;2)启动一个IO线程,从输入文件读取原始DEM数据分块导入到内存缓冲区;当所有的缓冲区都写满数据时,进入阻塞状态,等待数据被worker线程处理;3)采用生产-消费者模型,IO线程充当生产者,worker线程充当消费者,当IO线程向一块内存缓冲区写满数据后,会唤醒一个空闲的worker线程tl对该内存缓冲区的数据进行处理;4)worker线程tl将数据从内存缓冲区bufferl拷贝到GPU存储器;5)WOrker线程tl将数据拷贝到GPU存储器后,调用已经注册过邻域分析算子的CUDA核函数,进行计算处理,得到结果数据;6)worker线程tl将结果数据从GPU存储器拷贝到内存中;7)把结果数据写回内存缓冲区bufferl,并唤醒10线程;8)将缓冲区bufferl中的结果数据写出到输出文件,并读取输入文件中的原始DEM中的下一块数据到缓冲区bufferl中,当所有的缓冲区都写满数据时,进入阻塞状态,等待数据被worker线程处理,然后转到步骤3); 9)重复步骤2) -8),直到输入文件全部处理完毕。本发明的有益效果通过数据10和计算并行、CUDA并行,本发明会大大加速格网DEM邻域分析过程的处理速度。


图I本发明系统模块示意2本发明的流程图
具体实施例方式整个框架模型(如图I所示),分为四个模块分别是数据10模块、函数调度模块、核函数模块、邻域分析算子。数据10模块,独占一个10线程,提供数据读写支持。可以注册不同的数据驱动引擎,能够从文件系统、数据库、网络等数据源读取数据,并以二维矩阵的形式在内存缓冲区中存储。这样可以屏蔽底层数据源格式的差异,读取的结果都是一个矩阵。接口参数参照GDAL (Geospatial Data Abstraction Library)中的 RasterIO 函数,读取的数据存放在一个二维矩阵中。在读取数据的时候,按照设定好的分块大小,分块读取数据源的数据。如果原始文件小于设定的块大小,一次将数据全部读入内存中;如果原始数据很大,大于设定的大小,则按照设定的分块大小读取数据。数据读到内存中后,函数调度模块和核函数模块可以通过矩阵的指针获取矩阵中不同的数据。对于分析处理后的结果数据也保存成矩阵,并通过扩展的插件写入到文件系统、数据库、网络中去。每当一块数据读取或者写入完毕后,会通知函数调度模块。函数调度模块,采用生产者-消费者模型来调度数据IO函数和CUDA核函数。该模块在内存中开辟多个内存缓冲区。该模块还负责启动多个线程,一个线程负责数据IO (10线程),剩余线程(记作worker线程)的个数与主机的GPU数量一致,每个worker线程对应一个GPU。这样的作用是让数据IO和CUDA函数执行并行起来,提高计算性能。数据IO线程充当生产者,将输入文件中的原始DEM数据读取到缓冲区中worker线程充当消费者,处理缓冲区中的数据,并把处理后的结果数据更新到缓冲区中。当数据10线程向一个缓冲区写完数据后,会触发一个worker线程来消费缓冲区中的数据,并把结果数据更新缓冲区中;当一个worker线程将结果写回缓冲区后,也会触发数据10线程,将缓冲区的数据写到 输出文件,同时再从输入文件读取另一部分数据给缓冲区模块,形成循环;当没有数据可读时,数据10模块会在缓冲区中标记数据读完毕,并停止执行,消费者线程看到这个标记也会停止执行。核函数模块,在显卡上执行,负责将数据从内存传输到显卡存储器,调用邻域分析算子,再将结果从显卡存储器写回内存。在CUDA模型中,一个GPU芯片上可以并行很多个线程,这些线程有各自的编号。若干个线程组成一个block,一个block内的线程如果同时获取GPU存储器上一段连续的存储空间,则可以加速10,称为接合。若干个block组成一个grid。首先核函数会将GPU存储器上的数据,分割成块,每块被分到一个block的线程中,每块的大小和block中的线程数对应。相邻的线程分到的数据会在边界有叠加,叠加的大小取决于模板的大小。例如,一个bIock中有n*m个线程,邻域模板大小是k,那么每块的大小就是(n+k-1)* (m+k-1)。一个block中的线程按照接合的特点从GPU存储器中读取数据,然后每个线程执行一个邻域分析算子操作。同一个block中的不同线程(thread)执行的模板操作指令是一样的,这样可以让一个block中的不同的线程,尽可能的共享指令前段。每个block中的线程不是从数据块的边缘计算,而是从与边缘相距邻域模板算子一半的距离计算。在调用算子计算结束后,计算结果会写回GPU存储器中。然后再从GPU存储器写回内存的缓冲区中。邻域分析算子,是一个邻域计算的函数接口,系统使用者可以根据需求实现不同的函数,并以函数指针的形式向CUDA核函数注册。每一个CUDA线程具体执行邻域分析算子的操作。邻域分析算子,通过函数指针的形式向核函数模块注册。注册时,注册函数包含邻域算子模板的长、宽、邻域算子的函数指针。邻域算子函数是一个模板函数,允许不同数据类型的数据进行运算。邻域算子函数的输入参数是矩阵的起始位置、目标点的行数、目标点的列数、矩阵总行数、矩阵总列数,输出为该点经过邻域计算后的结果值。实施例下面以3*3的平滑滤波为例,详述本发明的实施方式(如图2)。
I.注册算子函数。对于n*n中值滤波的邻域分析,系统使用者需要实现一个邻域分析算子,其输入参数包括,待处理矩阵的起始位置P,第j行,第i列,总行数height,总列数 width,形如 avr_f ilter (f loat*p, int j, int i, int height, int width)。输出参数为目标点位中心的邻域模板中所有值的和除以n*n得到的值。然后调用系统提供的邻域分析
注册函数。注册该邻域分析算子,同时注册模板大小η。注册函数形如registeroperator (void*avr_filter, int η)。其中,avr_filter是函数指针,η是本例中邻域模板的大小。在执行时,核函数模块会根据模板的大小,调整数据分割时叠加的数据大小。2.数据IO :启动一个IO线程,从输入文件读取原始DEM数据分块导入到内存缓冲区。数据分块的大小可以设定,默认为256*256 (经验证,该值效果较好)。当所有的缓冲区都写满数据时,进入阻塞状态,等待数据被worker线程处理。3.函数调度采用生产-消费者模型,IO线程充当生产者,worker线程充当消费 者。当IO线程向一块内存缓冲区写满数据后,会唤醒一个空闲的worker线程(记做tl)对该内存缓冲区的数据进行处理。4.内存与GPU存储器数据传输:worker线程tl,将数据从内存缓冲区bufferl拷贝到GPU存储器。5.邻域分析算子执行worker线程tl将数据拷贝到GPU存储器后,调用已经注册过邻域分析算子的CUDA核函数,进行计算处理,得到结果数据。6.内存与GPU存储器数据传输worker线程tl,将结果数据从GPU存储器拷贝到内存中。7.函数调度把结果数据写回内存缓冲区bufferl,并唤醒10线程。8.数据10 :将缓冲区bufferl中的结果数据写出到输出文件,并读取输入文件中的原始DEM中的下一块数据更新到缓冲区bufferl中,当所有的缓冲区都写满数据时,进入阻塞状态,等待数据被worker线程处理,转到步骤3 ;9.重复步骤2)-8),直到输入文件全部处理完毕。参考文献[1]范国忠,黄志强,张先义,杨正龙.基于CUDA和DEM数据的地杂波快速仿真[J].现代雷达.2010 (09)[2]赵向辉,苗青,付忠良,苏畅,李昕.基于CUDA的汇流分析并行算法的研究与实现[J].计算机应用研究.2010 (07)[3]刘二永,汪云甲.基于CUDA的IDW并行算法及其实验分析[J].地球信息科学学报· 2011(05)[4]Yong Gao, Hao Yu, etc. “Optimization for Viewshed Analysis on GPU”,onGeo informatics, 201119th International Conference.
权利要求
1.一种基于CUDA的格网数字高程模型邻域分析的系统,包括数据IO模块、函数调度模块、核函数模块、邻域分析算子,其特征是, 所述数据IO模块,独占一个线程,该线程称为IO线程,提供数据读写支持; 所述函数调度模块,负责协调数据的IO线程和CUDA核函数的执行;该模块开辟出多个内存块用作缓冲区,同时启动多个线程,一个线程负责数据10,即IO线程;其余线程称为worker线程,其个数与主机的GPU数量一致,每个worker线程对应一个GPU ; 所述核函数模块,负责将数据从内存缓冲区中拷贝到GPU芯片的存储器上,调用CUDA核函数对数据进行计算,并在计算结束后将数据从GPU芯片的存储器拷贝到内存中; 所述邻域分析算子,被核函数模块调用,用以执行邻域分析中单个邻域模板的数据计算;所述邻域分析算子对外以函数接口提供,由系统使用者实现。
2.如权利要求I所述的格网数字高程模型邻域分析的系统,其特征是,系统的使用者通过注册不同的数据驱动引擎,从不同数据源读取数据,并以二维矩阵的形式在内存缓冲区中存储。
3.如权利要求2所述的格网数字高程模型邻域分析的系统,其特征是,所述数据源包括文件系统、数据库、网络。
4.如权利要求2所述的格网数字高程模型邻域分析的系统,其特征是,从数据源读取数据的时候,按照设定好的分块大小,分块读取数据源的数据,如果输入文件小于设定的块大小,则一次将数据全部读入内存中;如果原始数据很大,大于设定的大小,则按照设定的分块大小读取数据。
5.如权利要求I所述的格网数字高程模型邻域分析的系统,其特征是,所述函数调度模块,采用生产者-消费者模型来调度数据IO函数和CUDA核函数,数据IO线程充当生产者,将输入文件中的原始DEM数据读取到缓冲区中porker线程充当消费者,处理缓冲区中的数据,并把处理后的结果数据更新到缓冲区中;当数据IO线程向一个缓冲区写完数据后,会触发一个worker线程来消费缓冲区中的数据,并把结果数据更新缓冲区中;当一个worker线程将结果写回缓冲区后,也会触发数据10线程,将缓冲区的数据写到输出文件,同时再从输入文件读取另一部分数据给缓冲区模块,形成循环;当没有数据可读时,数据10模块会在缓冲区中标记数据读完毕,并停止执行,消费者线程看到这个标记也会停止执行。
6.如权利要求I所述的格网数字高程模型邻域分析的系统,其特征是,所述核函数模块,负责将数据从内存传输到显卡存储器,调用邻域分析算子,再将结果从显卡存储器写回内存;包括 核函数将GPU存储器上的数据分割成块,每块被分到一个block的线程中,每块的大小和block中的线程数对应;一个block中的线程按照接合的特点从GPU存储器中读取数据,然后每个线程执行一个邻域分析算子操作;同一个block中的不同线程执行的模板操作指令是一样的,这样让一个block中的不同线程尽可能共享指令前段;每个block中的线程不是从数据块的边缘计算,而是从与边缘相距邻域模板算子一半的距离计算;在调用邻域分析算子计算结束后,计算结果会写回GPU存储器中,然后再从GPU存储器写回内存的缓冲区中。
7.如权利要求I所述的格网数字高程模型邻域分析的系统,其特征是,所述邻域分析算子,是一个邻域计算的函数接口,系统使用者根据需求实现不同的函数,并以函数指针的形式向CUDA核函数注册,每一个CUDA线程具体执行邻域分析算子的操作。
8.如权利要求7所述的格网数字高程模型邻域分析的系统,其特征是,注册函数包含邻域算子模板的长、宽、邻域算子的函数指针;邻域算子函数的输入参数是矩阵的起始位置、目标点的行数、目标点的列数、矩阵总行数、矩阵总列数,输出为该点经过邻域计算后的结果值。
9.一种基于CUDA的格网DEM邻域分析的方法,包括如下步骤 1)实现邻域分析的函数,并将该函数指针传给CUDA核函数,进行注册; 2)启动一个IO线程,从输入文件读取原始DEM数据分块导入到内存缓冲区;当所有的缓冲区都写满数据时,进入阻塞状态,等待数据被worker线程处理; 3)采用生产-消费者模型,IO线程充当生产者,worker线程充当消费者,当IO线程向一块内存缓冲区写满数据后,会唤醒一个空闲的worker线程tl对该内存缓冲区的数据进行处理; 4)worker线程tl将数据从内存缓冲区bufferl拷贝到GPU存储器; 5)worker线程tl将数据拷贝到GPU存储器后,调用已经注册过邻域分析算子的CUDA核函数,进行计算处理,得到结果数据; 6)worker线程tl将结果数据从GPU存储器拷贝到内存中; 7)把结果数据写回内存缓冲区bufferl,并唤醒IO线程; 8)将缓冲区bufferl中的结果数据写出到输出文件,并读取输入文件中的原始DEM中的下一块数据到缓冲区bufferl中,当所有的缓冲区都写满数据时,进入阻塞状态,等待数据被worker线程处理,然后转到步骤3); 9)重复步骤2)-8),直到输入文件全部处理完毕。
10.如权利要求9所述的格网DEM邻域分析的方法,其特征是,所述步骤2),从输入文件读取原始DEM数据分块导入到内存缓冲区,数据分块的大小由用户设定,默认为256*256。
全文摘要
本发明公布了一种基于CUDA的格网数字高程模型邻域分析的系统,包括数据IO模块、函数调度模块、核函数模块、邻域分析算子;其中,数据IO模块提供数据读写支持;函数调度模块,协调数据的IO线程和CUDA核函数的执行,同时启动多个线程,一个线程负责数据IO,其余线程称为worker线程,其个数与主机的GPU数量一致;核函数模块,负责将数据从内存缓冲区中拷贝到GPU 芯片的存储器上,调用CUDA核函数对数据进行计算,并在计算结束后将数据从GPU 芯片的存储器拷贝到内存中;邻域分析算子,被核函数模块调用,用以执行邻域分析中单个邻域模板的数据计算。通过数据IO和计算并行、CUDA并行,本发明会大大加速格网DEM邻域分析过程的处理速度。
文档编号G06F9/46GK102880509SQ20121034462
公开日2013年1月16日 申请日期2012年9月17日 优先权日2012年9月17日
发明者高勇, 郁浩, 刘磊, 李浩然 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1