视频编码的GPU加速

前言
随着视频编解码技术的不断发展,视频逐步向着高清晰、高动态、高数据量的方向演进。这对视频编解码终端的计算能力提出了越来越高的要求。同时,在GPU领域,随着CUDA等通用计算平台的不断发展,GPU逐渐成为了通用计算领域中不可或缺的硬件。利用GPU对视频编码进行加速成为了学术界和工业界的热点。

  1. GPU概述早期,GPU只能承担图形计算和渲染方面的任务,而且硬件架构较为封闭。OpenGL和DirectX接口是与GPU交互的唯一方式。如果工程师想利用GPU进行通用计算,不仅先要学习OpenGL和DirectX,还要想办法把运算数据“伪装”成图形数据给GPU处理。这种负担对研究人员来说过于沉重,因此GPU计算在早期没有被广泛接受。在2006年11月,NVIDIA发布了第一块基于CUDA架构构建的GPU,GeForce 8800GTX。CUDA架构允许程序对芯片上的每个数学逻辑单元(ALU)进行排列,且可以任意读写内存和缓存。此外,CUDA架构采用C语言作为开发语言,并只增加了一小部分关键字来支持CUDA架构的特殊功能。目前,基于CUDA的GPU加速已经在深度学习、图像处理、科学计算等领域有着广泛应用。
  2. 编码加速目前,最新的视频编码标准是HEVC,基于GPU的HEVC编码加速研究已经有很多。主要集中在运动估计方面。HEVC的运动估计包含以下步骤AMVP确定搜索起点整像素搜索亚像素差值亚像素搜索这其中,搜索当中最频繁的运算是SAD(或HAD),而插值部分可以看成图像滤波。这两部分运算有着数值运算量大、逻辑运算量少、每个像素的运算相互独立的特点,因此非常适合在GPU上进行运算。GPU运算的流程为输入、运算、输出三个部分。一般来说,运算部分可以为程序带来很高的提速。但是输入输出部分所耗的时间是无法消除的。这就要求加速算法必须提高吞吐量。在HEVC中,整像素搜索部分是以PU块为单位进行。然而,HEVC的PU块可选大小分布广泛,最大可取64x64,最小时边长仅为4。若对很小的PU块进行运算,其运算吞吐量非常小,算上输入输出时间很可能比原程序还要慢。为此,多数论文以整个CTU为单位进行运动估计。常见的套路是,通过某种策略给当前CTU确定一个搜索起点,然后对整个CTU进行整像素搜索。CTU内部的CU划分和PU块运动矢量的确定可以以SAD(HAD)作为因素。由于CTU中各个PU块都是按照相同方向进行搜索的,所以小的PU块可以像拼图一样拼出整个CTU,这样每个内部单元的SAD(HAD)都可求,如图1所示。图1 一个自下而上的PU计算策略至于插值部分,最常见的套路是先把每个参考帧提前插好,程序需要时直接读取。整个图像作为运算单元已经可以满足吞吐量的要求。
  3. 常见GPU优化方法在CUDA架构中,CPU称为主机(Host),GPU称为设备(Device)。在进行GPU运算时,首先要把数据从主机内存中传输到GPU显存中,合理地进行I/O设计是GPU效率的关键。主要策略有以下几点:尽可能减小主机复制到设备的数据量使用“页锁定内存”可以提高传输带宽将多个小的数据进行合并,一次传输,这样可以省去每次传输时的前置工作将GPU运算和I/O同步进行(较新的显卡)本篇主要对页锁定内存进行说明。主机CPU所管理的内存分为页锁定内存(Pinned Memory)和可分页内存(Pageable Memory)。若不加任何限定,默认分配的内存都是可分页内存。然而GPU无法直接获取主机的可分页内存。当从主机到设备进行一次数据传递时,首先CUDA驱动程序要先申请一个临时的页锁定内存,然后再将原内存数据复制到页锁定内存上,最后才能将页锁定内存的数据传输到设备上,如图2所示。图2 可分页内存和页锁定内存为了避免申请临时页锁定内存,我们可以直接在主机上申请页锁定内存。但是页锁定内存的申请有可能失败,所以每次申请时都要检查返回值是否报错。因为页锁定内存长期驻留在内存里,不会被操作系统内存优化影响(比如内存压缩、移入虚拟内存等),所以页锁定内存可以提高传输带宽。但是,过多的页锁定内存可能会很快消耗掉主机内存,使得主机性能下降。
  4. 总结本文主要介绍了常见的HEVC的GPU加速方法和GPU程序设计时要注意的问题。主机和设备之间的I/O是GPU优化的重点问题,需要精心设计。下一篇GPU的文章我们将介绍如何将GPU运算和I/O同步进行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值