NVEncを使ってみた
NVIDIAのKepler以降のGPUに載っているNVEncを使ってみるはなし。

こんなかんじのログが出る。
最近は、GPUに動画のハードウェアデコード・エンコード機能を載っけるのが流行っているらしく、IntelのQSV、AMDのVCE同様、NVIDIAのKepler以降のGPUにもNVEncと呼ばれるハードウェアエンコード機能がついている。GPUの有効活用、という点ではこういう機能もぜひ使っていきたいところ。

↑あまり有効利用してないこいつを有効に活用するのだ…。
しかし、これまでGeforceではこの機能がロックされていて、自由に使うことができなかった。(Tesla買えということですね、わかります)
が、少し前、グラフィックドライバの更新によりやっとGeforceでも使えるようになった、ということを教えていただいたので、早速NVEncを使ってみることにした。
いつもどおり、配布されているサンプルプログラムをAviutlの出力プラグインとして改造して、実験してみる。
拡張 NVEnc 出力
NVIDIAのハードウェアエンコーダ、NVEncによる出力プラグインです。
必須動作環境
Windows Vista,7,8,8.1 (x86/x64)
Aviutl 0.99g4 以降
NVEncが載ったハードウェア
NVIDIA製 GPU GeForce Kepler世代以降 (GT/GTX 6xx 以降)
※GT 63x, 62x等はFermi世代のリネームであるため非対応なものがあります。
GPU-Zでみて、GPU: GK1xx ならば問題ないはずです。
※NVIDIA グラフィックドライバ 334.89以降がインストールされていること
※XPではたぶん動作しません。
まあ、もう気にしなくていいよね、XP。余命あとすこしだし。
使用可能かは設定画面で確認できます。
←使用可能
←使用不可
使用方法
ダウンロードしたら解凍して出てくるauo_setupを実行してください。
以下のものを必要なら自動でダウンロード・インストール・配置します。
・.NET Framework 4.0 Client Profile
・neroaacenc
・L-SMASH
・msvcr120.dll
・msvcp120.dll
NVEncは.NET 4.0系を使用します。ただ、通常はWindows Updateによりインストールされているはずです。
いつもの注意事項など
無保証です。自己責任で使用してください。拡張 NVEnc 出力 (NVEnc.auo)を使用したことによる、いかなる損害・トラブルについても責任を負いません。
機能・特徴等
・NVEncによる高速エンコード
・CQP / CBR / VBR モード
・インタレ保持(PAFF)エンコード
・色空間情報の指定 (H.264 VUI Info)
・自動フィールドシフト対応
・高速化
- 色空間変換のSIMD対応 (SSE2~AVX2)
- 入力バッファによるGPUへの転送レイテンシの遮蔽
・設定ファイルの保存
・QSVEncと同様に、各種音声エンコーダに対応
・音声同時変換
・エンコード一時停止
・残り時間・経過時間表示
・ログ自動保存
[非対応 & 対応予定なし機能]
・Aviutlのコピーフレーム
・Aviutlのキーフレーム
・オーディオディレイカットの「映像追加」モード
解決できていない問題
[未実装] minQP / maxQPの指定ができない問題。
[バグ] nvCuda.dllがない環境でAviutlを実行すると、「nvCuda.dllが存在しません」と出てAviutlを起動できない問題。 (0.01で修正)
…すみません、そのうち直します。
エンコードのさらなる高速化
~GPUへのデータ転送時間の遮蔽とか~
NVEncでの処理は、順に
1. Aviutlでのデコード
2. Aviutlのフィルタチェーン
3. AviutlからYUY2で受け取りNV12に変換
4. cuMemcpyHtoDにより、フレームをGPUに転送
5. GPUにエンコード命令を発行
6. GPUからの出力をファイルに書き出し
となる。で、ここでは2のフィルタは使わないとして考えてみる。
こうしたハードウェアエンコーダを使用する場合、速度は多くの場合CPUのデコード処理によって律速されてしまう。つまりエンコードの速度はいかに速くデコードし、エンコーダにフレームを渡すかにかかっている。
そこで、「4:GPUへの転送 + 5:エンコード命令発行」を別のスレッドに分け、並列に実行することにより、メインスレッドがデコード~NV12変換に専念できるようにした。やはりGPUへのフレーム転送は遅いようで、この工夫によってGPU転送のレイテンシを遮蔽し、そこそこ(10%程度)高速化できる。
GPUへデータを転送する、というコードを書くだけならまったく簡単で問題ない。ところが、GPUへの転送を別スレッドにやらせるコードを書くにはやっぱりわりと面倒。GPUへの転送CPUメモリとGPUメモリがわかれていることのデメリットがこうした工夫をしなければならないことにあると思う。AMDの言うHSAのメリットというののひとつは、統一メモリによりこうした問題がなくなってコードが書きやすくなる、ということなんだと思う。
(膨大な数の細かい独立したタスクがあって、その一部でGPUを使用するみたいな場合にはあまり気にしなくていい…つまり、やらせるタスクにもよるのだけど…)
またいつもどおり、YUY2→NV12変換はSSE2~AVX2を使用して高速化している。
設定画面 スクリーンショット

