
一种用于遥感图像的io双缓存交互多核处理方法.docx
4页一种用于遥感图像的io双缓存交互多核处理方法专利名称:一种用于遥感图像的io双缓存交互多核处理方法技术领域:本发明涉及一种多核计算方法,尤其涉及一种用于遥感图像的IO双缓存交互多核处理方法,属于计算机遥感图像处理技术领域,用于遥感应用中高分全色、多光谱、高光谱和雷达等各种类型海量遥感影像的快速处理背景技术:针对海量遥感图像的处理过程往往会耗费用户大量的时间,虽然目前计算机硬件设备得到了长足的发展,但针对海量遥感图像的处理速度提升有限可能的原因在于遥感图像处理算法底层数据驱动设计不足导致没有充分利用计算机的CPU计算资源和磁盘IO资源,存在过多的计算或IO访问的等待;或者是由于对遥感图像处理算法的数据处理顺序和遥感数据的存储方式不匹配,导致磁盘IO访问过多因此为了提高遥感图像处理的效率,必须综合考虑特有的遥感图像处理算法和针对该算法优化的底层数据读写驱动和多核计算方法为了避免频繁读取、写入磁盘数据,传统的计算机遥感图像处理解决方法一种是首先将遥感图像整个的读入计算机内存当中,然后将经过各种处理生成的遥感数据同样暂存于内存,最后一并写入磁盘随着计算机内存空间的不断增加,加上64位机对大内存的支持,以及高速固态硬盘的出现,这种方法的使用仍然较普遍,也使得人们对海量遥感图像处理算法的磁盘、内存缓冲设计并不太在意。
另一种方法是将遥感图像按固定模式分块后分别读入内存中处理,然后再分块输出,俗称瓦片计算这种方法在逻辑上比较简单,而且解决了内存限制和算法二次开发支持的问题,使软件可以处理超大遥感影像,并且支持众多遥感算法处理执行一 般商用遥感图像处理软件如ENV1、PCI和ERDAS均采用这种方法,但通过实验表明,这些软件并没有充分利用普通PC机的磁盘IO和CPU计算资源计算机硬件发展至今,特别是云计算、多核计算技术的发展,对于普通台式机而言,为了高效的利用计算资源,仍然需要突破磁盘、内存和CPU的IO性能不一致的障碍而大多数工程化的遥感图像处理算法的运算速度的瓶颈仍然在磁盘数据的IO过低和内存大小受限上面,而并不仅仅在经过多核计算优化的CPU上如何针对各种海量遥感图像处理算法对磁盘IO快速访问特点进行分类,并尽量减少CPU计算和IO访问的等待时间,实现各种遥感算法的多核快速计算处理,并且保证数据驱动算法底层封装后进行遥感算法二次开发时依然具有优良的可读性和便捷性,正是本发明重点解决的问题发明内容本发明解决的技术问题是:克服现有技术的不足,提供一种用于遥感图像的IO双缓存交互多核处理方法,本发明提高了多核CPU的资源利用率,和磁盘IO访问的效率,解决了内存空间有限和海量遥感数据处理的矛盾,保证了图像处理算法二次开发后的代码的可读性,且满足底层多种处理模式下IO设计的封装性。
本发明的技术解决方案是:一种用于遥感图像的IO双缓存交互多核处理方法,其特征在于包含以下步骤:(I)针对不同的遥感图像处理算法确定不同的数据分块策略,包括满行分块、满列分块、满波段分块和固定列宽分块策略;(2)根据CPU数量确定遥感图像像素计算线程数量;(3)程序控制启动所有遥感图像像素计算线程,各个遥感图像像素计算线程在读写首个遥感图像像素时发出读、写遥感图像请求,其中一个CPU根据读、写遥感图像请求程序控制开启读磁盘线程和写磁盘线程分别向读缓存区和写缓存器发出数据读取和数据写入请求;(4)读缓存区根据接收到的数据读取请求,按照步骤(I)确定的数据分块策略将硬盘空间存储的遥感图像数据依次存入读缓存块Rl、R2中;各个遥感图像像素计算线程首先读取读缓存块Rl中的遥感图像数据,当所有遥感图像像素计算线程读取的遥感图像数据不在读缓存块Rl中时,转入读取读缓存块R2中的遥感图像数据,读缓存块Rl执行读磁盘空间遥感图像数据操作,当所有遥感图像像素计算线程读取的遥感图像数据不在读缓存块R2中时,转入读取读缓存块Rl中的遥感图像数据,读缓存块R2执行读磁盘空间遥感图像数据操作;(5)各个遥感图像像素计算线程按照交错计算算法顺序处理从读缓存区中读取的遥感图像数据;(6)写缓存区根据接收到的数据写入请求,将所有遥感图像像素计算线程的处理结果首先写入写缓存块W2中,当写缓存块W2中写满处理后的遥感图像数据时,所有遥感图像像素计算线程的处理结果写入写缓存块Wl中,同时将写缓存块W2中写满的遥感图像数据写入磁盘空间,当写缓存块Wl中写满处理后的遥感图像数据时,所有遥感图像像素计算线程的处理结果写入写缓存块W2中,同时将写缓存块Wl中写满的遥感图像数据写入磁盘空间;(7)当所有遥感图像像素计算线程处理完所有遥感图像数据,停止读磁盘线程和写磁盘线程,结束所有遥感图像像素计算线程,完成遥感图像的IO双缓存交互多核处理。
所述步骤(5)交错计算算法的实现方法为:(a)各遥感图像像素计算线程依据自己的线程编号从图像首行或首列数据开始处理,每个遥感图像像素计算线程处理的数据按行或列交错分布,依据行或列的编号顺序处理; (b)当某个遥感图像像素计算线程处理遥感图像数据时发现所要读取的遥感图像数据不在读缓存块Rl时,向读磁盘线程发出更换读缓存块数据的请求,并等待,当所有遥感图像像素计算线程均发出更换读缓存块请求时,遥感图像像素计算线程开始读取读缓存块R2中的遥感图像数据;读磁盘线程响应遥感图像像素计算线程的更换读缓存块请求,力口载新遥感图像数据至读缓存块R1,然后交换读缓存块Rl、R2的指针位置;(c)重复步骤(b)的操作直到从读缓存区中读取出所有的遥感图像数据本发明与现有技术相比的有益效果在于:(I)本发明将底层IO读写从运算线程中剥离,用独立线程实现快速读、写遥感图像数据,并与各个计算线程协调配合,底层IO独立线程与运算主线程同步运行,保证了主计算线程中算法的执行效率,提高了多核CPU的资源利用率2)依据各种遥感算法处理图像数据的顺序,用不同数据分块的方式执行不同的图像处理算法,包括满行、满列、满波段和固定列宽分块等。
3)读数据和写数据缓冲区采用双缓存独立线程执行,与计算线程同步,一方面节省磁盘数据加载至内存所耗费的时间,另一方面可以保证读写缓存可以在用户限定的大小内开辟,提高了磁盘IO访问的效率4)数据多核计算处理过程采用数据行交叉寻址处理方法实现,既保证了各个计算线程数据读取、写入时IO同步操作,又保证了上层算法二次开发用户代码编写的便捷性,同时实现多核计算,保证了图像处理算法二次开发后的代码的可读性,且满足底层多种处理模式下IO设计的封装性图1为本发明的实现原理图;图2为本发明基于满行的图像分块设计图;图3为本发明基于满列的图像分块设计图;图4为本发明基于固定列宽的图像分块设计图;图5为本发明基于满波段的图像分块设计图;图6为本发明中磁盘IO读线程执行流程图;图7为本发明像素计算线程执行图像数据读入流程逻辑图;图8为本发明中磁盘IO写线程执行流程图;图9为本发明像素计算线程执行图像数据写出流程逻辑图;图10为本发明多像素计算线程分行交错多核计算原理图具体实施例方式下面结合附图对本发明的具体实施方式进行进一步的详细描述:如图1所示,本发明的实现原理是:(I)PC机内存临时存放遥感数据的缓存块空间,首先依据处理系统CPU核心数量确定多核计算线程数量,针对不同的遥感图像处理算法确定不同的数据分块策略,包括满行分块、满列分块、满波段分块和固定列宽分块策略;(2)程序控制启动所有遥感图像像素计算线程,各个遥感图像像素计算线程在读写首个遥感图像像素时发出读、写遥感图像请求,其中一个CPU根据读、写遥感图像请求程序控制开启读磁盘线程和写磁盘线程分别向读缓存区和写缓存器发出数据读取和数据写入请求;(3)读缓存区根据接收到的数据读取请求,按照步骤(I)确定的数据分块策略将硬盘空间存储的遥感图像数据依次存入读缓存块Rl、R2中;各个遥感图像像素计算线程首先读取读缓存块Rl中的遥感图像数据,当所有遥感图像像素计算线程读取的遥感图像数据不在读缓存块Rl中时,转入读取读缓存块R2中的遥感图像数据,读缓存块Rl执行读磁盘空间遥感图像数据操作,当所有遥感图像像素计算线程读取的遥感图像数据不在读缓存块R2中时,转入读取读缓存块Rl中的 遥感图像数据,读缓存块R2执行读磁盘空间遥感图像数据操作;(4)各个遥感图像像素计算线程按照交错计算算法顺序处理从读缓存区中读取的遥感图像数据;(5)写缓存区根据接收到的数据写入请求,将所有遥感图像像素计算线程的处理结果首先写入写缓存块W2中,当写缓存块W2中写满处理后的遥感图像数据时,所有遥感图像像素计算线程的处理结果写入写缓存块Wl中,同时将写缓存块W2中写满的遥感图像数据写入磁盘空间,当写缓存块Wl中写满处理后的遥感图像数据时,所有遥感图像像素计算线程的处理结果写入写缓存块W2中,同时将写缓存块Wl中写满的遥感图像数据写入磁盘空间;(6)当所有遥感图像像素计算线程处理完所有遥感图像数据,停止读磁盘线程和写磁盘线程,结束所有遥感图像像素计算线程。
由于计算机内存大小的限制,必须先对遥感数据实施分块读取针对待处理遥感图像的存储方式和处理方法类型,确定遥感数据读取和写出的分块策略,包括满行分块、满列分块、固定列宽分块和多波段分块策略其中这里采用图像存储方式均为BSQ (BandSequential Format)方式,即先按行序号存储每波段每行的数据,再按波段顺序存储现分述如下:1、遥感图像满行分块读写设计:本分块策略主要适用于需要按图像行顺序读取数据进行处理的遥感算法,例如:图像线性拉伸,图像增强,图像卷积滤波,图像镶嵌等由于每次下一块预读和预写出数据可以预知,满行分块模式可采用读写双缓存交互的多线程方式实现本发明采用的分块数据大小计算方法如下:假设用户设定固定缓冲内存总字节数为BufferSize,为设置读写双缓存,则每个缓存 块在内存中最多可分配字节数为BufferSize/4,设待处理遥感图像大小为B波段,H行,W列,每个像素字节数为T依设计要求,每次读入、写入缓存块的数据在原图像上宽度固定(满行),高度可变,如图2所示每一个数据块宽度BlockWidth为原始图像的宽度W,数据块高度为=BlockHeight = LBufferSize/4T7W」,图像每个波段被分的块数为:Λ =「// / BlockHeight],其中「表示上取整,」表示下取整。
每个波段第i个数据块在 (((X 厂 BlockHei^ht),( O ff%c,该线程处理对应行号Kj分别为:Kj=(j-l)-n + i, (Ow」,[Si/),其中以上变量均为正整数交错分配每个像素计算线程处理的数据,达到计算量的平均分配,并实现各个计算线程提出读写磁盘数据块请求时间的同步,保证IO双缓存在功能交换的时候不会过多影响每个计算线程的执行效率相较于将缓存块中的数据直接切块分给各计算线程处理的方法,这样设计的好处是各像素计算线程再不用得知每个缓存块中自己需要处理多少行因此,用户对缓存块大小的调整不会影响像素计算线程执行方式每个线程只需要在缺少数据时发出请求,并等待读写线程响应即可大大提高了二次开发的遥感算法代码编写的可读性当所有计算线程请求读取的数据不在当前读缓存块Rl中时,将预读的读缓存数据R2供计算线程访问,将置换的缓存Rl执行预读磁盘数据操作,同时交换读双缓存R1、R2功能指针位置;当所有计算线程请求写出的数据不在当前写缓存块W2中时,将预先完成写出磁盘操作的缓存块Wl供计算线程写出,将置换的缓存W2执行写出磁盘数据操作,同时交换写双缓存Wl、W2功能指针位置;整个处理算法完成时,停止数据读、写访问,析构读写双缓存,结束读、写和各个计算线程。
本发明通过底层动态库封装实现相应功能,已经用C++代码完成实现封装类名称为HAPBEGThread具体做遥感算法二次开发时,流程如下:(I)首先创建111_111^10对象,负责图像IO的访问;然后设置图像IO输入图像指针和选取区域,用对象DIM。
