一种基于CPU+GPU异构平台实现HEVC中的CABAC的并行方法转让专利

申请号 : CN201510266416.2

文献号 : CN104869398B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭成安章琨

申请人 : 大连理工大学

摘要 :

本发明公开了一种基于CPU+GPU异构平台实现HEVC中的CABAC的并行方法。将CABAC中所要完成的全部计算任务划分成:CABAC模块1和CABAC模块2;CABAC模块1的计算任务为语法元素转换、二进制化和上下文模型选择;CABAC模块2的计算任务为算术编码。在GPU上开设M个线程,用GPU多线程完成当前帧图像各个CTU的CABAC模块1的处理任务,一个GPU线程处理一个CTU单元,M个线程并行处理。在CPU端开设两个线程并行工作,CPU主线程用于调度和管理GPU多线程,CPU从线程用于完成CABAC模块2的处理任务。GPU多线程处理当前帧的图像数据,CPU从线程处理前一帧经过GPU多线程对CABAC模块1处理后的码流数据,二者并行工作。

权利要求 :

1.一种基于CPU+GPU异构平台实现HEVC中的CABAC的并行方法,其特征在于:

(1)将CABAC中所要完成的全部任务划分成两个模块:CABAC模块1和CABAC模块2;

(2)CABAC模块1的任务为语法元素转换、二进制化和上下文模型选择:

由GPU多线程完成当前帧图像各个CTU的语法元素转换、二进制化和上下文模型选择处理任务;设在此运算之前,已在GPU中完成包括将当前帧图像划分成M个CTU,M为一帧图像中所包含的CTU个数;对各个CTU的预测、变换、量化及滤波重建,再在GPU上开设M个线程,一个线程负责完成一个CTU的CABAC模块1的处理任务,M个线程并行处理;

(3)CABAC模块2的任务为算术编码:

在CPU端开设CPU主线程和CPU从线程两个线程,CPU主线程用于调度和管理GPU多线程与CPU从线程,CPU从线程用于完成CABAC模块2的处理任务;CPU主线程对GPU多线程和CPU从线程的调度方案如下:在同一时间中分配GPU多线程处理当前帧的图像数据,包括对当前帧进行预测、变换、量化、滤波重建以及CABAC模块1的计算,CPU从线程处理前一帧经过GPU多线程完成CABAC模块1后的码流数据;当CPU设备中具备双核以上的CPU处理器时,将CPU主线程和CPU从线程映射到两个CPU核上,使两个线程并行工作。

2.根据权利要求1所述的并行方法,其特征在于如下步骤,

步骤1:由CPU主线程对GPU多线程发调度指令,对分块后的第1帧图像进行帧内预测、变换、量化及滤波重建等处理,产生分割模式、预测模式、像素残差等待编码数据;结束时向CPU主线程发结束标志;CPU主线程接到GPU发来的结束标志,对GPU多线程发调度指令执行CABAC模块1;在CABAC模块1中,首先对得到的待编码数据以CTU为单元进行划分,按照HEVC中的CABAC算法原理对每一个CTU单元的待编码数据进行语法元素转换,按光栅扫描顺序存储各个CTU的语法元素;一个GPU线程处理一个CTU单元,NCTU个线程并行处理;对得到的各个CTU的语法元素按照HEVC中的CABAC算法原理进行二进制化处理,产生以CTU为单元的二进制化预编码码流;一个GPU线程处理一个CTU单元,NCTU个线程并行;对得到的二进制化预编码码流以CTU为单元按照HEVC中的CABAC进行上下文模型选择,存储上下文模型选择结果;

一个GPU线程处理一个CTU单元,NCTU个线程并行处理;结束时向CPU主线程发送结束标志;其中,NCTU为当前一帧图像所包含的CTU个数;

步骤2:CPU主线程接到GPU发来的结束标志,将在步骤1中得到的二进制化预编码码流和上下文模型的选择结果取到CPU中;