検証環境
Win7 x64
Intel Core i7 4770K @ 4.4GHz
Asrock Z87 Extreme4
GeForce GTX 660
DDR3-2600, 16GB RAM, 10-12-12-31-2
NVIDIA グラフィックドライバ 335.23
Aviutl 1.00
NVEnc 0.00 (335.23ドライバ)
QSVEnc 1.20 (3412ドライバ)
x264guiEx 2.06
x264 8bit, x64 rev2409 POP氏ビルド
ソース
この大空に、翼をひろげて FLIGHT DIARY オープニングムービー(Downloadできるやつ)
VC-1, 1280x720p, 30.00fps, 3140frmaes, 約1分45秒, 70.5MB
エンコード設定
NVEnc
CQP 28:32:35
QSVEnc
CQP 25:28:33
x264
--crf 27.3 --preset slow --psy-rd 1.0:0.2 --aq-strength 0.5
この設定で映像ビットレートとエンコード速度は
NVEnc 1480kbps (104.08 fps)
QSVEnc 1469kbps (99.46 fps)
x264 1463kbps (64.04 fps)
とだいたい1500kbps弱に合わせることができた。
エンコード速度は大きな差がないけど、この動画ではデコードが遅いのが原因。もっと高速にデコード出来る素材なら、ハードウェアエンコはもっと速くなると思う。
画質比較 (1721frame目)
わかりにくい場合は別のタブで複数の画像を開いて、タブ切り替えで比べてみてください。
オリジナル

NVEnc 1480kbps
う~ん、やや荒れ気味か。輪郭の崩れ、背景のテクスチャの潰れが気になる。

QSVEnc 1469kbps
輪郭周りがやはり微妙。背景のテクスチャは結構よく残っている。

x264 1463kbps
さすが…というべきで、背景のテクスチャも潰れずよく再現出来ている。

画質比較 (2127frame目)
オリジナル

NVEnc 1480kbps
う~ん、わりと劣化が進んでしまっている。空(青)と髪(黒)の境界付近の破綻がひどい。

QSVEnc 1469kbps
まあまあ。それなりではある。

x264 1463kbps
ここでは完璧に再現出来ているわけではないけれど、ごまかし方がうまい。

というわけで、NVEncは画質面ではすごくよい、というわけではない。というよりまあ当たり前だけど、やっぱりx264の画質(圧縮率)は圧倒的で、ハードウェアエンコは遠く及ばない。
それでも、そこそこの画質で高速にエンコードできるようなので、もしKepler/MaxwellなGPUが付いていて、興味を持ったら遊んでみてください。
ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(dropbox)からどうぞ。同じものです。

こんなかんじのログが出る。
最近は、GPUに動画のハードウェアデコード・エンコード機能を載っけるのが流行っているらしく、IntelのQSV、AMDのVCE同様、NVIDIAのKepler以降のGPUにもNVEncと呼ばれるハードウェアエンコード機能がついている。GPUの有効活用、という点ではこういう機能もぜひ使っていきたいところ。

↑あまり有効利用してないこいつを有効に活用するのだ…。
しかし、これまでGeforceではこの機能がロックされていて、自由に使うことができなかった。(Tesla買えということですね、わかります)
が、少し前、グラフィックドライバの更新によりやっとGeforceでも使えるようになった、ということを教えていただいたので、早速NVEncを使ってみることにした。
いつもどおり、配布されているサンプルプログラムをAviutlの出力プラグインとして改造して、実験してみる。
拡張 NVEnc 出力
NVIDIAのハードウェアエンコーダ、NVEncによる出力プラグインです。
必須動作環境
Windows Vista,7,8,8.1 (x86/x64)
Aviutl 0.99g4 以降
NVEncが載ったハードウェア
NVIDIA製 GPU GeForce Kepler世代以降 (GT/GTX 6xx 以降)
※GT 63x, 62x等はFermi世代のリネームであるため非対応なものがあります。
GPU-Zでみて、GPU: GK1xx ならば問題ないはずです。
※NVIDIA グラフィックドライバ 334.89以降がインストールされていること
※XPではたぶん動作しません。
まあ、もう気にしなくていいよね、XP。余命あとすこしだし。
使用可能かは設定画面で確認できます。


