基于CUDA的HAVC视频编码的设计与实现(精品)

第28卷第1期2009年3月
中南民族大学学报(自然科学版)
JournalofSouth—CentralUniversityforNationalities(Nat.Sci.Edition)
V01.28No.1
Mar.2009
基于CUDA的H.264/AVC视频编码的设计与实现
高智勇,万双,舒振-y-,刘海华
(中南民族大学电子信息工程学院,武汉430074)
摘要为了提高编码速率,将视频编码中计算量较大的运动估计和离散余弦变换(DCT)系数计算移植到图像处理器(GPU)上处理.根据H.264/AVC的编码要求和处理器的并行结构.提出了~种并行处理方法.并利用统一计算设备架构(CUDA)的计算平台,实现了H.264/AVC中的
运动估计和DCT变换系数的计算.实验表明:在GPU上采用并行计算方法可较大程度地提高视频编码速度.
关键词统一计算设备架构;H.264/AVC视频编码标准;运动估计;并行计算
兑换券制作中图分类号TP391文献标识码A文章编号1672—4321(2009)01—0067—05
DesignandImplementationofH.264/AVC
VideoEncodingBasedonCUDA
GaoZhiyong,WanShuang,ShuZhenyu,LiuHaihua
(CollegeofElectronicInformationEngineering.South·CentralUniversityforNationalities.Wuhan430074,China)AbstractToenhancespeedofvideocoding·motionestimationandDCTcoefficientcomputedinthegraphic
processingunit(GPU).ThemethodofparallelprocessingisproposedaccordingtostandardofH.264/AVCvideocodingandtheparallelarchitectureoftheGPU.ThemethodisimplementedintheGPUwithCUDAcomputationalplatform.Experimentalresultsshowsthattheproposedmethodimprovesthespeedofvideocoding.
KeywordsCUDA;H.264/AVCvideocodingstandardmotionestimation,parallelcomputing
图形处理器(GPU)的处理速度在最近几年得到了快速的发展,其计算能力以每年2.8倍的速度增长,高于CPU的发展速度.如目前GTX280GPU的峰值浮点运算能力已经超过1TFlops,而因特尔4核CPUClowlown的单精度浮点最高运算能力为84GF】ops.出现该现象的主要原因在于CPU的微构架要兼顾数值运算指令和控制指令,而GPU的微构架是面向图形类高度并行计算而设计的,因此,GPU在并行数值处理能力上要远高于CPU.为了合理地利用GPU通用计算的资源,统一计算设备架构(CUDA)应运而生n].CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题.它包含了CUDA指令集
架构(ISA)以及GPU内部的并行计算引擎.它将GPU的可编程顶点渲染器和片元渲染器集成起来,组成统一的SPMD(aSingleProgramMulipleData)计算设备,并且提供内部共享内存以减少访问外部DRAM的次数,从而大大提高了可编程性.
在视频压缩领域,H.264/AVC是目前编码效率较高和图像质量较好的编解码标准口],但是其运算复杂度较高.为了提高H.264/AVC的编码效率,目前人们开展了将H.264/AVC中计算量较大的运动估计运算移植到CUDA处理中的研究D].然而,图像编码中除运动估计外,其残差宏块的整数DCT
收稿日期2009—01—25
作者简介高智勇(1972一),男,博士,副教授.研究方向:图像处理和识别,E—mail:zhiyonggao@mail.scuec.edu.cn基金项目国家863计划资助项目(2007AA091101)
68中南民族大学学报(自然科学版)第28卷
变换是H.264/AVC中另一个比较耗时的运算,因
此,本文在此基础上提出了一种新的并行处理框架,
将运动估计和残差宏块的整数DCT变换整合在一
起,充分利用GPU中的共享内存,最大限度地发挥
GPU的并行处理能力,从而提高了编码效率.
统一计算设备架构的特点
CUDA是将GPU中的顶点渲染器和像素渲染
器统一到一个计算单元中,即称作为流处理器
(SP),其中每8个SP组成一个多处理器(SM),其
结构如图1所示.同时,每个SM含有多个片上内存:
本地寄存器、共享内存、只读常量缓冲、只读纹理缓
冲,且每个SM都是基于单指令多数据(SIMD)的
构架,用相同的指令执行不同的数据.每个SM都可
以读取和修改设备内存,所以SM可以通过设备内存来交换数据.虽然SM之间不能进行同步操作,但每个SM内的SP可以通过函数来进行同步操作,防止数据读取错误.
在进行CUDA编程时,可将GPU视为能并行执行非常多个线程的计算设备,并作为CPU的协处理器操作,因此,其编程程序将分为两个部分:Host端和Device端,其中Device端程序为GPU上执行的部分,该程序又称为”Kernel”.通常Host端程序会将数据准备好后,复制一份到显卡的内存中,由GPU执行Kernel程序,完成后再由Host端程序将结果从显卡的内存中取回.
执行内核的最小单位是线程,数个线程组成一个线程块,一个线程块包含的线程数是有限的.一个线程块的所有线程都在一个SM上执行.因此,同一个线程块中的线程可以通过共享内存来有效地共享数据,并可以同步以防止访问冲突.更准确地说,用户可以在内核中指定同步点,线程块中的线程在全部到达此同步点时挂起.在一个SM中执行的线程块被成为活动块,每个活动块划分到被称为warp的SIMD线程组中.其中,每个warp包含相同数量的线程,并以SIMD方式由SM执行,多个活动warp分时复用SM.每个线程都有唯一的线程ID来标识,供程序使用.同样,每
个线程块也有唯一的块ID来标识.数个线程块再组成一个网格,具有相同维度和大小的块可以分批组合到一个块网格中.这样,单个内核调用中启动的线程总数就可以变得很大.但这是以线程协作性的降低为代价的,因为同一网格中不同线程块中的线程不能互相通信和同步u].
图1CUDA硬件模型结构
Fig.1HardwaremodelofCUDA
2基于CUDA的H.264/AVC视频编码
H.264/AVC是将图像分割成很多个宏块,然后利用视频帧图像的帧内和帧间的相关性,采用帧内预测和帧间预测的编码模式,对各个宏块进行编码,从而实现视频图像的压缩编码.帧内预测模式是为了消除视频图像序列的空间冗余,主要将视频帧图像分为4x4、16×16等子块的方式,利用周围已经编码的宏块预测当前宏块的系数,然后将当前宏块和预测值的差值进行变换编码,从而提高压缩效率.帧间预测是为了消除视频帧图像之间的时间冗余.H.264/AVC标准中,帧间预测采用了可变块的运动估计技术,比如亮度宏块可以分为16×16、16×8、8×16、8×8的大小,而每一个8×8的块,又可分为8×4、4×8、4×4的宏块子分区,每个分区都要进行运动估计,所以共有7种分块模式的运动估计补偿[2].此外,为了提高效率,H.264/AVC在P帧的编码过程中,对运动矢量为0的16×16宏块编码时,采用了SKIP编码模式.
H.264/AVC运用多种编码模式,使运动估计更为精确,但同时也增加了计算量,例如H.z64/AVC编码的计算复杂度相当于H.263的3倍,用普通的CPU将无法实现实时编码,因此,本文将把H.
264/AVC中的运动估计通过CUDA平台移植GPU
第1期高智勇,等;基于CUDA的H.264/AVC视频编码的设计与实现69
上运行.虽然目前已经有很多快速运动估计算法[I。63,但这些快速算法都含有很多分支判断语句,并不适合CUDA上的并行处理环境,所以,本文采用全搜索法来出各宏块的最佳运动矢量.
2.1线程块的划分
由于目前的CUDA模型中每个线程块的最佳线程数是256,而H.264/AVC中的基本宏块大小为16×16,由此可见将运动估计中每个宏块的绝对帧差和(SAD)的计算放在CUDA的一个线程块中操作是较为有效的.然而,H.264/AVC的视频编码中采用的是变块大小的模式,宏块的大小从6×16到4×4,如果宏块太小,那么对该宏块SAD计算所需要的线程太少,导致线程块中所含的线程数较少,不利于CUDA的操作.另外一方面,H.264/AVC的编码中采用16×16、16×8、8×16、8x8等4种模式进行编码概率较大,占全部编码模式的80%以上,为了充分利用资源,提高效率,所以将这4种编码模式放在GPU上执行,而将8×4、4×8、4×4这3种编码模式的选择放在CPU上运行.
首先利用CUDA函数将当前帧和参考帧从HOST端拷贝到DEVICE端,并绑定到纹理内存中,然后根据视频图像的分辨率,进行线程块划分.假设图像的分辨率为W×H,且宏块分割以16×16为标准,则须要的线程块总数量为:
Bolo伽一N“m=IWIx[H],(·)在实际设计时,如果图像分辨率不为16的倍数,则须要补0构成16的倍数分辨率的图像.由于每个宏块对应一个GPU的线程块,因此每个宏块内建立256个线程,即1个像素对应一个线程·使每个线程并行执行.
对于每个线程首先计算计算4个8×8宏块的SAD,并将这4个SAD存入共享内存,那么16×16、16×8、8×16宏块的SAD通过8x8子宏块的SAD相加获得.采用这种运动估计宏块对应线程块的方法可以充分发挥了CUDA的并行计算能力;由于一个像素对应一个线程,计算和寻址更方便;因为共享内存是由16个库组成,这样的线程块构造可以大大降低库冲突,改善了并行运行环境.
2.2最小SAD搜索
由于16×16的宏块是由4个8×8子块I、I、I、Ⅳ组成,假设搜索域为16×16,如图2所示,那么每个8×8子块的SAD搜索范围为16×16.如,I块的搜索范围是由(0,O)和(X3,Y3)做对角线组成的正方方块,Ⅱ块的搜索范围是由(X1,o)和(X4,Y3)做对角线
组成的正方方块.由此可见,每个8×8子块都有256个SAD值.根据每个像素对应一个线程,则每个线程计算获得4个不同8×8子块的参考帧位置.同时,运动矢量是线程对应的像素到该16×16子块中心的偏移.如图2中的P1、P2、P3和P4分别表示I、I、Ⅲ、Ⅳ4个8×8子块对应的参考帧中的子块,运动矢量计算由(2)式确定.
Vz=(blockldx.z×Pixelz+
胁陀口d似Lz)%16—8
f91yv一(blockldx.y×Pixelv+’
threadldx.y)%16—8
其中,%表示取余运算,V—z和V—Y分别表示z、Y方向的运动矢量,Pixel—z和Pixel—Y表示当前线程所对应像素的位置,blockldx.z和blocklda:.Y表示线程块的索引,threadldx.z和threadldx.Y表示线程块内部的线程的索引.
.当前帧xg址日
灌。
‘m一
图2各个8X8子块参考帧的位置
Fig.2Positionof8X8sub—blockre{erenceframe
每个线程除了计算4个8×8子宏块的SAD值,还需要计算2个16×8和2个8×16宏块的SAD,以及1个16×16宏块的SAD,共需要存储9个SAD值.因为SAD值还要经过搜索出最d、SAD值,需要频繁的读写操作,因此将SAD存放在共享内存(SharedMemory)中,如图3所示.
1●x¨
图3SAD在CUDA中的存储
Fig.3StorageofSAD.mCUDA
每个线程块中都有256组SAD值,每组SAD都分别有4种宏块的SAD,为了搜索最小SAD,在
70
中南民族大学学报(自然科学版)
第28卷
CUDA中采用并行搜索算法进行处理,即将SAD的比较运算分布在多个线程中,如图4所示.首先,将256组SAD数据放入128个线程中进行比较,平均每2组SAD数据经过一个线程的比较,把最小值存入线程对应的共享内存中;然后,将比较得到的128组SAD数据存入64个线程中进行比较;最后,经过8
Sk0(sharedmeaory)l'm-tad
ID(比较)轮的比较,最小的一组SAD存人到第一个线程对应的共享内存中,以此类推.其中一
个SAD值和运动矢量共享一个整数型的共享内存,低16位存运动矢量,高16位存SAD值,因此在最后得到最小的SAD值时,同时也得到了该SAD值对应的运动矢量.
I1
23456
910Il12
1314
15
16L—I—k广k广k—k—I一、广
‘5
6.T。8.e.Ia
11.1213.1‘.15
16
上上
'L上
'L
J.
Jr
I1.2
非接触式扭矩传感器345
6.T.8.9.101l
1213
141516
●●
‘●
●●
‘●
ll23‘S
6789lO,Il
1213ll
lSi8上
Jr
Jr
2345678g
1011
1213lt高压直流稳压电源
1518
●‘
●●
Il
.r
glDll
12
13l●1516
图4最小SAD在CUDA中的并行搜索
Fig.4
ParallelsearchofthesmallestSADinCUDA
2.3
DCT变换的计算利乐包
DCT是目前多数图像视频编码的主要方法,但
由于DCT变换核中含有实数,在处理时需要进行浮点运算,而浮点运算会有舍入误差,这就使得在具体实现时会导致编解码的失配.为了克服这些问题,H.264/AVC采用基于4×4子块的整数DCT变换[zJ],使变换操作用整数加减和移位操作就可以完成.根据残差数据的不同,H.264/AVC采用3种变换.对于帧内预测模式的16×16宏块的亮度DC系数采用哈达玛变换,
家用玉米脱粒机度DC系数采用2×2的哈达玛变换,其他的4×4块残差数据采用整数DCT变换.H.264/AVC中整数DCT变换公式[23如下:
y一(CXCT)oE,
(3)
其中:
E==
口‘
ab/2
口2
ab/21
—1
—12
ab/262/4ab/2
62/4
1—21—1
口‘
ab/2
口‘
ab/2
ab/2
62/4
ab/2b2/4
口;吾护再.
为了计算DCT变换习俗,首先是在每个线程中计算对应像素的残差,并将残差值存到共享内存中,
…圆…圃…圆
然后利用_syncthreads()函数同步,在每个线程中计算对应像素位置的整数DCT系数.
3实验结果与分析
在本文的设计中,经过精心的优化,运动估计和整数DCT变换都是在DEVICE端的一个Kernel中运行,减少了读写设备内存的次数,提高了并行执行的效率.在实验中,主要对1
920×1088和1
280×
720分辨率的图像序列做一个分析.其实验环境为
IntelCore(TM)2Duo2.4GHzCPU(1024
MB内
存),NVIDIA
GeForce9800GTX+显卡(512MB
显存),CUDA
Toolkit
version
2.1
for
Windows
XP.实验分为两部分,第一部分是只在CPU和GPU
上对测试序列进行运动估计计算,实验结果如表1.由表1的结果可以发现,GPU上的计算速度要比CPU上快13倍左右.第二部分是在CPU和GPU上分别同时对测试序列进行运动估计和整数DCT变
换计算,实验结果如表2.表2的数据表明GPU上的计算速度比CPU上快15倍左右.其中运算计时的方式采用RDTSC(ReaD
TimeStampCounter)汇编
指令,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数,这种计时方式可以达到纳秒级的计时精度.在CPU上进行的运动估计采用SSE指令加速,序列长度均为150帧.
擎圆圆●●一一
‘1
II
第1期高智勇.等:基于CUDA的H.264/AVC视频编码的设计与实现71
表1在CPU和GPU上只运行运动估计的实验结果比较
Tab.1ExperimentalresultcomparisonofmotionestimationrunningCPUandGPU
表2在CPU和GPU上同时运行运动估计和整数DCT变换的实验结果比较Tab.2ExperimentalresultcomparisonofintegermotionestimationandDCTtransformrunningsimultaneouslyCPUandGPU
根据表1、2的数据可以看出,利用CUDA平台对H.264/AVC只进行运动估计运算比在CPU上运算的速度提高12~13倍多,而将运动估计和整数DCT变换同时放在GPU上运行的速度是在CPU上的14~15倍,后者的速度比前者的计算速度大约提高15%.原因在于,GPU非常适合密集型运算,在GPU上做的运算越多,其处理效率越高.由此可以推出,将H.264/AVC其他编码部分用CUDA移植到GPU上运行,其效率将会进一步提高.
参考文献
[1]RichardsonIEG.H.264/MPEG一4Partl0whitepaper:overviewofH.264[EB/OL'].2003[2009—01-
103.http:/www.ycodex。corn。
[23NVIDIACorporation.NVIDIACUDAcomputeuni—fleddevicearchitecture—programmingguide[EB/OL].
Version2.1.(2008—06—07)[2009—1—18].http:/www.
nvidia.cn/docs/10/57399/NVIDIACUDA
Programming—Guide一2.OFinal.pdf.[3]
[4]
[5]
[6]
[7]
[83
ChenWei—Nien,HangHsueh-Ming.H.264/AVCmo—
tionestimationimplmentationcomputeunifieddevicearchitecture(CUDA)[J].IEEEMultimediaandExpo.2008.17:697-700.
ChenZhibo,ZhouPeng,HeYun.Fastintegerand
fractionalpelmotionestimationforJVT[C]//JVT.
Procofthe6thJVT—F017Conference.Japan:Awaji,
2002.
LiR.ZengB.LiouML.Anewthree-stepsearch
algorithmforblockmotionestimation[J].IEEE
TransCircuitsSyst:VideoTechnol,1994。4:438—44
3.
ZhuS.MaKK.Anewdiamondsearchalgorithmforfastblock—matchingmotionestimation[J].IEEETransImageProcess,2000,9(2):287-290.
PanFeng,LinXiao,RahardjaS,eta1.Fastmodedeci—
sionalgorithmforintrapredictioninH.264/AVC
videocoding[J].IEEETransactionsCircuitsandSystemsforVideoTechnology,2005.15(7):813—822.
张淑芳,李华,侯玲,等.基于H.264的快速帧问
正交编码器模式选择算法[J].计算机应用研究,2008,25(1):283-
284.

本文发布于:2024-09-23 05:25:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/236903.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   运动   计算   编码   估计
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议