步骤3:CPU主线程开启CPU从线程,并分别向CPU从线程和GPU多线程发调度指令、启动CPU从线程和GPU多线程;CPU从线程对步骤2中得到的第1帧图像的二进制化预编码码流和上下文模型选择结果进行编码运算;结束时向CPU主线程发结束标志;GPU多线程对第2帧图像进行帧间预测、变换、量化及滤波重建等处理,产生分割模式、运动矢量误差、像素残差等待编码数据;结束时向CPU主线程发结束标志;CPU主线程接到GPU发来的结束标志,对GPU发调度指令执行CABAC模块1;在GPU端的CABAC模块1中,首先对得到的第2帧图像的待编码数据以CTU为单元进行划分,按照HEVC中的CABAC算法原理对每一个CTU单元的待编码数据进行语法元素转换,按光栅扫描顺序存储各个CTU的语法元素;一个GPU线程处理一个CTU单元,NCTU个线程并行处理;GPU多线程对得到的图像语法元素按照HEVC中的CABAC算法原理进行二进制化处理,产生以CTU为单元的二进制化预编码码流;一个GPU线程处理一个CTU单元,NCTU个线程并行;GPU多线程对得到的二进制化预编码码流以CTU为单元按照HEVC中的CABAC算法原理进行上下文模型选择,存储上下文模型选择结果;一个GPU线程处理一个CTU单元,NCTU个线程并行;结束时向CPU主线程发送结束标志;

步骤4:CPU主线程接到CPU从线程发来的结束标志和GPU多线程发来的结束标志后,将在步骤3中得到的二进制化预编码码流和上下文模型选择结果取到CPU中;分别向CPU从线程和GPU多线程发调度指令,按照步骤3执行,分别由CPU从线程完成对第2帧图像进行编码运算、GPU多线程完成分配给GPU端的对第3帧图像的处理任务;

步骤5:设执行到第k帧,2≤k≤N;按照步骤4分别由CPU从线程完成对第k-1帧图像进行算术编码(CABAC模块2)运算、GPU多线程完成分配给GPU端的对第k帧图像的处理任务;

步骤6:CPU主线程接到CPU从线程发来的完成第N-1帧CABAC模块2的结束标志和GPU多线程发来的完成第N帧的CABAC模块1的结束标志,对CPU从线程发调度指令执行对第N帧图像的CABAC模块2的处理,整个视频序列的CABAC编码过程结束。

说明书 :

一种基于CPU+GPU异构平台实现HEVC中的CABAC的并行方法

技术领域

[0001] 本发明属于数字视频压缩编码技术领域,涉及到高效视频编码HEVC(High Efficiency Video Coding)协议标准中的基于上下文编码CABAC(Context-based Adaptive Binary Arithmetic Coding)环节实现高效并行处理的方法,从而达到显著提升HEVC中CABAC的计算效率的目的。

背景技术

