【并行计算与CUDA开发】英伟达硬件加速编解码
硬件加速
硬件加速的学术名称是 GPGPU(General-purpose computing on graphicsprocessing units),中文名称是通用图形处理器。最基本的思想是使用 GPU 的运算能力完成原本需要 CPU 来进行的运算。
并行计算
GPU 是用来处理图形任务的图形处理器,其中一个非常大的优势在于它的并行处理能力。面对单指令流多数据流(SIMD),并且数据处理的运算量远大于数据调度和传输的需要时,GPU 的并行处理效率要高于传统的 CPU 的处理。
为了充分的利用 GPU 的并行处理能力,大部分的显卡厂商都推出了自己的 GPU 开发SDK,比如:
- NVIDIA —— CUDA
- Intel —— Intel® Media SDK
- AMD —— AMD APP SDK(前身是 ATI Stream)
当然这些厂商都是各自为阵,推出的 SDK 都是只能用于自己的显卡的 SDK,所以代码想要在不同的平台上能够统一是比较困难的。
OpenCL
OpenCL(Open Computing Language,开放计算语言),是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。这种语言主要是为了异构平台的并行运行设计的。
从本质上来说,它和 CDUA 等等 SDK 上是不同的,它是一种语言,相当于是 Java语言这个级别,而后者是一个开发包,相当于 JDK 这个级别。
OpenCL 目前的语言规范已经到了 2.1(Preview),支持最好的 AMD 的 SDK,最新版本已经支持了 OpenCL 2.0,其他两个只支持 OpenCL 1.2。
OpenCL 提供了一个统一的 API,这个 API 在上述的厂商的 SDK 中都有实现。所以安装 CUDA 会包含 OpenCL 组件,它是英伟达对于 OpenCL 语言的一种实现。
OpenCL API VS SDK
OpenCL API 最大的优势在于它的跨平台,可以在不同的架构上运行,所以理论上它比 SDK 更有竞争力。但是它最大的问题在于它的
API Level 比较基础,直接使用它进行视频的编解码处理难度比较大。
此外 OpenCL API 的实现是依赖于底层的 GPU 架构的,不同的厂商提供了不同的实现,使用之前需要安装不同厂商提供的实现,从这个角度考虑 OpenCL 的跨平台并没有想象中那么完美。
SDK 的问题在于不同的厂商的 SDK 是不兼容的。但是它提供了比 OpenCL API 更加丰富的功能,比如 NVIDIA 直接提供了视频编解码相关的接口,使用起来会比OpenCL API 更加的轻松。
英伟达硬件编解码方案
实现英伟达的 GPU 硬件编解码可以使用如下几种方案:
基于 OpenCL 的 API 自己写一个编解码器
这的难度非常大,首先你需要对于 OpenCL API 非常的熟悉,其次你需要对于编解码的知识了解的非常透彻。这两个问题的任何一个都有非常大的难度,以目前已有的技术来说成功的概念不是特别大。
MainConcept 公司做了这件事情,它提供了基于 OpenCL 的 H264/AVC 编码器,但是这个编码器是商用的(此外它还提供了基于 CUDA 的编码器和基于 Intel QSV 的编解器,以及包装过前面几者的编码器)。
所以从技术可行性上来说这个是可行的,只是目前来说个人还不具备这个实力。
使用 SDK 中的编解码接口
英伟达关于视频的编解码提供了两个相关的 SDK
- NVENC
- NVCUVID
前者负责硬件编码,二后者负责硬件解码。
NVENC 是一个单独的 SDK,集成在最新的显卡驱动上面,安装最新的驱动之后可以找到相关的库文件。在 Ubuntu 14.04 中,可以在 /usr/lib/nvidia-352/ 目录下面找到相关的库文件。
NVCUVID 是 CUDA 的组件,包含在最新的 CUDA 中。不过在显卡的类库中可以找到
Toolkitlibnvcuvid.so 这个库文件。在之前版本的显卡驱动中其他还包含一个称之为 NVCUVENC 的硬件编码器和 NVCUVID 相对应,不过目前这个组件已经被 NVENC 替代了。
使用编码器对于 OpenCL 和 SDK 的封装
这种方式是个人认为最理想的方式,FFMPEG 目前存在一个编码器 nvenc 是对于英伟达的 NVENC 的封装,通过使用它可以和
FFMPEG 无缝的整合起来。此外它也包含对于 Intel QSV 的封装。AMD 的相关接口目前没有找到相关的资料。
不过 FFMPEG 只存在 NVENC 的接口,不存在 NVCUVID 的封装。如果需要实现相关的解码器可能需要自己实现
FFMPEG 接口。
libx264 有对于 OpenCL 的封装,不过我在 windows 中尝试这个功能的时候并没有成功。
另外还存在一个开源的格式转换器 HandBrake,它包含对于 Intel的封装,以及使用
QuickSyncOpenCL 进行图象的拉伸处理和使用 x264 的 opencl封装。这个项目缺点在于文档不是很丰富,研究起来有一定的难度。
【并行计算与CUDA开发】英伟达硬件加速编解码的更多相关文章
- 【并行计算与CUDA开发】英伟达硬件加速解码器在 FFMPEG 中的使用
目录(?)[-] 私有驱动 编译 FFMPEG 使用 nvenc 这篇文档介绍如何在 ffmpeg 中使用 nvenc 硬件编码器. 私有驱动 nvenc 本身是依赖于 nvidia 底层的私有驱动的 ...
- FFmpeg再学习 -- 硬件加速编解码
为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...
- 【并行计算-CUDA开发】英伟达硬件解码器分析
这篇文章主要分析 NVCUVID 提供的解码器,里面提到的所有的源文件都可以在英伟达的 nvenc_sdk 中找到. 解码器的代码分析 SDK 中的 sample 文件夹下的 NvTranscoder ...
- CUDA学习笔记4:CUDA(英伟达显卡统一计算架构)代码运行时间测试
CUDA内核运行时间的测量函数 cudaEvent_t start1; cudaEventCreate(&start1); cudaEvent_t stop1; cudaEventCreate ...
- CUDA学习笔记2:CUDA(英伟达显卡统一计算架构)与已有的VS项目结合
一.步骤 1.先新建一个简单的控制台应用程序,项目名称为Mytest,如下图所示: 2.在项目中添加一个名为Test.cu文件,如下图所示: 3.在解决方案资源管理器中选择该项目并点击右键,在弹出的菜 ...
- 【视频开发】【CUDA开发】ffmpeg Nvidia硬件加速总结
原文链接:https://developer.nvidia.com/ffmpeg GPU-accelerated video processing integrated into the most p ...
- 不用写代码就能实现深度学习?手把手教你用英伟达 DIGITS 解决图像分类问题
2006年,机器学习界泰斗Hinton,在Science上发表了一篇使用深度神经网络进行维数约简的论文 ,自此,神经网络再次走进人们的视野,进而引发了一场深度学习革命.深度学习之所以如此受关注,是因为 ...
- 【并行计算-CUDA开发】从熟悉到精通 英伟达显卡选购指南
举报 说到显卡,就不免令人想到英伟达和AMD两家面向个人消费级和企业级最大的显示芯片生产企业,英伟达和AMD,今天小编为大家简单的介绍一下英伟达的显卡选购方面的攻略,为一些想要购买显卡的用户提供一些参 ...
- 【视频开发】【CUDA开发】英伟达CUVID硬解,并通过FFmpeg读取文件
虽然FFmpeg本身有cuvid硬解,但是找不到什么好的资料,英伟达的SDK比较容易懂,参考FFmpeg源码,将NVIDIA VIDEO CODEC SDK的数据获取改为FFmpeg获取,弥补原生SD ...
随机推荐
- 数字pid笔记(2)
void pid_Cal(void) { //float index = 0; IncPid * p = NULL; p = &g_PID_Inc; p->SetVal = sys_pa ...
- OSS - 有关于OSSClient的单例化
之前在每个控制层OSSClient都是通过新new的方式创建OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret)进行创建 后期我 ...
- java-十五周作业
题目1:编写一个应用程序,输入用户名和密码,访问test数据库中t_login表(字段包括id.username.password),验证登录是否成功. 题目2:在上一题基础上,当登录成功后,将t_u ...
- HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8
思路来自 FXXL 最小树形图模板用kuangbin的 /* HDU 6141 - I am your Father! [ 最小树形图 ] | 2017 Multi-University Traini ...
- MNIST 数据集介绍
在学习机器学习的时候,首要的任务的就是准备一份通用的数据集,方便与其他的算法进行比较. MNIST数据集是一个手写数字数据集,每一张图片都是0到9中的单个数字,比如下面几个: MNIST数据库 ...
- 041_查找 Linux 系统中的僵尸进程
#!/bin/bash#awk 判断 ps 命令输出的第 8 列为 Z 是僵尸进程,显示该进程的 PID 和进程命令 ps aux |awk '{if($8 == "Z"){pri ...
- UVA 11754 Code Feat 中国剩余定理+枚举
Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...
- 网络流24题 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- 洛谷P5369 [PKUSC2018]最大前缀和 [DP]
传送门 思路 这么一道签到题竟然没切掉真是丢人呢-- 首先有一个\(O(3^n)\)的SB方法,记录\(dp_{S,T}\)表示已经填进去了\(S\),当前最大前缀和集合为\(T\),随便转移.太简单 ...
- php foreach 中使用&时注意
结果: 没看懂的可以参考 :https://blog.csdn.net/ghostyusheng/article/details/79925351