NVDEC/NVENC を学んでいる

Erlang の NIF (C 拡張) を使って GPGPU との連携を考えているという話を以前書いた。

この時は GPGPU 、つまり CUDA を使って変換系で何かできそうというレベルの認識だった。実際 NVDEC と NVENC をドキュメント読んだり、サンプルを読んだりしてみたら、自分の認識が色々間違っていることが分かった。

自分の理解のためにまとめてみることにした。間違っていたらコメントで指摘してほしい。

NVENC/NVDEC は専用命令

公式サイトをちゃんと読めという話なのだが、 NVENC や NVDEC は CUDA コアを利用していないチップに積まれた専用命令だ。

そのため CUDA コアがどれだけ積まれたとしてもボードごとの性能に大きな差は出ない。

さらに機能差についてはボードに依存する。たとえば Kepler であれば NVENC を使った H.265 のエンコードには対応していないし、NVDEC を利用したVP8 のデコードには対応していない。

現在であれば Pascal でも Tesla P40 は VP9 のデコードに対応していないなど、ボード依存な事がわかった。

さらに良いボードであればエンコード系のチップが複数載っており純粋に性能はチップセット数になる。

Tesla P4 は NVENC のチップが 2 だが、Tesla P100 はチップが 3 となる。Quadro P400 はチップが 1 で、さらにストリームの同時処理は最大 2 までに制限されている。Tesla は無制限だ。

NVENC や NVDEC は CUDA コアを利用していないため、CUDA コア数の多さでは性能が変化したりはしない。純粋な載っているチップ性能に依存する。

NVIDIA VIDEO CODEC SDK

サンプルは Linux でしかビルドを試していないが、問題なく動作した。

動作させた環境は Ubuntu 16.04 に CUDA 9.0 をインストールした環境。 GeForce GTX 1060 6G を利用した。

サンプルコードは C++ で提供されている。ライブラリも同様に C++ で書かれている。

NVENC / NVDEC を利用する際 CUDA 知識は必要か

ただし、CUDA で計算処理などをしているわけではない。SDK 側でラップもしてくれているので、概念や CUDA の仕組みだけ理解しておけば良い。

Volta で入った機能

お勧め資料

今後

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store