[0002] 数字视频由于直观性、确定性、高效性等优点,快速成为多媒体信息的主要载体,极大地丰富着人们的通信、娱乐和社交生活。同时,数字视频存在数据量大、需要信道传输带宽宽的问题。近几年,数字视频应用进入快轨道发展,视频分辨率从传统的标清向半高清(720p)、全高清(1080p)全面升级,甚至在一些高配置应用领域出现了超高清(3840×2160,7680×4320)的数字视频格式。相应的视频数据量大幅增加,视频信号存储和传输的压力加剧。为了适应数字视频的发展需求,继国际电信联盟与国际标准化组织ITU-T/ISO的联合视频专家组JVT在2003年推出H.264/AVC视频压缩编码标准后,国际电信联盟的视频编码专家组ITU-T/VCEG和国际标准化组织及国际电工委员会(IEC)的运动图像专家组ISO/IEC MPEG于2013年联合推出了下一代视频压缩编码标准—HEVC(High Efficiency Video Coding,高效视频编码)。HEVC标准一方面继承了H.264的编码理念,沿用了预测编码、变换编码和熵编码组成的混合编码框架,另一方面在各编码环节进行了改进,使得数据压缩率提高近1倍。HEVC标准在码率上的降低可以有效解决高清或超高清视频数据的存储和传输问题,但也使得整个编码过程的复杂度大幅度增加(据统计是H.264的2-4倍),这给实现HEVC标准下的视频实时编码的应用要求带来了巨大的挑战。为此,相关领域的科研人员正在设法研发各种高效的HEVC快速编解码算法或并行算法以解决该问题。
[0003] HEVC标准中采用基于上下文的自适应二进制编码(CABAC)作为熵编码方案。熵编码是按照信息熵原理进行的无损编码方式,处于视频压缩系统的末端。HEVC编码器的基本处理单元为图像中划分成互不重叠且尺寸相同的编码树单元(Coding Tree Unit:CTU),在做CABAC熵编码之前,先对当前帧图像进行帧内或帧间预测、变换、量化等处理,对每个CTU均产生了分割模式、预测模式、运动矢量误差、像素残差等待编码数据。然后再对这些待编码数据进行CABAC运算产生最终压缩后的编码数据。根据HEVC中规定的CABAC算法原理,CABAC中的编码环节是以一帧(或片Slice)的整体二进制码流为单元进行编码,对整个码流产生一个码字。而为了这个码字,是通过对整个码流中每个字符采用区间递推的处理方法从初始区间(0,1)开始,根据各个字符按序出现的概率递推地划分当前的概率区间,并对该字符出现的概率进行自适应更新,直到处理完最后一个字符得到最终的划分区间来得到整个码流所对应的码字。而其中针对每个字符所做的概率区间的划分都是在对前一个字符的划分结果基础上来进行的。因此该过程须按码流中的字符顺序来逐个处理。在CABAC之前的各个处理环节(包括帧内或帧间预测、变换、量化等)均比较容易设计出相应的并行处理方法,现有文献中已提出基于GPU(Graphics Processing Unit)实现的并行算法,从而达到显著提升其速度的效果。但对于CABAC环节,由于编码本身是一种递推过程,数据递推结果在各个字符之间存在依赖关系,不适于采用GPU多线程的并行处理方法来提高其速度,且目前文献中尚未见到提出有效的并行处理方案。在HEVC编码器中,CABAC是复杂度比较大的模块之一。当其它模块均已通过采用并行方法得到显著加速后,该模块则将成为实现HEVC编码器的实时处理的瓶颈问题。因此,设计出高效的CABAC并行处理方案,将对实现HEVC编码器的实时处理具有重要的意义。
[0004] 目前,针对如何提高CABAC的计算效率的研究主要集中于算法改进和硬件加速。2010年公布的专利(黄毓文,郭峋.对有序熵切片执行平行CABAC码处理的方法及装置:中国,200980000556.8[P].2010,09,15.)中的对有序熵切片执行平行CABAC码处理的方法及装置是通过将一帧图像划分成多个熵切片(Slice)并分配给多个处理器元件,平行地执行各个熵切片的CABAC过程,以此来实现提高一帧图像的CABAC速度。在该方法中,对一帧图像的CABAC速度直接与对该帧图像划分的熵切片数量以及所采用的处理器元件数量成正比,并行颗粒为一个熵切片的CABAC,其并行加速比的最大值不超过该帧图像划分的熵切片数量。然而,根据CABAC编码方法原理,对一帧图像所划分的熵切片数量越多,则该帧图像经过编码压缩处理后所得到的最终码流的长度越长。这表明如果从视频图像压缩目的本身来考虑,则熵切片数量越少越好。因此图像熵切片数量不宜取得很大,故该方法不适合于大规模的CABAC并行处理。2014年发表于《机工程与应用》的文献(路伟,余宁梅,南江涵,等.并行可配置的HEVC熵编码的VLSI结构[J].机工程与应用,2014,50(3):121-124,144.)设计了针对CABAC中语法元素并行处理的VLSI硬件电路结构,通过采用16个二进制编码器模块阵列(PE-Array)实现了CABAC模块的实时处理。2014年发表于《电视技术》的文献(郭勇,王桂海,范益波,等.基于HEVC标准的全高清CABAC编码器设计[J].电视技术,2014,38(9):71-74.)提出一种一个周期可以处理4个字符的编码器结构来实现1080p视频图像的CABAC模块的实时处理。后面两篇文献都是以硬件电路实现方法对CABAC模块进行加速,不适合应用在本发明所涉及的基于CPU+GPU平台采用多线程软件处理的大规模并行情况。2009年在《国防科技大学学报》上发表的文献(陈胜刚,孙书为,陈书明.基于多线程的CABAC并行编码方法[J].国防科技大学学报,2009,31(1):99-103.)通过将待编码的语法元素分为三类并对该三类语法元素并行各自的编码码流来提高CABAC的速度。由于该方法会产生三种不同的编码码流,因此不能用标准的CABAC解码器来解码。同时由于其并行度为3,不适用于本发明所涉及的基于CPU+GPU平台采用多线程软件处理的大规模并行情况。

