在cuda上实现mpeg4i帧编码的方法

文档序号:7759695阅读:184来源:国知局
专利名称:在cuda上实现mpeg4i帧编码的方法
技术领域
本发明涉及视频编码领域,特别是涉及一种在CUDA上实现MPEG4I帧编码的方法。
背景技术
众所周知,MPEG4视频编码器是个复杂的算法工程,其中对于I帧的编码,是其重要的组成部分。想要在计算机上实时运行该算法,则需要给计算机配上强劲的CPU。而现在,统一计算设备架构(Computer UnifiedDevice Architecture,CUDA)显卡芯片有着强大的并行计算能力,并且提供通用计算的编程接口。如果能把I帧的编码算法移植到CUDA中运行,就能大大提高编码器的执行效率。要想实现这个目标,现有技术中还存在如下几个必须解决的问题1、现有MPEG编码器包括对I帧的编码算法都是在单线程、单核的环境下开发的, 然而CUDA是多线程,多核环境。要开发出适合CUDA运行的I帧编码算法,线程的管理、调度和任务分配是个至关重要的工作。现有技术中还没有在CUDA上完整实现该算法的完整资料和经验。2、CUDA上的硬件架构比单核或多核的CPU要复杂的多。为了要开发出高效的I帧的编码器出来,必须按照CUDA的硬件结构和内存访问方式,来重新设计I帧的表和函数地址。CUDA的硬件架构复杂,主要有如下几个方面A、CUDA里没有高谏缓冲存储器(Cache), 只有共享内存(SiaredMemory)。B、CUDA的GPU同时访问Siared Memory,如果地址是16倍数,就会导致访问地址冲突,从而造成了访问时间大幅增加。C、GPU访问全局内存(Global Memory)的时候,一次读一个byte的时间比一次读8个byte时间要高。

发明内容
本发明所要解决的技术问题是提供一种在CUDA上实现MPEG4I帧编码的方法,能使MPEG4I帧编码算法符合CUDA硬件结构和工作特性,能充分发挥CUDA并行计算能力,能使MPEG4I帧编码算法在CUDA上高效实现和运行,能提高运行效率6_7倍。为解决上述技术问题,本发明提供的在CUDA上实现MPEG4I帧编码的方法,包括如下步骤步骤一、采用CUDA的多个线程块实现对MPEG4I帧的各宏块的并行处理,各所述宏块包括6个8X8X4字节的块。其中每一个所述线程块实现对一个所述宏块的处理,各处理包括离散余弦变换(Discrete CosineTransformation, DCT)、量化(QUANT)、反量化 (DEQUANT)、反离散余弦变换(IDCT)四个操作,得到各所述宏块的非预测数据。将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现对一个所述宏块的处理,由于一个所述宏块包括6个8X8X4字节的块,所以每个8X8X4字节的块被8个线程处理,处理方法包括如下步骤步骤1、在所述CUDA中申请一个大小为17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程。步骤2、每个所述线程从所述CUDA的全局内存中读出所述MPEG4I帧的当前所述宏块的数据,并把当前所述宏块的数据存入到所述共享内存中,其中每个所述线程读一次所述全局内存且每次读8个字节。步骤3、对所述共享内存里的数据做离散余弦变换的行变换。 步骤4、对所述离散余弦变换的行变换后的数据,进行所述离散余弦变的列变换。步骤5、对所述离散余弦变换后的数据进行量化操作。步骤6、保存所述量化后的数据到所述全局内存中。步骤7、对所述量化后的数据进行反量化操作。步骤8、对所述反量化后的数据进行所述反离散余弦变换的行变换。步骤9、对所述反离散余弦变换的行变换出来后的数据进行列变换。步骤10、将最后得到的所述反离散余弦变换的列变换后的数据保存到所述全局内存中。步骤二、根据MPEG4协议,采用多个所述线程块对各所述宏块进行水平预测或垂直预测的并行计算,其中每一个所述线程块实现对一个所述宏块的水平预测或垂直预测的计算,得到各所述宏块的预测数据。将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现对一个所述宏块的水平预测或垂直预测的计算包括如下步骤步骤1、在所述CUDA中申请一个大小为17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程。步骤2、计算当前所述宏块的左、上、上右和上左的所述宏块的有效性。步骤3、所述每个线程从所述全局内存中读出当前所述宏块的量化后的数据并把当前所述宏块的量化后的数据存入到所述共享内存中;其中每个所述线程读二次所述全局内存且每次读8个字节。步骤4、所述每个线程从所述全局内存中读出当前所述宏块的左方、上方、上左的所述宏块的量化后的数据并存入到所述共享内存中。步骤5、对所述共享内存中的数据进行水平预测或垂直预测,并将得到的预测数据到所述全局内存中。步骤三、采用多个所述线程块并行实现各所述宏块的预测数据的墒编码和非预测数据的墒编码并选择各所述宏块的编码模式,其中一个所述线程块实现一个所述宏块的预测数据的墒编码和非预测数据的墒编码并取墒编码长度较小的模式作为所述宏块的编码模式。将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、 X = 8,用一个所述线程块实现一个所述宏块的预测数据的墒编码和非预测数据的墒编码并选择所述宏块的编码模式的方法包括如下步骤步骤1、在所述CUDA中申请一个大小为 17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程。步骤2、 清空所述共享内存的地址空间。步骤3、从所述全局内存中读取当前所述宏块的预测数据和非预测数据,将所述预测数据和所述非预测数据分别通过之字扫描的顺序填写到所述共享内存中。步骤4、重新扫描所述共享内存中的所述预测数据和所述非预测数据,并对所述预测数据和所述非预测数据分别进行查表找出所述预测数据的墒编码和所述非预测数据的墒编码。步骤5、选择当前所述宏块的编码模式是预测编码模式还是非预测编码模式,选择方法为比较所述预测数据的墒编码和所述非预测数据的墒编码的长度,选取墒编码的长度小的模式作为所述宏块的编码模式,所述预测数据的墒编码的长度小时选择预测编码模式、所述非预测数据的墒编码的长度小时选择非预测编码模式。步骤6、将所述预测数据的墒编码和所述非预测数据的墒编码保存到所述全局内存中。本发明方法使MPEG4I帧编码算法符合CUDA硬件结构和工作特性,能充分发挥 CUDA并行计算能力,本发明能使I帧的所有宏块同时去做DCT、QUANT等操作、也能同时再做所有宏块的预测等操作,使MPEG4I帧编码算法在CUDA上高效实现和运行,能提高运行效率6-7倍。


