一种基于gpu的并行sao算法

文档序号:10580231阅读:273来源:国知局
一种基于gpu的并行sao算法
【专利摘要】本发明提出一种基于GPU的并行SAO算法,利用GPU的大量线程进行像素级并行统计、LCU块级并行相对失真计算和像素级并行修正,从而获得显著的时间减幅。标准的SAO算法非常不利于并行化。首先,参数融合机制使SAO块参数具有不确定的数据依赖性;其次,区域像素相关性导致统计时存在大量线程间的数据同步等待。针对上述两项阻碍SAO并行化的挑战,本发明结合GPU的硬件特性,设计了两种基于不同线程映射方法的像素级并行统计算法和一种块级并行相对失真计算算法。通过大量的实验分析,本发明设计并实现的并行SAO(简称cuSAO)相比AVS2标准参考软件的串行SAO(简称rdSAO)在耗时上获得显著的减幅,而且不失精确性,平均耗时减幅高达70%,最多可达90%以上。
【专利说明】
一种基于GPU的并行SAO算法
技术领域
[0001] 本发明涉视频编码技术领域,更具体地,涉及一种基于GPU的并行SA0算法。
【背景技术】
[0002] 如今,视频应用已经深入到各个领域,视频编码技术也面临着越来越多的挑战。 2010年4月VCEG和MPEG再次联手,组建JCT-VC工作组开始制定新一代视频编码标准H. 265/ HEVC,随后不久,我国的AVS工作组也开始筹备我国自主研制的新一代视频编码标准AVS2。
[0003] 无论是国际标准H.265/HEVC还是我国的AVS2标准,核心目标都是在上一代视频编 码标准的基础上,将压缩效率提高一倍,即在保证相同视频图像质量的前提下,视频流的码 率再减少50%。然而,更高的压缩比与重建视频图像的主客观质量是矛盾。为了缓和该矛 盾,SA0(Sample Adaptive Offset,像素自适应偏移)技术被H. 265/HEVC和AVS2两大标准不 约而同地加入到各自的编解码框架里,成为改善视频主客观质量的新型关键技术。
[0004] SA0技术,又称像素自适应偏移,能在仅提高少量码率的情况下大幅改善视频图像 的主客观质量。SA0技术的核心思想是:依据某种分类模式,对图像像素做有限的分类,在编 码时为有限个类别的像素寻找修正值并将其编入码流,而在解码时像素根据分类模式自适 应地使用相应的值进行修正。
[0005] 然而在决策最优的分类模式以及修正值时,标准的SA0技术依赖于对全图像素的 统计数据,这是一个非常繁琐的过程。国内外不少专家学者在对SA0技术做加速优化时,都 是通过回避使用基于像素统计的分类方法,使用新的决策方式获得速度上的提升。虽然避 开基于像素统计分类方法的SA0模块能获得很大程度的时间减幅,但这些方法都是对精确 性有所妥协的。

【发明内容】