发明内容

[0005] 本发明提出一种适合在CPU+GPU异构平台上实现的针对HEVC中CABAC进行并行处理的方法,用于解决CABAC过程耗时较长且不易实现并行处理的问题,从而达到显著提升HEVC中CABAC的计算效率的目的。
[0006] 在HEVC中,对每一幅当前帧图像(或当前片(Slice))都要首先进行预测(帧内预测或帧间预测,预测模式选择或运动搜索)、变换、量化及滤波重建等运算,在此基础上,再进行基于上下文的编码(CABAC)运算产生最终的编码压缩后的码流数据。根据HEVC中规定的CABAC算法原理,CABAC中主要包括语法元素(Syntax Elements)转换、二进制化、上下文模型选择以及编码四个关键环节。前三个环节均以CTU(Coding Tree Unit)为单元进行,第四个环节(即编码)以一帧(或片Slice)的整体码流为单元进行编码,对整个码流产生一个码字。
[0007] 根据上述算法原理,本发明提出的实现CABAC并行的技术方案是:
[0008] (1)将CABAC划分成两个模块:CABAC模块1和CABAC模块2。CABAC模块1的任务为语法元素转换、二进制化和上下文模型选择;CABAC模块2的任务为编码。
[0009] (2)针对CABAC模块1提出一种GPU多线程并行方案(如图的GPU端所示),用于在GPU上以多线程并行方式完成各个CTU的语法元素转换、二进制化和上下文模型选择的任务。该GPU多线程的并行方案是:在此运算之前,设已将当前帧图像划分成NCTU个CTU(其中NCTU为当前帧所包含的CTU个数),并完成对各个CTU的预测(帧内预测或帧间预测)、变换及量化等前续处理,在此基础上,在GPU上开设NCTU个线程(其中NCTU为当前一帧图像所包含的CTU个数),为每个CTU分配一个线程用于负责完成该CTU的语法元素转换、二进制化及上下文模型选择的任务。NCTU个线程并行处理,同时完成所分配的上述任务。
[0010] (3)针对CABAC模块2和(2)中的GPU多线程的调度与管理任务,提出一种CPU双线程并行方案(如图的CPU端所示):在CPU端开设两个线程,一个线程(称为CPU主线程)用于调度和管理GPU多线程,另一个线程(称为CPU从线程)用于完成CABAC模块2的编码任务。CPU主线程同时兼顾对CPU从线程的调度和协调工作。
[0011] (4)CPU主线程对GPU多线程和CPU从线程的调度方案是(如图中标注的执行时间顺序和帧顺序所示):在同一时间中分配GPU多线程处理当前帧的数据,CPU从线程处理前一帧经过GPU多线程处理后的码流数据。在此调度方案下,CPU中的两个线程各自所处理的数据没有依赖关系,可以同时并行工作。此外,目前常用的CPU均具有双核以上的CPU处理器,可以将两个CPU线程映射到两个CPU核上,因此可以做到使得这两个线程完全并行工作,从而等价于CPU从线程与GPU多线程可以同时并行工作,亦等价于此时CABAC模块1和CABAC模块2得到并行处理。
[0012] 需要指出的是,对于CABAC模块1在本发明中是以CTU为单元通过GPU多线程并行实现的,一个线程仅负责完成一个CTU的处理任务,从而其复杂度得到显著降低,其速度则随之得到显著提升。但根据HEVC中的熵编码原理,CABAC模块2的编码过程是以一帧(或片(Slice))图像的整体码流为单元进行的,对整个码流编制一个码字。而为了出这个码字,是通过对整个码流中每个字符采用区间递进的处理方法从初始区间(0,1)开始,根据各个字符按序出现的概率递归地划分当前的概率区间,并对该字符出现的概率进行自适应更新,直到处理完最后一个字符得到最终的划分区间来得到整个码流所对应的码字。其中针对每个字符所做的概率区间的划分都是在对前一个字符所做的划分结果基础上来进行的。因此该过程必须按码流中的字符顺序来逐个串行地处理。为此在本发明中专门开设一个CPU从线程用于完成该项编码任务,而没有采用GPU多线程来处理。这是因为考虑到该编码过程本身已不能再进一步划分,而一个GPU核的能力远小于一个CPU核,如果采用一个GPU单线程来完成该项任务,则会耗时较长,但采用一个CPU线程则耗时相对短得多。
[0013] 另一方面需要指出的是,虽然CPU单核的能力远强于GPU的单核,但CABAC模块2是采用一个CPU线程来实现的,所处理的是整个一帧图像的码流数据,故其耗时通常比由GPU多线程来完成的CABAC模块1的耗时要长得多。因此如果这两个模块同时启动,则会发生当GPU多线程已经完成了当前帧的CABAC模块1的任务时,CPU从线程尚未完成对前一帧码流的编码(即CABAC模块2)的任务,这样则会造成对整个处理过程的延时。为了解决这一问题,在本发明中进一步对在CABAC模块1之前的各个环节加以综合考虑。根据HEVC标准协议,在CABAC环节之前主要包括对当前帧数据进行预测(帧内预测或帧间预测,预测模式选择或运动搜索)、变换、量化及滤波重建等环节,而这些环节均可以在GPU端采用GPU多线程方案来并行实现,所以在本发明中的CPU主线程的调度方案中,将CPU从线程对前一帧码流进行编码(CABAC模块2)的启动时间提前至GPU多线程开始对当前帧进行预测、变换、量化及滤波重建等运算的时刻(如图中标注的执行时间顺序和帧顺序所示)。这样则可保证CPU从线程具有足够的时间在GPU多线程完成对当前帧的CABAC模块1的任务之前完成对前一帧的CABAC模块2的处理,从而在各帧图像的处理时间中节省了由CPU从线程对CABAC模块2进行处理所产生的耗时。
[0014] 本发明的效果和益处主要包括:
[0015] (1)通过对CABAC模块1(即各个CTU的语法元素转换、二进制化和上下文模型选择)采取GPU多线程并行处理方案,一个线程承担一个CTU的处理任务,使该模块的计算复杂度得到显著降低,因此其处理速度得到显著提升。该并行方案的并行度为NCTU(其中NCTU为当前一帧图像所包含的CTU个数),所能达到的理论加速比亦为NCTU。以1080p的高清视频图像为例,若将CTU的尺寸设置为32×32,则所能达到的理论加速比为NCTU=2040。
[0016] (2)通过设计出CPU双线程并行方案,能够做到完全省去由CPU从线程完成CABAC模块2所产生的耗时。这是因为在该CPU双线程并行方案中是用CPU从线程完成对前一帧图像的CABAC模块2(即编码)的处理任务,该CPU从线程与GPU端的GPU多线程并行工作,在GPU多线程完成当前帧图像的预测、变换、量化、滤波重建和CABAC模块1之前即可完成对CABAC模块2的处理。由于CABAC的编码原理决定该模块本身已不能再进行划分,不适于采用GPU多线程进行并行处理,因此与由GPU多线程来并行处理的CABAC模块1相比,CABAC模块2的耗时较长。本发明所做的实验结果表明,对于1080p的高清视频图像序列,当将压缩码率设置为6M比特/秒,采用一个CPU从线程来完成一帧图像的CABAC模块2(即编码)的处理任务,平均耗时约为18毫秒(注:实验所用的CPU型号为 CoreTMi3550@3.2GHz)。若采用本发明的并行处理方案,则可以省去该项耗时,这对
[0017] 于能否实现高清视频图像的实时编码压缩处理是十分关键的。

