【並行計算與CUDA開發】英偉達硬件加速編解碼

硬件加速

硬件加速的學術名稱是 GPGPU(General-purpose computing on graphicsprocessing units),中文名稱是通用圖形處理器。最基本的思想是使用 GPU 的運算能力完成本來須要 CPU 來進行的運算。css

並行計算

GPU 是用來處理圖形任務的圖形處理器,其中一個很是大的優點在於它的並行處理能力。面對單指令流多數據流(SIMD),而且數據處理的運算量遠大於數據調度和傳輸的須要時,GPU 的並行處理效率要高於傳統的 CPU 的處理。html

爲了充分的利用 GPU 的並行處理能力,大部分的顯卡廠商都推出了本身的 GPU 開發SDK,好比:java

  • NVIDIA —— CUDA
  • Intel —— Intel® Media SDK
  • AMD —— AMD APP SDK(前身是 ATI Stream)

固然這些廠商都是各自爲陣,推出的 SDK 都是隻能用於本身的顯卡的 SDK,因此代碼想要在不一樣的平臺上可以統一是比較困難的。windows

OpenCL

OpenCL(Open Computing Language,開放計算語言),是一個爲異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其餘類型的處理器組成。這種語言主要是爲了異構平臺的並行運行設計的。api

從本質上來講,它和 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 比較基礎,直接使用它進行視頻的編解碼處理難度比較大。ui

此外 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 Toolkit 中。不過在顯卡的類庫中能夠找到 libnvcuvid.so 這個庫文件。在以前版本的顯卡驅動中其餘還包含一個稱之爲 NVCUVENC 的硬件編碼器和 NVCUVID 相對應,不過目前這個組件已經被 NVENC 替代了。

使用編碼器對於 OpenCL 和 SDK 的封裝

這種方式是我的認爲最理想的方式,FFMPEG 目前存在一個編碼器 nvenc 是對於英偉達的 NVENC 的封裝,經過使用它能夠和 FFMPEG 無縫的整合起來。此外它也包含對於 Intel QSV 的封裝。AMD 的相關接口目前沒有找到相關的資料。

不過 FFMPEG 只存在 NVENC 的接口,不存在 NVCUVID 的封裝。若是須要實現相關的解碼器可能須要本身實現 FFMPEG 接口。

libx264 有對於 OpenCL 的封裝,不過我在 windows 中嘗試這個功能的時候並無成功。

另外還存在一個開源的格式轉換器 HandBrake,它包含對於 Intel QuickSync的封裝,以及使用 OpenCL 進行圖象的拉伸處理和使用 x264 的 opencl封裝。這個項目缺點在於文檔不是很豐富,研究起來有必定的難度。

相關文章
相關標籤/搜索