使用方法
ダウンロードしたら解凍して出てくるauo_setupを実行してください。
以下のものを必要なら自動でダウンロード・インストール・配置します。
・.NET Framework 4.0 Client Profile
・neroaacenc
・L-SMASH
・msvcr120.dll
・msvcp120.dll
NVEncは.NET 4.0系を使用します。ただ、通常はWindows Updateによりインストールされているはずです。
いつもの注意事項など
無保証です。自己責任で使用してください。拡張 NVEnc 出力 (NVEnc.auo)を使用したことによる、いかなる損害・トラブルについても責任を負いません。
機能・特徴等
・NVEncによる高速エンコード
・CQP / CBR / VBR モード
・インタレ保持(PAFF)エンコード
・色空間情報の指定 (H.264 VUI Info)
・自動フィールドシフト対応
・高速化
- 色空間変換のSIMD対応 (SSE2~AVX2)
- 入力バッファによるGPUへの転送レイテンシの遮蔽
・設定ファイルの保存
・QSVEncと同様に、各種音声エンコーダに対応
・音声同時変換
・エンコード一時停止
・残り時間・経過時間表示
・ログ自動保存
[非対応 & 対応予定なし機能]
・Aviutlのコピーフレーム
・Aviutlのキーフレーム
・オーディオディレイカットの「映像追加」モード
解決できていない問題
[未実装] minQP / maxQPの指定ができない問題。
…すみません、そのうち直します。
エンコードのさらなる高速化
~GPUへのデータ転送時間の遮蔽とか~
NVEncでの処理は、順に
1. Aviutlでのデコード
2. Aviutlのフィルタチェーン
3. AviutlからYUY2で受け取りNV12に変換
4. cuMemcpyHtoDにより、フレームをGPUに転送
5. GPUにエンコード命令を発行
6. GPUからの出力をファイルに書き出し
となる。で、ここでは2のフィルタは使わないとして考えてみる。
こうしたハードウェアエンコーダを使用する場合、速度は多くの場合CPUのデコード処理によって律速されてしまう。つまりエンコードの速度はいかに速くデコードし、エンコーダにフレームを渡すかにかかっている。
そこで、「4:GPUへの転送 + 5:エンコード命令発行」を別のスレッドに分け、並列に実行することにより、メインスレッドがデコード~NV12変換に専念できるようにした。やはりGPUへのフレーム転送は遅いようで、この工夫によってGPU転送のレイテンシを遮蔽し、そこそこ(10%程度)高速化できる。
GPUへデータを転送する、というコードを書くだけならまったく簡単で問題ない。ところが、GPUへの転送を別スレッドにやらせるコードを書くにはやっぱりわりと面倒。GPUへの転送CPUメモリとGPUメモリがわかれていることのデメリットがこうした工夫をしなければならないことにあると思う。AMDの言うHSAのメリットというののひとつは、統一メモリによりこうした問題がなくなってコードが書きやすくなる、ということなんだと思う。
(膨大な数の細かい独立したタスクがあって、その一部でGPUを使用するみたいな場合にはあまり気にしなくていい…つまり、やらせるタスクにもよるのだけど…)
またいつもどおり、YUY2→NV12変換はSSE2~AVX2を使用して高速化している。
設定画面 スクリーンショット

検証環境
Win7 x64
Intel Core i7 4770K @ 4.4GHz
Asrock Z87 Extreme4
GeForce GTX 660
DDR3-2600, 16GB RAM, 10-12-12-31-2
NVIDIA グラフィックドライバ 335.23
Aviutl 1.00
NVEnc 0.00 (335.23ドライバ)
QSVEnc 1.20 (3412ドライバ)
x264guiEx 2.06
x264 8bit, x64 rev2409 POP氏ビルド
ソース
この大空に、翼をひろげて FLIGHT DIARY オープニングムービー(Downloadできるやつ)
VC-1, 1280x720p, 30.00fps, 3140frmaes, 約1分45秒, 70.5MB
エンコード設定
NVEnc
CQP 28:32:35
QSVEnc
CQP 25:28:33
x264
--crf 27.3 --preset slow --psy-rd 1.0:0.2 --aq-strength 0.5
この設定で映像ビットレートとエンコード速度は
NVEnc 1480kbps (104.08 fps)
QSVEnc 1469kbps (99.46 fps)
x264 1463kbps (64.04 fps)
とだいたい1500kbps弱に合わせることができた。
エンコード速度は大きな差がないけど、この動画ではデコードが遅いのが原因。もっと高速にデコード出来る素材なら、ハードウェアエンコはもっと速くなると思う。
画質比較 (1721frame目)
わかりにくい場合は別のタブで複数の画像を開いて、タブ切り替えで比べてみてください。
オリジナル

NVEnc 1480kbps
う~ん、やや荒れ気味か。輪郭の崩れ、背景のテクスチャの潰れが気になる。

QSVEnc 1469kbps
輪郭周りがやはり微妙。背景のテクスチャは結構よく残っている。

x264 1463kbps
さすが…というべきで、背景のテクスチャも潰れずよく再現出来ている。

画質比較 (2127frame目)
オリジナル

NVEnc 1480kbps
う~ん、わりと劣化が進んでしまっている。空(青)と髪(黒)の境界付近の破綻がひどい。

QSVEnc 1469kbps
まあまあ。それなりではある。

x264 1463kbps
ここでは完璧に再現出来ているわけではないけれど、ごまかし方がうまい。

というわけで、NVEncは画質面ではすごくよい、というわけではない。というよりまあ当たり前だけど、やっぱりx264の画質(圧縮率)は圧倒的で、ハードウェアエンコは遠く及ばない。
それでも、そこそこの画質で高速にエンコードできるようなので、もしKepler/MaxwellなGPUが付いていて、興味を持ったら遊んでみてください。
ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(dropbox)からどうぞ。同じものです。
スポンサーサイト