附图说明

[0018] 附图是本发明的基于CPU+GPU异构平台实现HEVC中的CABAC的并行方法的示意图。

具体实施方式

[0019] 以下结合技术方案和附图详细阐述本发明的具体实施例。
[0020] 实施步骤如下:
[0021] 步骤1:如附图所示,针对第1帧图像,设定图像中CTU的尺寸(例如8×8,16×16,32×32或64×64),按光栅扫描顺序对该帧图像进行分割,形成CTU块。
[0022] (1.1)由CPU主线程对GPU多线程发调度指令,对分块后的第1帧图像进行帧内预测、变换、量化及滤波重建等处理,产生分割模式、预测模式、像素残差等待编码数据。结束时向CPU主线程发结束标志;
[0023] (1.2)CPU主线程接到GPU发来的结束标志,对GPU多线程发调度指令执行CABAC模块1;
[0024] (1.3)在CABAC模块1中,首先对在(1.1)中得到的待编码数据以CTU为单元进行划分,按照HEVC中的CABAC算法原理对每一个CTU单元的待编码数据进行语法元素转换,按光栅扫描顺序存储各个CTU的语法元素。一个GPU线程处理一个CTU单元,NCTU个线程并行处理;
[0025] (1.4)对在(1.3)中得到的各个CTU的语法元素按照HEVC中的CABAC算法原理进行二进制化处理,产生以CTU为单元的二进制化预编码码流。一个GPU线程处理一个CTU单元,NCTU个线程并行;
[0026] (1.5)对在(1.4)中得到的二进制化预编码码流以CTU为单元按照HEVC中的CABAC算法原理进行上下文模型选择,存储上下文模型选择结果。一个GPU线程处理一个CTU单元,NCTU个线程并行。结束时向CPU主线程发送结束标志。
[0027] 步骤2:CPU主线程接到GPU发来的结束标志,将在(1.4)中得到的二进制化预编码码流和在(1.5)中得到上下文模型的选择结果取到CPU中。
[0028] 步骤3:CPU主线程开启CPU从线程,并分别向CPU从线程和GPU多线程发调度指令、启动CPU从线程和GPU多线程。
[0029] (3.1)CPU从线程对步骤2中得到的第1帧图像的二进制化预编码码流和上下文模型选择结果进行编码(即CABAC模块2)运算。结束时向CPU主线程发结束标志;
[0030] (3.2)GPU多线程对第2帧图像进行帧间预测、变换、量化及滤波重建等处理,产生分割模式、运动矢量误差、像素残差等待编码数据。结束时向CPU主线程发结束标志;
[0031] (3.3)CPU主线程接到GPU发来的结束标志,对GPU发调度指令执行CABAC模块1。
[0032] (3.4)在GPU端的CABAC模块1中,首先对在(3.2)中得到的第2帧图像的待编码数据以CTU为单元进行划分,按照HEVC中的CABAC算法原理对每一个CTU单元的待编码数据进行语法元素转换,按光栅扫描顺序存储各个CTU的语法元素。一个GPU线程处理一个CTU单元,NCTU个线程并行;
[0033] (3.5)GPU多线程对在(3.4)中得到的图像语法元素按照HEVC中的CABAC算法原理进行二进制化处理,产生以CTU为单元的二进制化预编码码流。一个GPU线程处理一个CTU单元,NCTU个线程并行;
[0034] (3.6)GPU多线程对在(3.5)中得到的二进制化预编码码流以CTU为单元按照HEVC中的CABAC算法原理进行上下文模型选择,存储上下文模型选择结果。一个GPU线程处理一个CTU单元,NCTU个线程并行。结束时向CPU主线程发送结束标志。
[0035] 步骤4:CPU主线程接到CPU从线程发来的结束标志和GPU多线程发来的结束标志后,将在(3.5)中得到的二进制化预编码码流和在(3.6)中得到上下文模型选择结果取到CPU中。分别向CPU从线程和GPU多线程发调度指令,按照步骤(3.1)-(3.6)执行,分别由CPU从线程完成对第2帧图像进行编码(CABAC模块2)运算、GPU多线程完成分配给GPU端的对第3帧图像的处理任务。
[0036] 步骤5:设执行到第k帧(2≤k≤N),按照步骤4分别由CPU从线程完成对第k-1帧图像进行编码(CABAC模块2)运算、GPU多线程完成分配给GPU端的对第k帧图像的处理任务。
[0037] 步骤6:CPU主线程接到CPU从线程发来的完成第N-1帧CABAC模块2的结束标志和GPU多线程发来的完成第N帧的CABAC模块1的结束标志,对CPU从线程发调度指令执行对第N帧图像的CABAC模块2的。该步骤完成后,整个视频序列的CABAC编码过程结束。