一种用于分层搜索运动估计的gpu加速方法

文档序号:7586953阅读:111来源:国知局
专利名称:一种用于分层搜索运动估计的gpu加速方法
技术领域
本发明涉及视频处理领域的运动估计方法,具体是ー种使用GPU辅助CPU进行的分层搜索运动估计加速方法。
背景技术
运动估计是视频处理领域的重要技术,在基于块匹配的混合视频编码、运动检测,对象跟踪等应用上有着重要的作用。运动估计算法是对每ー个块,在捜索范围内计算全部 或部分可能的捜索点上的SAD值,通过寻找最小的SAD值得到最佳或接近最佳的运动向量。全搜索运动估计算法是对搜索范围内每ー个可能的点,计算该位置的SAD,最后得到最佳的运动向量。全搜索运动估计算法具有很高在运算最。因此出现了很多快速捜索算法,如三步搜索、分层搜索、六边形搜索等。其中,分层搜索运动估计算法具有较高的规则性,易于通过硬件加速的方法来实现。基本的分层搜索运动估计算法是将当前帧和參考帧划分为多个图像层。原始图像为最低ー层,向上每ー个图像层由下方相邻的ー个图像层下采样得到。进行分层搜索运动估计时,先在顶层图像层上以O为搜索中心的指定捜索区域内进行基于全搜索的运动估计,根据指定捜索区域内所有捜索点的SAD值,得到一个该图像层上最佳匹配点a。然后再在下ー层图像层以a为搜索中心的指定捜索区域内捜索得到一个新的最佳匹配点b。该过程对每ー个图像层逐层进行,最后得到最低ー层,即原始图像层上的最佳匹配点c (见图
I)即为分层搜索运动估计算法得到的运动向量。当只有一个图像层的时候,即全搜索运动估计算法。因此全搜索运动估计算法可以看作是分层捜索的ー个特例。分层搜索运动估计的质量同划分的图像层数目及每个图像层下采样率有夫。通常将原图像分为2 3个图像层,每个图像层由低一层的图像层进行1/2下采样得到。由于GPU相对于CPU,具有计算单元多、内存读写带宽大等特点,很适合用作分层搜索运动估计的加速。尤其是通用目的的GPU(GPGPU)的出现,使得在GPU上进行高性能算法的开发变得较为容易。基于通用目的的GPU由多个多处理器组成,每个多处理器具有多个运算単元,每个运算单元具有自己的寄存器。一个多处理器中所有的运算单元在每个时钟周期,都执行相同的指令,因此能够进行大批量的并行数据处理。通用目的的GPU上将所有并发的线程组织成多个线程块,一个线程块只在ー个多处理器上运行,多个线程块可以共享ー个多处理器。线程块内的线程可以通过多处理器上的共享存储器进行数据交換。而并发执行的不同线程块中的线程不能通信,也不能进行同步。此外,一个线程块中的线程又分为若干Warp,ー个Warp中的线程总是执行同样的指令(见图2)。由于GPU上每个多处理器上寄存器、运算单元等资源有限,一个线程块能容纳的线程数是有限的。并且线程块内Warp的大小是ー个多处理器中处理单元数量的整数倍。当ー个Warp中仅有部分线程需要执行某条指令时,所有的线程均会执行这条指令,那些不需要执行这条指令的线程会将运算结果丢弃。因此,应尽量避免分支操作造成的部分线程空转。经对现有技术文献的检索发现,已有的使用GPU对运动估计算法加速的方法中,只有针对全捜索或全域消除搜索运动估计算法进行加速的方法。并且由于受到线程块能容纳的线程数限制,这些加速方法在搜索范围上受到较大限制,无法满足实际需要。

