美章网 资料文库 图像压缩感知的重构算法研究范文

图像压缩感知的重构算法研究范文

本站小编为你精心准备了图像压缩感知的重构算法研究参考范文,愿这些范文能点燃您思维的火花,激发您的写作灵感。欢迎深入阅读并收藏。

图像压缩感知的重构算法研究

《电视技术杂志》2014年第十一期

1GPU并行计算模型

NVIDIA公司在2007年6月提出了CUDA(ComputeUnifiedDeviceArchitecture)统一处理架构,CUDA拥有两个层次的并行,线程级并行实现的细粒度数据并行,和任务级并行实现的粗粒度并行。CUDA是一种不需要借助图形学API就可以使用类C语言进行通用计算的开发环境和软件体系[4],能够利用NVIDIAGPU的并行计算引擎比CPU更加高效地解决许多复杂计算任务。JacketEn-gine是由AcclerEyes公司开发的一个以MATLAB为基础的基于GPU的计算引擎,它屏蔽了底层硬件的复杂度,能够使标准的MATLAB代码在GPU上运行,利用GPU强大的计算能力,提高代码的执行效率。

1.1CUDA线程层次CUDA支持大量的线程(Thread)并行,若干线程组成线程块(Block),线程块被组织成一维、二维或三维的线程网格(Grid),如图1所示,1个Grid中含有M×N个Block,每个Block含有M×N个Thread。线程块内的线程数以及网格内的线程块数都是由<<<…>>>(执行配置运算符)确定,参数可以是整形或dim3类型(基于uint3定义的矢量类型,相当于由3个unsignedint型组成的结构体),当线程数以及线程块数配置完毕后,就可以通过内置变量threadIdx和blockIdx来唯一地表示每个线程。

1.2CUDA存储器层次GPU包含多种类型的存储器:寄存器(Register)、共享存储器(SharedMemory)、本地存储器(LocalMemory)、全局存储器(GlobalMemory)、常量存储器(ConstantMem-ory)、纹理存储器(TextureMemory)[6]。其中寄存器最靠近流处理器,其存取速度最快。当寄存器的空间不足时,数据就会被存储在本地存储器中,但是其存取速度极慢,这两种存储器都是线程私有的。共享存储器可以被一个块内所有的线程共有,拥有着与寄存器相同的访问速度,是实现同一线程块内所有线程间通信的最好途径。全局存储器位于显存中,整个网格内的所有线程均可以对其访问,全局存储器的空间虽然很大,但是具有较高的访问延迟。常数存储器是一种位于显存的只读的地址空间,拥有缓存机制,可以加快访问速度。其空间相对比较小,多用来存储频繁使用的只读类型参数。纹理存储器作为只存储器,常用来对大量数据随机访问以及非对齐访问。具体存储层次如图2所示。

1.3CUDA执行模式一个完整的程序是由工作在GPU上的多个内核函数(kernel)以及CPU上的串行代码共同组成的,一个内核函数并不是一个完整的程序,它只是一个CUDA程序(见图3)中可以被并行执行的步骤。CPU作为主机(Host)来控制程序整体的逻辑和任务调度,包括设备初始化、准备数据、分配空间等工作。GPU作为协处理器(设备端De-vice),运行一些高度并行化的部分。理想状态下,CPU主要是完成清理上一个内核函数和启动下一个内核函数,数据部分全部由GPU来完成[7]。一般而言,CUDA程序的基本模式为:1)CPU端分配内存空间和显存空间;2)CPU端初始化内存空间;3)CPU端将所需的数据从CPU的内存中复制到GPU的显存;4)GPU端执行内核函数;5)CPU端将内核函数的执行结果从GPU的显存中复制到CPU的内存;6)CPU端处理数据并释放空间。

1.4JacketJacket是由AccelerEyes公司开发的,以MATLAB为基础的基于GPU的计算引擎,针对的是NVIDIA公司的CUDA架构的GPU平台。Jacket集成了特殊的数据类型和专门函数,可以将现有的MATLAB程序实现在GPU上的加速。与此同时,Jacket提供了透明的数据传递,避免了CUDA或OpenCL等底层库的编程复杂性,在Jacket中可以自动完成MEX文件的编译和调用。此外,Jacket利用GPU强大的计算能力,优化了GPU函数,对大数据量的操作尤其是矩阵运算,加速效果十分理想。

2基于GPU的并行重构

通过实验统计得到,OMP重构算法的主要耗时模块产生在上述三项操作中,它们分别占总时间的20%~40%,50%~70%,2%~3%。因此在设计并行优化算法时,主要考虑的是将这三项操作放到GPU上实现,其他操作依旧在CPU上完成,避免因数据在CPU与GPU之间的频繁传递而造成时间的过度浪费。

