视频编码的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同步进行。

原文发布于微信公众号 - 媒矿工厂(media_tech)

原文发表时间:2017-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛客网

蚂蚁金服内推三面

【每日一语】人类的努力应该是没有边界的,我们千差万别,不管生活看上去有多糟糕,总有你能够做的事情,并且能够成功。有生命的地方,就有希望。——《万物理论》

561
来自专栏极客生活

从计算机体系结构到高性能编程实践(一)

上来先推荐一本书,《计算机体系结构:量化研究方法(第五版)》,英文能力比较好的建议阅读原版。

672
来自专栏逍遥剑客的游戏开发

面向对象vs面向数据

1274
来自专栏PHP技术

浅谈12306 核心模型设计思路和架构设计

原文出处: 汤雪华 前言 春节期间,无意中看到一篇文章, 文章中讲到12306的业务复杂度远远比淘宝天猫这种电商网站要复杂。后来自己想想,也确实如此。所以,很...

3997
来自专栏云计算

云计算,迷你版线程同步

昨天发了那个吹牛的文章,一不注意把今天推送文章的机会用掉了,所以我现在(PM 8:50)虽然已准备好,但也发不出来,抱歉,说好的今天发线程同步的内容只等到明天凌...

1756
来自专栏Hadoop数据仓库

HAWQ取代传统数仓实践(十四)——事实表技术之累积快照

一、累积快照简介         累积快照事实表用于定义业务过程开始、结束以及期间的可区分的里程碑事件。通常在此类事实表中针对过程中的关键步骤都包含日期外键,并...

2705
来自专栏数据派THU

【独家】并行计算性能分析与优化方法(PPT+课程精华笔记)

[导读]工业4.0、人工智能、大数据对计算规模增长产生了重大需求。近年来,中国高性能计算机得到突飞猛进的发展,从“天河二号”到“神威·太湖之光”,中国超级计算机...

2168
来自专栏java工会

学java就两个问题

1638
来自专栏腾讯大数据的专栏

SQL On Storm ——EasyCount系统概述

1. 摘要: TDW很好的解决了海量数据离线处理问题,但是在如下场景下:实时报表,实时监控,实时推荐,实时分析,TDW无法满足需求。而storm是应对这些场景的...

2449
来自专栏刁寿钧的专栏

10分钟入门关系型数据库(一):三范式

本文是《十分钟入门关系型数据库》系列技术文章的第一篇,主要介绍了数据库的三范式。

4680

扫描关注云+社区