发明内容
本发明的目的在于提供ー种针对分层搜索运动估计的基于GPU/CPU协作处理的加速方法,充分利用GPU的计算资源,分担CPU计算负担,并显著提高分层搜索运动估计的速度。为实现上述目的,本发明提出的基于GPU/CPU协作处理的分层搜索运动估计方法包括以下步骤第一歩将当前帧和參考帧传输致GPU显存,并将所述当前帧和參考帧分为L层, 第I层为当前帧和參考帧原始图像。利用GPU生成其余L-I层高层图像且存放在显存中,每ー层图像为更低ー层图像在宽和高两个方向上的1/2下采样图像。使用GPU对第K层图像层进行下采样生成K+1层图像层吋,将第K层图像划分为大小为2D 2D的下采样图像块。给所述每ー个下采样图像块分配ー个线程块,所有线程块可以并行地乱序执行。所述每ー个线程块内申请ー个D D的ニ维线程组。所述每ー个线程组中坐标为U,y)的线程跟据所述下采样图像块中坐标为(2x,2y)、
(2x fll,2j) , (2jc,2タfll)、(2x011,2ァfll)的四个点生成ー个下采样点。最后,所述ー个线程
组中所有线程计算的下采样点得到K+1层图像层中对应位置的D D图像块从所述第L层图像层(顶层图像层)开始逐层执行第二步至第六步,直到执行完第I层图像层(原始图像层)。第二歩对第K层图像层进行块划分及线程分配。所述第K层图像层尺寸记为M*N,按指定的块大小(n*n)将第K层图像划分为!个搜索图像块,对所述每ー个搜
索图像块分配ー个线程块用于运动向量的捜索。所述所有线程块可以并行地乱序执行。跟据所述第K层图像层上设定的搜索范围及GPU计算能力设定对捜索区域每个搜索点的线程分配方法。搜索区域宽度记为H,高度记为V,GPU上每个线程块能够创建的线程数记为T。若V *HOT,则在所述线程块内创建H *V的ニ维线程组。所述线程组中坐标为(x,y)的线程计算所述捜索区域内坐标为(x,y)的捜索点处的SAD值,该方案记为线程分配方案A。若卜H <,则在所述线程块内创建ー个大小为H的ー维线程组。所述线程组中序号为X的线程,计算所述搜索区域内坐标(x,k)的点,其中,0 □た6J/,该方案记为线程分配方案B。第三步第二步中所述线程块从GPU显存中获取所述搜索图像块在第K+1层图像层上的捜索结果,计算所述搜索图像块在第K层图像层上的捜索中心。若K = L,即当前图像层为顶层图像层,则将所述搜索图像块的捜索中心记为所述搜索图像块左上角第一个像素的位置。若K < L,所述搜索图像块中心像素点在所述第K层图像层上的坐标记为(x,y),
所述像素点在所述第K+1层图像层上对应坐标为(可,I)。所述第K+1层图像层中搜索图像块尺寸记为m m,则所述像素落在第K+1层图像层中坐标为(&,み)的捜索图像块内部。将所述第K+1层图像层中坐标为($,$)的捜索图像块的运动向量(在第K+1层的第六步得出)乘2作为所述第K层图像层上所述搜索图像块的捜索中心。第四步第二步中所述各个线程对所分配的捜索像素点计算SAD,并将结果存储于共享内存的线性数组中。对于第二步中所述线程分配方案A,每个线程将其计算的SAD值及线程坐标直接存储至共享内存。对于第二步中所述线程分配方案B,所述每个线程使用
两段搜索的方案第一段,所述序号为X的线程从所述搜索范围内坐标为(X,I)的点开始向
上搜索,直到搜索完坐标为(x,0)的点。其中,V为搜索区域高度。搜索过程中,记录最小SAD值及对应搜索点纵坐标。将第一段搜索记录的最小SAD值和纵坐标记为SAD1, y10第
ニ段,同第一段捜索对应,所述序号为X的线程从所述搜索范围内坐标为的点开始
向下捜索,直到搜索完坐标为(X,F Hi)的点。将第二段捜索记录的最小SAD值和纵坐标记为SAD2, y2。最后比较SADl和SAD2,将最小的SAD值及对应坐标写入共享内存。若两个SAD
值相同,则将靠近O,$)的搜索点的坐标写入共享内存。第五步查找所述搜索图像块在所述搜索区域内所有捜索点上的最小SAD及对应的坐标。第二步中所述每ー个线程块在第四步完成吋,已经得到线性排放的TN个SAD值及对应坐标(TN为所述线程块中的线程数目)。此时通过归并操作查找到最小SAD值及对应
坐标。首先用第I个到第3个线程比较TN个SAD值。即第X个线程比较第X和第$か
个SAD值,并将更小的SAD值及对应坐标写入X位置。若SAD值相同,则将离搜索中心更近
的捜索点坐标写入X位置。此时得到$个SAD值及对应坐标。然后继续用第一个到第f
个线程比较g个SAD值。该过程反复进行,直到剰余SAD个数小于GPU上ー个Warp中的线程数。由于线程块的ー个Warp中所有线程总是执行相同的指令,当剰余SAD数目小于Warp中线程数目(记为WN)的两倍时,将有线程空转。当剩余SAD数目小于WN时,GPU上作结束,将所述剩余SAD传回CPU,由CPU执行遍历,找出最小的SAD及坐标。该坐标即当前捜索图像块的运动向量。第六步若所述第K层图像层不是原始图像层,即A <H,则CPU将遍历得到的所述第K层图像层中每一个搜索图像块的运动向量传回GPU显存,供第K-I层搜索使用。若K=I,则该分层搜索运动估计算法结束。本发明具有以下优点I.本发明通过合理的进行数据划分和线程分配,有效地利用了 GPU上成百上千的运算器単元,最大限度提高了并行度,并极大提升了分层搜索运动估计算法的速度。2.本发明使用GPU并行进行下采样得到分层搜索算法中各图像层,并存放在GPU显存中,减小CPU和GPU间的通讯,提高了加速效率;3.本发明可以跟据分层搜索算法中各图像层上指定的捜索区域大小、块大小和GPU处理能力,自适应地进行合理的数据划分和线程分配;、
4.本发明提出的采用按像素列划分的数据划分和线程分配方案能满足搜索区域较大,捜索点大于GPU单个线程块能容纳的线程数目的情況。扩大了该算法的应用范围;5.对于两个搜索点SAD值相同的情况下,需要比较两个捜索点运动向量的大小并确定最佳的运动向量。本发明中,在按像素列划分的方案中采用两段捜索,能有效利用捜索点的位置信息,避免了在SAD值相同的情况下比较运动向量大小这种GPU不擅长的运算,提高了处理速度;6.本发明在查找最小SAD及最佳运动向量的规约过程中,由CPU分担最后小于Warp数量的SAD比较,避免了 GPU的线程空转,也利用了 CPU的计算能力,提高了搜索速度。



