[发明专利]一种基于CUDA架构的DNxHD VLC编码方法有效
申请号: | 201611202130.9 | 申请日: | 2016-12-20 |
公开(公告)号: | CN106791861B | 公开(公告)日: | 2020-04-07 |
发明(设计)人: | 王伟;黄进;廖义 | 申请(专利权)人: | 杭州当虹科技股份有限公司 |
主分类号: | H04N19/176 | 分类号: | H04N19/176;H04N19/436;H04N19/625 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 310000 浙江省杭州市西*** | 国省代码: | 浙江;33 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 cuda 架构 dnxhd vlc 编码 方法 | ||
本发明公开了一种基于CUDA架构的DNxHD VLC编码方法,对原有算法进行分解优化,细化并行计算的粒度,采用系数级并行方式进行编码,每64个线程编码一个宏块,每个线程每次编码一个直流系数,使得GPU可以满负荷运行,提升了GPU使用效率,从而提高VLC编码速度。
技术领域
本发明涉及一种基于CUDA架构的DNxHD VLC编码方法。
背景技术
在VC-3/DNxHD标准中,输入视频数据格式为YUV 4:2:2,每个块(block)大小固定为8x8,每个宏块(macroblock,简称MB)分为两部分:由亮度分量的四个块组成的16x16部分和由相应色差分量的四个块组成的16x16部分,也就是每个宏块包含8个8x8的block。
对于分辨率为1920x1080的视频序列的帧编码,每帧有120x68个宏块。虽然标准中没有明确提出Slice的概念,但实际编码中以每行120个宏块构成一个Slice。本发明中所称VLC编码主要指对于8x8块的DCT系数进行编码。
通常情况下用CPU编码实现时会采用slice并行的方式(每个slice中分别对每个宏块中的每个block的8x8个DCT系数依次进行编码,如图1所示),而如果以同样的方式进行CUDA实现,每个CUDA线程处理一个slice,那么这样的方式并行度会非常低。
对于分辨率1920x1080的视频序列,采用slice并行方式,也就是只能使用68个线程并行,而对于一块Tesla K10显卡,每个GPU上最多可并行16384个线程,这样GPU利用率只有0.42%。并且每个线程的运算量非常大,最多需要编码8x8x8x120=61440个系数。
发明内容
本发明的目的在于克服现有技术中的不足而提供一种基于CUDA架构的DNxHD VLC编码方法。
为实现上述目的,一方面,本发明提供的一种基于CUDA架构的DNxHD VLC编码方法,包括如下步骤:
将8x8block的DCT系数进行量化后,加载到共享存储器;
64个线程同步处理一个宏块;
当threadIdx=0,则第0个线程用差分脉冲编码调制对直流系数进行编码;
当threadIdx>0,则第threadIdx个线程计算第threadIdx个交流系数进行VLC编码;
64个线程同步处理一个经编码宏块;
当一个经编码宏块中的8个block计算完成后,保存编码结果,并开始编码下一个宏块。
优选地,第0个线程用差分脉冲编码调制对直流系数进行编码的步骤中,具体为计算当前block与前一个block的直流系数之差,并根据预定义直流系数码表进行编码。
优选地,第threadIdx个线程计算第threadIdx个交流系数进行VLC编码的步骤中,具体为,
当当前交流系数为0,则不计算;
当当前交流系数非零,则检索该交流系数与前一个非零交流系数之间的0的个数,并根据预定义交流系数码表进行编码。
根据本发明提供的一种基于CUDA架构的DNxHD VLC编码方法,对原有算法进行分解优化,细化并行计算的粒度,采用系数级并行方式进行编码,每64个线程编码一个宏块,每个线程每次编码一个直流系数,对于分辨率为1920x1080视频序列而言,需要120x68x64=522240个线程并行,对于一块Tesla K10显卡,这远大于其GPU能够并行的线程数,使得GPU可以满负荷运行,提升了GPU使用效率,从而提高VLC编码速度。
附图说明
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于杭州当虹科技股份有限公司,未经杭州当虹科技股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201611202130.9/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种密集型防火母线槽
- 下一篇:一种电线安装辅助支架