2.1利用CUDA优化加速本文在MicrosoftVisualStudio2010环境下,在.cu文件中编写CUDA内核函数,通过主机端调用。首先创建并初始化CPU上的变量,为GPU上的变量申请空间用来存放y(测量值,长度为m的采样信号)、Zr(重构向量,长度为n,初始化为0)、idx(用来存放每次迭代找到的最匹配列的索引)以及迭代过程中用到的一些中间变量。然后,进行数据传递,将CPU上的y复制到GPU的全局存储器中。接下来就是GPU端的操作,首先,在GPU端对(矩阵A的2范数)进行初始化,初始化的过程中,每个线程计算一列的2范数,与文献[5]相比,不仅计算过程有了速度上的提升,而且还省略了一次数据传递。然后,用两个内核函数分别计算上面所列的第一个主要步骤并找出最大值的位置。接下来进入循环迭代,由于第一次迭代较为简单,仅用一个内核函数即完成了第二个主要步骤,在剩下的迭代中,增加两个内核函数来实现矩阵求逆的过程。最后,用一个内核函数更新残差。至此GPU上的优化操作已全部完成。将得到的结果从GPU中传回CPU,CPU端做数据的整理以及空间释放工作。具体算法流程如图4所示。

2.2利用JACKET进行优化加速选择利用JACKET进行并行程序的设计,应该充分考虑到GPU的工作效率,将更多的时间用在GPU执行计算上,而不是数据传递上。在做并行化重构时,需要将数据做一些改变,使用JACKET时,数据在CPU和GPU之间的传递是通过简单的数据类型的封装来完成的。JACKET给出的类型有:gs-ingle、gdouble、glogical、gint8、guint8、gint32、guint32。数据从CPU到GPU可以由语句:A=gsingle(B)完成,数据从GPU到CPU可以由语句:B=double(A)完成。一旦GPU的数据结构已经建立,该GPU矩阵的任何操作都只能在GPU上进行,而不能在CPU上,要返回CPU计算,必须转换为CPU类型。首先,在OMP进入迭代之前,将测量值以及测量矩阵复制到GPU上得到gs和gT。另外,为了避免迭代过程中,反复在GPU上创建增量矩阵,在进入迭代之前定义好一个GPU变量gAugT用来存放增量矩阵。在迭代过程中,将残差值复制到GPU上,得到grn,在GPU完成gT×grn操作,并将结果传回CPU端。然后将矩阵扩充操作在GPU上完成,这样一来,最小二乘以及更新残差操作用到的所有变量就都已存在GPU中,在GPU上完成后将结果传回。算法流程图如图5所示。

3测试结果

为了验证并行算法的速度优势,本文给出了在不同环境下得到的对照结果。硬件环境:CPU-Intel(R)Core(TM)2DuoCPU3.00GHz,GPU-NvidiaGeForceGT630。软件环境1:MicrosoftVisualStudio2010,CUDA5.0。软件环境2:MATLAB2012b,Jacket2.3。通过选用不用长度的原始信号以及不同的测量率,记录两种不同方法的执行效率。表1是在并行环境1下利用CUDA进行优化加速的结果。表2是在并行环境2下利用JACKET进行优化加速的结果。由结果对比可以看出,不论是在何种环境下,利用GPU进行重构都要比传统串行重构快速得多。从表1来看,利用CUDA进行优化加速时,随着原始信号的长度以及稀疏度的增加(表现在n,k的增加),测量矩阵也相应增加,CPU和GPU上的耗时都会越长,但是加速比也会随之增加。从表2来看,利用JACKET进行优化加速时,随着原始信号的长度以及测量率的增加(表现在X和M×N的增加),CPU和GPU上的耗时会随之增加,但是加速效果也会随之增加。这也说明了,GPU特别适合处理那些算术计算密度高的问题,这样一来,数据访存延迟就会被复杂的计算隐藏。

4总结

本文不仅对现有的算法进行了优化,同时在不同的并行环境下进行了实验对比,结果验证了基于GPU的并行图像压缩感知的可行性。同时也说明了,GPU对那些计算密集度高的问题会有很好的加速效果。本文针对迭代中最耗时的几个操作进行了优化,如果能达到理想的状态,进一步优化,使得GPU将可利用资源达到最高,每个线程都可以发挥最大效益,减少显存的消耗,这些都是下一步的工作方向。

作者:郭睿冉宋建新单位:南京邮电大学图像处理与图像通信实验室