图I是分层搜索运动估计算法示意图;图2是通用目的GPU硬件结构和线程组织及映射关系示意图;图3是本发明实施例的流程图;图4是本发明实施例中GPU对第I层图像层下采样生成第2层图像层的示意图;图5是本发明实施例中GPU在第3层图像层上进行并行搜索的线程分配示意图;图6是本发明实施例中GPU在第3层图像层上进行并行搜索的两段搜索算法的示意图;图7是本发明实施例中ー个线程块内所有线程对捜索所得的所有SAD使用归并算法寻 找最小SAD的不意图;图8是本发明实施例中GPU在第2层和第I层图像层上进行并行搜索的线程分配示意图;图9是本发明实施例中GPU在第2层图像层上进行并行搜索之前计算搜索中心的示意图。
具体实施例方式下面结合附图和实施例,对本发明进行详细的描述。本实施例仅为本发明的ー个实施例而不是全部实施例。对1920 1080分辨率的视频序列进行分层搜索运动估计,原始图像层上搜索图像块大小为8 8,捜索范围要覆盖以当前块为中心,宽和高均为256个像素的区域。使用的GPU ー个线程块可以拥有512个线程,线程块中Warp大小为16个线程。该应用场景下可采用如下实施例,划分三个图像层第I层图像层为原始图像层,捜索图像块大小为8 8,捜索区域是以当前块为中心的8 8区域;第2层图像层为原始图像下采样的960 540分辨率图像,捜索图像块大小为8 8,捜索区域是以当前块为中心的16 16区域;第3层图像层为第图2层图像层下采样的480 270分辨率图像,捜索图像块大小为4 *4,捜索区域为是当前块为中心的64 *64区域。除第一层图像层上的捜索图像块大小需要和应用要求相一致之外,各层的搜索区域大小以及其他各层搜索图像块大小均可根据需要自行指定。该实施例中指定的各捜索区域及搜索块大小,只是ー组可选取的值,而不全部。该实施例中,本发明实现的步骤如图3所示
第一歩,CPU现将參考帧和当前帧传输到GPU显存上。将原1920 1080分辨率的图像按照32 32大小的图像块划分为60 34个下采样图像块。GPU上创建60 34个线程块,每个线程块内创建16 16的ニ维线程组。所述ー个线程组处理ー个32 32的下采样图像块,生成第2层图像层上对应位置的16 *16的图像块。所述所有线程并行进行下采样运算。例如,线程组中坐标为(5,5)的线程计算32 *32下采样图像块中坐标为(10,10)、(10,11)、(11,10)、(11,11)四个点的均值,生成第2层图像层上对应位置16 16图像块中坐标为(5,5)的点,如图4所示。其余线程同理。该实施例中使用的下采样公式或滤波器只是所有实施例中的一个可选择的方案,而不是唯一方案。
使用同样的方法将分辨率为960 540的第2层图像层划分为30 17个32 32的下采样图像块,并分配30 17个线程块进行并行下采样得到480 270分辨率的第3层
图像层。第二步,确定第3层图像层上的线程分配方案。由于第3层图像层上搜索区域大小为64 64,共4096个搜索点,超过了 GPU上一个线程块容纳最多线程数量512个。因此该层上,为每ー个搜索块分配ー个大小为64的线程组,所述线程组中ー个线程计算64 64捜索区域中一列捜索点的所有SAD值,如图5所示。由于第三层图像层为顶层图像层,因此捜索中心为当前块左上角第一个像素对应的坐标。第三歩,每个线程按照两段捜索的方法,寻找搜索区域一列捜索点中SAD最小的点。如图6所示,线程组中序号为X的线程,计算搜索区域内坐标为(x,0)至(x,63)的点。所述线程首先从坐标为(x,32)的点开始向上捜索到坐标为(x,0)的点,然后再从坐标为(x,33)的点开始向下捜索到坐标为(x,63)的点。并记录两段中备自最小的SAD值及坐标。最后比较所述两段中最小的SAD值,将最小的SAD值及坐标写入共享内存。第四步,如图7所示,通过归并算法,比较共享内存中存放的64个SAD值。该算法迭代两次,最后得到16个较小的SAD值。第五步,由于该GPU的Warp大小为16,因此剩余16个线程的时候,GPU将剩余的16个SAD值及坐标回传CPU,由CPU进行遍历得到最小的SAD值及坐标,从而得到运动向量。第六歩,CPU将所有捜索图像块的运动向量回传到GPU的显存,为在第2层图像层上的捜索做准备。第七步,确定第2层图像层上的线程分配方案。由于第2层图像层上搜索区域大小为16 16,共256个搜索点,没有超过GPU上一个线程块能容纳的线程数512。因此,对每ー个捜索图像块分配ー个16 *16的ニ维线程组,线程组中ー个线程计算相同坐标上的一个搜索点的SAD值,如图8所示。第八步,计算第2层图像层上每个搜索图像块的搜索中心。例如,以坐标为(64,64)的点为左上角第一个像素点的搜索图像块A,其中心是坐标¢8,68)的像素点,所述像素点在第3层图像上对应坐标为(34,34),所述像素点在第3层图像层中以(32,32)为左上角第一个像素点的4 4捜索图像块B的内部。假设搜索图像块B在第3层图像层上搜索得到的运动向量是(-5,14),则将第2层图像层上搜索图像块A的捜索中心设为(HlO,-8),如图9所示。第九步,在第2层图像层上进行捜索的其余步骤同第3层图像层上一致。最后得到第2层图像层上所有捜索图像块的运动向量,并存放在显存中。
第十步,在第I层图 像层上进行捜索,第I层图像层上线程分配及捜索方案同第2层图像层一致。第I层图像层上搜索完成并得到每个搜索图像块的运动向量之后,不再传回GPU,而是作为计算结果直接输出。至此,该实施例的所有步骤完成,并得到最終计算結果。该发明通过以上步骤,充分利用GPU的并行计算能力,快速完成分层搜索运动估计。通过自适应的线程分配方案,使得不同计算能力的GPU对不同分辨率的图像、不同捜索范围及搜索块大小的应用要求,均能提供高性能的加速。
权利要求
1.一种基于GPU加速的分层搜索运动估计算法,其特征在于包括以下步骤 第一歩CPU将參考帧和当前帧传输到显存,由GPU并行进行各图像层的下采样操作,生成用于分层捜索的各个图像层,并将最顶层图像层设为当前图像层; 第二歩为当前图像层的每ー个捜索图像块分配一个线程块用于捜索,线程块根据GPU处理能力及当前图像层上指定的捜索区域大小选择线程分配方案,井分配所需线程;第三歩各个线程使用上一层图像层的搜索结果,初始化当前图像层上各个搜索图像块的搜索中心; 第四步各个线程按所分配的捜索点计算在各个搜索点的SAD,并将结果存储在共享内存中; 第五步各个线程块使用并行归约查找共享内存中记录的最小SAD,当剰余SAD数目小于等于线程块Warp大小的时候,停止归约; 第六步各个线程块将第五步中剩余的SAD及对应搜索点坐标传回CPU,由CPU进行遍历查找,找出最小SAD并得到运动向量; 第七步如果当前图像层是第I层图像层,则输出各个搜索图像块的运动向量;否则,将运动向量传回显存,并将当前图像层设为更低ー层图像层,并跳回第二歩。
2.如权利要求I所述的第一歩中,GPU并行进行各图像层的下采样操作,其特征在于将待下采样图像划分为大小为2D 2D的下采样图像块。给所述每ー个下采样图像块分配ー个线程块,所有线程块可以并行地乱序执行。所述每ー个线程块内申请ー个D -D的ニ维线程组。所述每ー个线程组中坐标为U,y)的线程跟据所述下采样图像块中坐标为(2x,2y)、(2x fll,2ァ)、(2x,2y fll)、(2x 01,2^ fll)的四个点生成ー个下采样点。
3.如权利要求I所述的第二步中,线程块根据GPU处理能力及当前图像层上指定的搜索区域大小选择线程分配方案,其特征在于当捜索区域宽为H,高为V,GPU的ー个线程块能分配最大线程数为T时,若V H ロ T,则在所述线程块内创建H V的ニ维线程组。所述线程组中坐标为(x,y)的线程计算所述捜索区域内坐标为(x,y)的捜索点处的SAD值,该方案记为线程分配方案A。若r. //Sr,则在所述线程块内创建ー个大小为H的一维线程组。所述线程组中序号为X的线程,计算所述搜索区域内坐标(x,k)的点,其中,OOl外,该方案记为线程分配方案B。
4.如权利要求I所述的第四步中,针对权利要求3所述的线程分配方案B,采用两段搜索方案,其特征在于如权利要求3所述的线程分配方案B中,线程组中序号为X的线程从所述搜索范围内坐标为(ろI)的点开始向上捜索,直到搜索完坐标为(x,0)的点,其中V为捜索区域高度;第二段,同所述第一段捜索对应,所述序号为X的线程从所述搜索范围内坐标为的点开始向下捜索,直到搜索完坐标为的点。
全文摘要
本发明公开了一种利用GPU并行计算能力加速的分层搜索运动估计方法,包括并行进行分层搜索算法中不同图像层图像的生成;自适应进行线程分配;并行对每个搜索图像块在每个搜索点进行SAD的计算;并行及利用CPU协同的查找最小SAD。该发明提出的自适应线程分配方案,能满足不同搜索图像分辨率及搜索区域大小的要求;图像下采样由GPU并行处理,能获得更好的加速效果及减少CPU和GPU间的数据通信;GPU/CPU协同进行的最小SAD值查找方法,能有效避免GPU空转。
文档编号H04N5/14GK102647588SQ20111004002
公开日2012年8月22日 申请日期2011年2月17日 优先权日2011年2月17日
发明者王振宇, 王荣刚, 董胜富, 高文 申请人:北京大学深圳研究生院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1