English version of changelog>>NVEnc 4.33・[x64版のみ] CUDA 10.1に移行。
・3つめのインタレ解除フィルタを追加。(--vpp-nnedi)
・Turing世代のGPUが2倍のコア数として表示されてしまっていたのを修正。NVEnc 4.34 [2019.03.21 0:00更新]・x64版でnppライブラリを使用するフィルタ(resizeアルゴリズムの一部やノイズ除去の一部)が使えなくなっていたのを修正。CUDA更新に伴い、npp*_10.dllが必要です。これらのdllも別のアーカイブで用意したので、必要な場合はこれらもダウンロードしてください。
・--helpに--vpp-nnediについて追記。
CUDA 10.1に移行 (x64のみ)
これまでずっとCUDA 8.0を使ってきたのだけど、Turingでfp16を使用するため、CUDA 10.1に移行した。fp16演算対応自体はCUDA 9から行われているが、fp16の演算を普通の記号(+-*/とかの演算子)で書くことができず、いちいち組み込み関数を使用する必要があったり、CPU側でfp16を取り扱うことができないなど、やたらと不便だった箇所がCUDA 10では見事解消されている。
なお、後にも書いたけど、CUDA 9.0以降はなぜかVisual Studio 2015環境下でのx86ビルドに対応していなくて、そのためx86版はCUDA 8.0のままとしている。
3つめのインタレ解除フィルタの追加
NVENCでは、Turing世代になってH.264のインタレ保持エンコが省略されてしまい、インタレ保持でのエンコードができなくなっているので、基本的にはQSVかx264でインタレ保持エンコするか、あるいはNVENCを使うならインタレ解除してエンコードするしかない。
NVEncにはインタレ解除フィルタとして、
・cuvidのhwインタレ解除
・vpp-afs (自動フィールドシフト)
があるのだけど、cuvidのhwインタレ解除はhwデコード時しか使えないし、自動フィールドシフトのほうはそれなりにくせがあるので、もう一つぐらい選択肢があってもいいのかなと思って、3つめのインタレ解除フィルタとして、nnediをCUDAで実装して追加した。
nnediは、基本的には片方フィールドは捨てて、もう片方のフィールドからニューラルネットを使って輪郭を補正しながらフレームを再構築することでインタレ解除するフィルタ。一般に高品質だといわれている。
一方で比較的重めのフィルタとされていて、最初CUDAで普通に実装したら1フレームに100ms以上かかって8fpsとかしか出なかった…。そこから最適化をいろいろ頑張ってだいぶ速くなり、Turing世代ならfp16が使えるのもあって、それなりの速度は出せるようになってきた。
実装できたのはCPU版の一部の機能で、すべての機能ではないのだけど、かなり疲れてきた(主に高速化のために無駄に複雑化した実装のせいだが…)のでひとまず公開。詳細は
こちら。
環境 GPU | GTX1080 | GTX1060 | RTX2070 |
GPUドライバ | 419.35 |
OS | Win10 x64 |
CPU | R7 1700 | i9 7980XE |
RAM | DDR4-2400, 2ch | DDR4-3600, 4ch |
| 16GB | 16GB |
入力: ts 1920x1080i, 29.97fps, 10240frame (hwデコード)
出力: HEVC 1080p, 29.97fps
実行コマンド:NVEncC64.exe --avhw -c hevc --cqp 18:20:23 --audio-copy --tff --vpp-perf-monitor --vpp-nnedi prescreen=[下の表を参照],prec=<fp16/fp32>,nsize=32x4,nns=32
vpp-perf-monitorによる1フレーム当たりの平均処理時間 (ms) prescreen | format | GTX1060 | GTX1080 | RTX2070 |
fp32 | fp32 | fp32 | fp16 |
new_block | yuv420 8bit | 5.18 ms | 2.69 ms | 2.21 ms | 1.11 ms |
yuv420 10bit | 6.00 ms | 2.85 ms | 2.22 ms | 1.17 ms |
none | yuv420 8bit | 13.79 ms | 6.50 ms | 6.96 ms | 3.14 ms |
yuv420 10bit | 15.20 ms | 7.22 ms | 7.13 ms | 3.19 ms |
やはり、もともと重めなフィルタだけあって、GTX1060などだと完全にフィルタのほうが足を引っ張ってしまい、hwエンコーダに十分な速度でフレームを提供できなくなってしまって、あまり嬉しくない感じ。
一方、Turingで使えるfp16はfp32と比べて理論的には倍速で計算できるので、それ専用に実装してみると、やはりかなり速く、hwエンコードの速度にそれなりについていけるように思う。RTX2070だから速いというのもあるけど、Turingならfp16は使えるはずなので、GTX1660ぐらいでもそこそこ速度が出るのではないだろうか?
まあ、nns/nsize等いじればいくらでも重くできるのがこのフィルタの怖いところ。デフォルトのパラメータは、hwエンコに適するよう比較的軽めのものにしてある。
なお、Turingであってもfp16が使えるのはx64版だけな点に注意。これは、fp16に対応しているCUDA 9.0以降がなぜかVisual Studio 2015環境下でのx86ビルドに対応していないためなので、すみませんがどうしようもないのです…。
もっともAviutlでもエンコーダはプロセスを分けているので、普通にx64 OSなら特に問題はない気もする。
Q: 24fps化したい場合は?
A: たぶんできないで、そちらはvpp-afsでお願いします。
Q: Tensorコアでもっと速くなる?
A: うまく使えばきっと速いのだろうけど、実装が大変そうなのと、GTX1660Ti以下で恩恵がない実装になるのがちょっと…。将来、下位シリーズまでTensorコアが展開されていけばうれしいけど…。
その他不具合・要望等ありましたらコメントください。
ダウンロード>>ダウンロード (ミラー) >>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。同じものです。NVEncCのオプションについてはこちら。
NVEncCオプション一覧>ソースはこちら>>