[0006] 本发明为克服上述现有技术所述的至少一种缺陷,提供一种高效率、高精确度的 基于GHJ的并行SA0算法。
[0007] 为解决上述技术问题,本发明的技术方案如下:
[0008] 一种基于GPU的并行SA0算法,所述算法按照以下步骤依次处理视频序列的各帧:
[0009] S1:在GPU进行像素级并行统计,一个线程负责一个或多个像素在某种分类模式下 的统计;
[0010] S2:在GPU进行IXU(最大编码单兀)块级并行计算相对失真;
[0011] S3:在CPU进行IXU块级串行决策最终SA0 (像素自适应偏移)参数;
[0012] S4:在GPU进行像素级并行修正。
[0013] 在一种优选的方案中,步骤S1中,像素级并行统计的具体方法为:一个线程负责一 个或多个像素在某种分类模式下的统计,时间复杂度可达0(1),线程与像素的映射方法为 以下三种映射方法的任意一种,其中效果最好的为聚簇型线程映射方法:
[0014] (1)对齐型线程映射方法:每一个线程负责图像分量中一个像素的统计工作;
[0015] (2)跳跃型线程映射方法:1个线程块映射1个IXU块,1个LCU块包含64 X 64个像素, 1个线程块包含16 X 16个线程。
[0016] 跳跃型线程映射相比对齐型线程映射的一个改进点是:使用更少的线程,每个线 程负责更多的像素统计。使用这种线程布局的理由是:第一,线程块内256个(16X16)线程 可以充分利用硬件性能;第二,每个LCU块可以获得一块共享内存,仍然可以利用共享内存 作为高速缓存,对数据进行分层汇聚。
[0017] (3)聚簇型线程映射方法:每一个线程负责的像素区域是方形聚簇的,即每个线程 负责一块像素。
[0018] 所述聚簇型线程映射方法中,使用一个线程块映射一个编码单元块,每个线程块 的线程数量可以调整,但最佳数量为256,每个线程负责的像素区域是方形聚簇的,这样使 用的线程更少,可减少未调度线程的等待时间,也减少了线程间数据同步的等待时间,同 时,由于每个编码单元块获得一个线程块的映射,即分配到独立的共享内存,可将共享内存 充当数据同步时的高速缓存,从而再度加速。
[0019] 聚簇型线程映射的好处是:第一,只要将一个LCU块横竖方向各分裂16次,即分成 256个小块,每个小块的像素由1个线程负责,即可达到单线程块256线程,充分利用硬件资 源;第二,在区域像素雷同现象的前提下,每个小块内的像素是高度一致,由单个线程负责 可以避开竞争写同一变量的问题,从而减少因为数据同步而等待的时间;第三,线程数量相 比对齐型线程映射减少,可以缩短未被调度线程的等待时间;第四,依然是1个线程块映射1 个LCU块的线程布局,仍然可以使用共享内存充当高速缓存。
[0020] 在一种优选的方案中,步骤S2中,LCU块级并行计算相对失真的具体方法为:对于 边缘模式(E0,Edge Offset),无论沿哪个方向进行像素比较,像素都被归为5类,其中一类 无意义,对应的修正值为0;对于每个LCU块,可以使用4 X 5个线程分别计算4种边缘分类模 式下,每类像素的在各个候选修正值下的相对失真,并将最小相对失真以及对应的修正值 存放在线程块的共享内存中,再分配一线程从中选出相对失真最小的边缘模式。
[0021] 在一种优选的方案中,步骤S2中,LCU块级并行计算相对失真的具体方法为:对于 边带模式(BO,BAND Off set),像素被分为32类;因此,每个LCU块用1个线程块映射,每个线 程块包含32个线程,分别计算个边带各个候选修正值下的相对失真,并将最小相对失真和 取得该值下的修正值暂存于共享内存中;然后,分配29个线程分别计算29个连续四边带的 相对失真,再从中选出边带模式下最优的起始边带索引和4个最优偏移值。
[0022] 与现有技术相比,本发明技术方案的有益效果是:
[0023]本发明提出一种基于GPU的并行SA0算法,利用GPU的大量线程进行像素级并行统 计、块级并行相对失真计算和像素级并行修正,从而获得显著的时间减幅。标准的SA0算法 非常不利于并行化。首先,参数融合机制使SA0块参数具有不确定的数据依赖性;其次,区域 像素相关性导致统计时存在大量线程间的数据同步等待。针对上述两项阻碍SA0并行化的 挑战,本发明结合GHJ的硬件特性,设计了两种基于不同线程映射方法的像素级并行统计算 法和一种块级并行相对失真计算算法。通过大量的实验分析,本发明设计并实现的并行SA0 (简称cuSAO)相比AVS2标准参考软件的串行SA0(简称rdSAO)在耗时上获得显著的减幅,而 且不失精确性,平均耗时减幅高达70 %,最多可达90 %以上。
【附图说明】
[0024] 图1为本发明基于GPU的并行SA0算法的算法框架图。
[0025] 图2为跳跃型线程映射方法的示意图。
[0026] 图3为聚簇型线程映射方法的示意图。
[0027]图4为E0块级并行相对失真计算算法。
[0028]图5为B0块级并行相对失真计算算法。
[0029] 图6为IXU块级串行决策最优SA0参数算法。
[0030] 图7为像素级并行SA0处理算法。
【具体实施方式】
[0031] 附图仅用于示例性说明,不能理解为对本专利的限制;
[0032]下面结合附图和实施例对本发明的技术方案做进一步的说明。
[0033] 实施例1
[0034]如图1所示,一种基于GPU的并行SA0算法,所述算法按照以下步骤依次处理视频序 列的各帧:
[0035] S1:在GPU进行像素级并行统计,一个线程负责一个或多个像素在某种分类模式下 的统计;
[0036] S2:在GPU进行IXU块级并行计算相对失真;
[0037] S3:在CPU进行IXU块级串行决策最终SA0参数;
[0038] S4:在GPU进行像素级并行修正。
[0039] 在具体实施过程中,步骤S1中,像素级并行统计的具体方法为:一个线程负责一个 或多个像素在某种分类模式下的统计,时间复杂度可达0(1),线程与像素的映射方法为以 下三种映射方法的任意一种:
[0040] (1)对齐型线程映射方法:每一个线程负责图像分量中一个像素的统计工作;
[0041 ] (2)跳跃型线程映射方法:如图2所示,1个线程块映射1个LCU块,1个LCU块包含64 X 64个像素,1个线程块包含16X16个线程。跳跃型线程映射相比对齐型线程映射的一个改 进点是:使用更少的线程,每个线程负责更多的像素统计。使用这种线程布局的理由是:第 一,线程块内256个(16X16)线程可以充分利用硬件性能;第二,每个LCU块可以获得一块共 享内存,仍然可以利用共享内存作为高速缓存,对数据进行分层汇聚。
[0042] (3)聚簇型线程映射方法:如图3所示,每一个线程负责的像素是聚簇的,即每个线 程负责一块像素。
[0043] 所述聚簇型线程映射方法中,使用一个线程块映射一个编码单元块,每个线程块 的线程数量可以调整,但最佳数量为256,每个线程负责的像素区域是方形聚簇的,这样使 用的线程更少,可减少未调度线程的等待时间,也减少了线程间数据同步的等待时间,同 时,由于每个编码单元块获得一个线程块的映射,即分配到独立的共享内存,可将共享内存 充当数据同步时的高速缓存,从而再度加速。
[0044] 聚簇型线程映射的好处是:第一,只要将一个LCU块横竖方向各分裂16次,即分成 256个小块,每个小块的像素由1个线程负责,即可达到单线程块256线程,充分利用硬件资 源;第二,在区域像素雷同现象的前提下,每个小块内的像素是高度一致,由单个线程负责 可以避开竞争写同一变量的问题,从而减少因为数据同步而等待的时间;第三,线程数量相 比对齐型线程映射减少,可以缩短未被调度线程的等待时间;第四,依然是1个线程块映射1 个LCU块的线程布局,仍然可以使用共享内存充当高速缓存。
[0045] 在具体实施过程中,步骤S2中,LCU块级并行计算相对失真的具体方法为:
[0046] 如图4所示,对于E0模式(边缘模式),无论沿哪个方向进行像素比较,像素都被归 为5类,其中一类无意义,对应的修正值为0;对于每个LCU块,可以使用4X5个线程分别计算 4种边缘分类模式下,每类像素的在各个候选修正值下的相对失真,并将最小相对失真以及 对应的修正值存放在线程块的共享内存中,再分配一线程从中选出相对失真最小的边缘模 式。
[0047]如图5所示,对于B0模式(边带模式),像素被分为32类;因此,每个LCU块用1个线程 块映射,每个线程块包含32个线程,分别计算个边带各个候选修正值下的相对失真,并将最 小相对失真和取得该值下的修正值暂存于共享内存中;然后,分配29个线程分别计算29个 连续四边带的相对失真,再从中选出边带模式下最优的起始边带索引和4个最优偏移值。 [0048]如图6所示,在具体实施过程中,步骤S3中,LCU块级串行决策最终SA0参数的具体 方法包括以下步骤:
[0049] S31:遍历编码单元块CTB,选出E0,B0模式下的最小AJ(相对率失真),其中CTB指 最大编码单元块为LCU的一个分量;
[0050] S32:取上邻块的ACTUAL_TYPE,0FFSET(偏移值,或修正值),计算当前CTB在参数融 合下的A J,其中ACTUAL_TYPE用于保持参数传递性,即在邻块的MODE (模式)也为MERGE (参 数融合)时,可以直接从ACTUAL_TYPE得到邻块的SA0参数信息。
[0051 ] S33:取左邻块的ACTUAL_TYPE,OFFSET,计算当前CTB在参数融合下的A J;
[0052] S34:比较得出最小A J,判断取最小A J时是否为N0_SA0(不进行SA0处理),若是, 贝IJ0FFSET全为0,ACTUAL_TYPE为N0_SA0,并跳转到步骤S31;若否,则跳转到步骤S35;
[0053] S35:判断取最小A J时是否为邻块参数;
[0054] 若是,则使用邻块的OFFSET,写MODE为MERGE,TYPE为具体merge哪个邻块,ACTUAL_ TYPE为邻块的ACTUAL_TYPE,返回步骤S31;
[0055] 若否,则使用新OFFSET,写MODE为E0或B0, TYPE为具体模式,ACTUAL_TYPE做相应记 录,返回步骤S31;
[0056]各字段取值如表1所示。
[0057]表 1
[0059]当然,上述的SA0参数表格含有大量的非码流数据,ACTUAL_TYPE数据只是用于辅 助块级串行SAO参数决策算法,在实际写码流时,一个LCU块最多只写入6个数据,即MODE, TYPE,OFFSET [ 4 ],如果MODE=MERGE,那么连OFFSET也无须写入码流。
[0060] 如图7所示,在具体实施过程中,步骤S4中,像素级并行修正的具体方法包括以下 步骤:
[0061] S41:计算每个线程的下标,将线程下标转化为像素下标,计算对应的LCU索引; [0062] S42:读取当前像素所属CTB的SA0参数的ACTUAL_TYPE信息,判断是否做SA0,若是, 则跳转到步骤S43;若否,则当前像素的线程任务结束;
[0063] S43:判断是否为边缘模式;
[0064]若是,则依据边缘模式方向计算相邻像素的坐标,当前像素与邻像素比较,对其归 类,读取该类的修正值并修正,当前像素的线程任务结束;
[0065]若否,为边带模式,则计算当前像素所属边带,读取像素所属边带的修正值并修 正,当前像素的线程任务结束。
[0066] 相同或相似的标号对应相同或相似的部件;
[0067] 附图中描述位置关系的用语仅用于示例性说明,不能理解为对本专利的限制;
[0068] 显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对 本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可 以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本 发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求 的保护范围之内。
【主权项】
1. 一种基于GPU的并行SAO算法,其特征在于,所述算法按照以下步骤依次处理视频序 列的各帧: Sl:在GPU进行像素级并行统计,一个线程负责一个或多个像素在某种分类模式下的统 计; S2:在GRJ进行LCU块级并行计算相对失真; S3:在CRJ进行IXU块级串行决策最终SAO参数; S4:在GPU进行像素级并行修正。2. 根据权利要求1所述的基于GPU的并行SAO算法,其特征在于,步骤Sl中,像素级并行 统计的具体方法为:一个线程负责一个或多个像素在某种分类模式下的统计,时间复杂度 可达0 (1 ),线程与像素的映射方法为以下三种映射方法的任意一种,其中聚簇型线程映射 方法效果最佳: (1) 对齐型线程映射方法:每一个线程负责图像分量中一个像素的统计工作; (2) 跳跃型线程映射方法:1个线程块映射1个LCU块,1个LCU块包含64 X 64个像素,1个 线程块包含16 X 16个线程; (3) 聚簇型线程映射方法:每一个线程负责的像素区域是方形聚簇的,即每个线程负责 一块像素。3. 根据权利要求2所述的基于GPU的并行SAO算法,其特征在于,所述聚簇型线程映射方 法中,使用一个线程块映射一个编码单元块,每个线程块的线程数量可以调整,每个线程负 责的像素区域是方形聚簇的。4. 根据权利要求2所述的基于GPU的并行SAO算法,其特征在于,步骤S2中,LCU块级并行 计算相对失真的具体方法为:对于边缘模式,无论沿哪个方向进行像素比较,像素都被归为 5类,其中一类无意义,对应的修正值为0;对于每个LCU块,可以使用4X5个线程分别计算4 种边缘分类模式下,每类像素的在各个候选修正值下的相对失真,并将最小相对失真以及 对应的修正值存放在线程块的共享内存中,再分配一线程从中选出相对失真最小的边缘模 式。5. 根据权利要求2所述的基于GPU的并行SAO算法,其特征在于,步骤S2中,LCU块级并行 计算相对失真的具体方法为:对于边带模式,像素被分为32类;因此,每个LCU块用1个线程 块映射,每个线程块包含32个线程,分别计算个边带各个候选修正值下的相对失真,并将最 小相对失真和取得该值下的修正值暂存于共享内存中;然后,分配29个线程分别计算29个 连续四边带的相对失真,再从中选出边带模式下最优的起始边带索引和4个最优偏移值。
【文档编号】H04N19/42GK105959695SQ201610281623
【公开日】2016年9月21日
【申请日】2016年4月28日
【发明人】纪庆革, 林润阳, 朱婷, 梁凡
【申请人】中山大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1