下面结合附图和具体实施方式
对本发明作进一步详细的说明图1是本发明方法的流程图;图2是本发明实施例方法的步骤一的流程图;图3是本发明实施例方法的步骤二的流程图;图4是本发明实施例方法的步骤三的流程图。
具体实施例方式如图1所示,本发明方法的流程图,本发明在CUDA上实现MPEG4I帧编码的方法包括如下步骤步骤一、采用CUDA的多个线程块实现对MPEG4I帧的各宏块的并行处理,其中每一个所述线程块实现对一个所述宏块的处理,各处理包括离散余弦变换、量化、反量化、反离散余弦变换四个操作,得到各所述宏块的非预测数据。步骤二、根据MPEG4协议,采用多个所述线程块对各所述宏块进行水平预测或垂直预测的并行计算,其中每一个所述线程块实现对一个所述宏块的水平预测或垂直预测的计算,得到各所述宏块的预测数据。步骤三、采用多个所述线程块并行实现各所述宏块的预测数据的墒编码和非预测数据的墒编码并选择各所述宏块的编码模式,其中一个所述线程块实现一个所述宏块的预测数据的墒编码和非预测数据的墒编码并取墒编码长度较小的模式作为所述宏块的编码模式。如图2所示,是本发明实施例方法的步骤一的流程图。本发明实施例在CUDA上实现MPEG4I帧编码的方法的步骤一中将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、x = 8,用一个所述线程块实现对一个所述宏块的处理,该处理方法包括如下步骤步骤1、在所述CUDA中申请一个大小为17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程。即图2所示,计算当前线程的变量,如arnred Memory地址等。步骤2、每个所述线程从所述CUDA的全局内存中读出所述MPEG4I帧的当前所述宏块的数据,并把当前所述宏块的数据存入到所述共享内存中,其中每个所述线程读一次所述全局内存且每次读8个字节。即图2所示读取当前帧数据到arnred Memory。所述当前帧即为当前所述宏块。步骤3、对所述共享内存里的数据做离散余弦变换的行变换。即图2所示的对数据做DCT的行变换r0W_dct()。所述r0W_dct()即为行变换函数。做完所述行变换后,紧接着进行一步线程同步的操作,即图2所示的jyncthreadsO。步骤4、对所述离散余弦变换的行变换后的数据,进行所述离散余弦变的列变换。 即图2所示的对数据做DCT的列变换c0l_dct()。所述c0l_dct()即为列变换函数。步骤5、对所述离散余弦变换后的数据进行量化操作。即图2所示的对数据做量化
6quant (),所述quant ()即为量化函数。做完所述量化后,紧接着进行一步线程同步的操作, 即图 2 所示的 _syncthreads ()。步骤6、保存所述量化后的数据到所述全局内存中。即图2所示的保持数据进入 global memory0步骤7、对所述量化后的数据进行反量化操作。即图2所示的对数据做反量化 dequantO,所述的quant ()即为反量化函数。步骤8、对所述反量化后的数据进行所述反离散余弦变换的行变换。即图2所示的对数据做反DCT的行变换rowjdctO。所述r0W_dct()即为行变换函数。步骤9、对所述反离散余弦变换的行变换出来后的数据进行列变换。即图2所示的对数据做反DCT的列变换c0l_idct()。所述c0l_idct()即为反列变换函数。步骤10、将最后得到的所述反离散余弦变换的列变换后的数据保存到所述全局内存中。即图2所示的保存参考帧进入global memory。所述参考帧即为所述当前帧经过上述DCT、QUANT、DEQUANT, IDCT操作后形成的视频数据。图3是本发明实施例方法的步骤二的流程图。本发明实施例在CUDA上实现MPEG4I 帧编码的方法的步骤二中将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现对一个所述宏块的水平预测或垂直预测的计算包括如下步骤步骤1、在所述CUDA中申请一个大小为17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程。即图3所示,计算当前线程的变量,如arnred Memory地址等。步骤2、计算当前所述宏块的左、上、上右和上左的所述宏块的有效性。即图3所示的计算当前宏块邻居的有效性。步骤3、所述每个线程从所述全局内存中读出当前所述宏块的量化后的数据并把当前所述宏块的量化后的数据存入到所述共享内存中;其中每个所述线程读二次所述全局内存且每次读8个字节。即图3所示的读取QUANT之后数据到Siared Memory。当前所述宏块的量化后的数据即为步骤一中进行量化操作之后保存到所述全局内存中的数据。步骤4、所述每个线程从所述全局内存中读出当前所述宏块的左方、上方、上左的所述宏块的量化后的数据并存入到所述共享内存中。即图3所示的读取当前宏块左、上、上左的数据。步骤5、对所述共享内存中的数据进行水平预测或垂直预测,并将得到的预测数据到所述全局内存中。即图3所示,对数据做水平或垂直方向的预测,并保存。如图4所示,是本发明实施例方法的步骤三的流程图,本发明实施例在CUDA上实现MPEG4I帧编码的方法的步骤三中将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现一个所述宏块的预测数据的墒编码和非预测数据的墒编码并选择所述宏块的编码模式的方法包括如下步骤步骤1、在所述CUDA中申请一个大小为17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程。即图4所示,计算当前线程的变量,如Siared Memory地址等。步骤2、清空所述共享内存的地址空间。即图4所示,清空当前SiaredMemory空间。步骤3、从所述全局内存中读取当前所述宏块的预测数据和非预测数据,将所述预测数据和所述非预测数据分别通过之字扫描的顺序填写到所述共享内存中。即图4所示, 读取数据,写到相应的Glared Memory地址中。步骤4、重新扫描所述共享内存中的所述预测数据和所述非预测数据,并对所述预测数据和所述非预测数据分别进行查表找出所述预测数据的墒编码和所述非预测数据的墒编码。即图4所示,在所述Siared Memory中扫描数据,查找墒编码。步骤5、选择当前所述宏块的编码模式是预测编码模式还是非预测编码模式,选择方法为比较所述预测数据的墒编码和所述非预测数据的墒编码的长度,选取墒编码的长度小的模式作为所述宏块的编码模式,所述预测数据的墒编码的长度小时选择预测编码模式、所述非预测数据的墒编码的长度小时选择非预测编码模式。即图4所示,判断宏块使用编码模式。步骤6、将所述预测数据的墒编码和所述非预测数据的墒编码保存到所述全局内存中。即图4所示,保存墒编码值到global memory中。以上通过具体实施例对本发明进行了详细的说明,但这些并非构成对本发明的限制。在不脱离本发明原理的情况下,本领域的技术人员还可做出许多变形和改进,这些也应视为本发明的保护范围。
8
权利要求
1.一种在CUDA上实现MPEG4I帧编码的方法,其特征在于,包括如下步骤步骤一、采用CUDA的多个线程块实现对MPEG4I帧的各宏块的并行处理,其中每一个所述线程块实现对一个所述宏块的处理,各处理包括离散余弦变换、量化、反量化、反离散余弦变换四个操作,得到各所述宏块的非预测数据;步骤二、根据MPEG4协议,采用多个所述线程块对各所述宏块进行水平预测或垂直预测的并行计算,其中每一个所述线程块实现对一个所述宏块的水平预测或垂直预测的计算,得到各所述宏块的预测数据;步骤三、采用多个所述线程块并行实现各所述宏块的预测数据的墒编码和非预测数据的墒编码并选择各所述宏块的编码模式,其中一个所述线程块实现一个所述宏块的预测数据的墒编码和非预测数据的墒编码并取墒编码长度较小的模式作为所述宏块的编码模式。
2.如权利要求1所述的在CUDA上实现MPEG4I帧编码的方法,其特征在于步骤一中将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现对一个所述宏块的处理的方法包括如下步骤步骤1、在所述CUDA中申请一个大小为17 X 48 X 4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程;步骤2、每个所述线程从所述CUDA的全局内存中读出所述MPEG41帧的当前所述宏块的数据,并把当前所述宏块的数据存入到所述共享内存中,其中每个所述线程读一次所述全局内存且每次读8个字节;步骤3、对所述共享内存里的数据做离散余弦变换的行变换;步骤4、对所述离散余弦变换的行变换后的数据,进行所述离散余弦变的列变换;步骤5、对所述离散余弦变换后的数据进行量化操作;步骤6、保存所述量化后的数据到所述全局内存中;步骤7、对所述量化后的数据进行反量化操作;步骤8、对所述反量化后的数据进行所述反离散余弦变换的行变换;步骤9、对所述反离散余弦变换的行变换出来后的数据进行列变换;步骤10、将最后得到的所述反离散余弦变换的列变换后的数据保存到所述全局内存中。
3.如权利要求1所述的在CUDA上实现MPEG4I帧编码的方法,其特征在于步骤二中将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现对一个所述宏块的水平预测或垂直预测的计算包括如下步骤步骤1、在所述CUDA中申请一个大小为17X48X4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程;步骤2、计算当前所述宏块的左、上、上右和上左的所述宏块的有效性; 步骤3、所述每个线程从所述全局内存中读出当前所述宏块的量化后的数据并把当前所述宏块的量化后的数据存入到所述共享内存中;其中每个所述线程读二次所述全局内存且每次读8个字节;步骤4、所述每个线程从所述全局内存中读出当前所述宏块的左方、上方、上左的所述宏块的量化后的数据并存入到所述共享内存中;步骤5、对所述共享内存中的数据进行水平预测或垂直预测,并将得到的预测数据到所述全局内存中。
4.如权利要求1所述的在CUDA上实现MPEG4I帧编码的方法,其特征在于步骤三中将各所述线程块定义为三维模式且将各所述线程块的大小定义为ζ = 3、y = 2、χ = 8,用一个所述线程块实现一个所述宏块的预测数据的墒编码和非预测数据的墒编码并选择所述宏块的编码模式的方法包括如下步骤步骤1、在所述CUDA中申请一个大小为17 X 48 X 4字节的共享内存,并将所述共享内存映射给所述线程块的每一个线程;步骤2、清空所述共享内存的地址空间;步骤3、从所述全局内存中读取当前所述宏块的预测数据和非预测数据,将所述预测数据和所述非预测数据分别通过之字扫描的顺序填写到所述共享内存中;步骤4、重新扫描所述共享内存中的所述预测数据和所述非预测数据,并对所述预测数据和所述非预测数据分别进行查表找出所述预测数据的墒编码和所述非预测数据的墒编码;步骤5、选择当前所述宏块的编码模式是预测编码模式还是非预测编码模式,选择方法为比较所述预测数据的墒编码和所述非预测数据的墒编码的长度,选取墒编码的长度小的模式作为所述宏块的编码模式,所述预测数据的墒编码的长度小时选择预测编码模式、 所述非预测数据的墒编码的长度小时选择非预测编码模式;步骤6、将所述预测数据的墒编码和所述非预测数据的墒编码保存到所述全局内存中。
5.如权利要求1-4所述的在CUDA上实现MPEG4I帧编码的方法,其特征在于各所述宏块包括6个8 X 8 X 4字节的块。
全文摘要
本发明公开了一种在CUDA上实现MPEG4I帧编码的方法,包括步骤采用CUDA的多个线程块实现对MPEG4I帧的各宏块并行处理,各处理包括离散余弦变换、量化、反量化、反离散余弦变换四个操作,得到各宏块的非预测数据;根据MPEG4协议,采用多个线程块对各宏块进行水平预测或垂直预测的并行计算,得到各宏块的预测数据;采用多个所述线程块并行实现各宏块的预测数据的墒编码和非预测数据的墒编码并选择各宏块的编码模式。本发明方法使MPEG4I帧编码算法符合CUDA硬件结构和工作特性,能充分发挥CUDA并行计算能力,能使MPEG4I帧编码算法在CUDA上高效实现和运行,能提高运行效率6-7倍。
文档编号H04N7/26GK102404561SQ20101028093
公开日2012年4月4日 申请日期2010年9月14日 优先权日2010年9月14日
发明者武海斌, 金尹 申请人:盛乐信息技术(上海)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1