・起動速度をわずかに高速化。・--caption2assが使用できなかったのを修正。・OpenCLの情報を表示するオプションを追加。(--check-clinfo)
OpenCLによるGPUの認識状況の確認用。
・--vpp-smoothでquality=0のときにはprec=fp16を使用できないので、自動的にprec=fp32に切り替え。・ログの各行に時刻を表示するオプションを追加。(--log-opt addtime)
QSVEnc ダウンロード>>ダウンロード (ミラー) >>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。同じものです。QSVEncBenchmark.zipはベンチマーク用です。(重いので注意)。run_benchmark.batをダブルクリックで実行です。
QSVEncCのオプションについてはこちら。
QSVEncCオプション一覧>ソースはこちら
起動速度の高速化
QSVEnc 6.00以降、こころなしか起動が遅くなってそうだったのでちょっと調べてみた。
試したオプションはこんな感じで、起動・初期化の時間がわかりやすいように、10フレームだけエンコードしてすぐ終了するようにした。なお、初回実行時は実行ファイルやモジュール(dll)のディスクからのロード時間が影響するので、2回目以降で計測。
-i input.ts -o test.mp4 --tff --vpp-deinterlace normal --vbr 6000 --max-bitrate 15000 --output-res 1280x720 --audio-codec aac --audio-stream stereo --trim 0:10
i7 11700K上でIntel VTuneで調べるとこんな感じ。初期化(Init)に1.526s。ちょっと長いかなあ…
Initの内訳を展開していって確認すると、4か所あるInitSession~系の関数がそれぞれ0.2~0.5s前後喰っていて、これが遅いことがわかる。
・情報取得用
・デコード用
・エンコード用
・フィルタ用
のsession初期化があるので、4回呼ぶのはまあよいのだけど、にしても遅い。
さらに展開していって、中でなにやってるの? を見たのがこちら。
どうもLoaderCtxVPL::FullLoadAndQueryというのが遅いらしい。4回のInitSessionで毎回呼ばれていた。
そもそもsessionの初期化というのはどうやって行うかというと、下のようにVPLの関数を呼ぶ。これをsession初期化のたびに行っていた。
mfxLoader loader = MFXLoad(); // まずloaderを作る
auto cfg = MFXCreateConfig(loader); // このcfgを介して起動するsessionの設定ができる
mfxSession session;
MFXCreateSession(loader, 0, &session); // 実際のsessionの初期化
LoaderCtxVPL::FullLoadAndQueryというのはVPLの関数で、なんかデバイスのいろんな情報の取得をやっているみたい。
VPLの周辺のコードを確認して、なんとかLoaderCtxVPL::FullLoadAndQueryを呼ばないようにしたり、その回数を抑えたりできないか調べたら、毎回MFXLoad()でmfxLoaderを作るのではなくて、これを使いまわすことでFullLoadAndQueryは初回のみの実行で済み、以降は実行されないようにできることがわかった。
というわけでmfxLoaderを使いまわすように変更したQSVEnc 6.03のVtuneでの分析結果がこちら。
初期化にかかる時間が1.526s → 0.469sと大きく高速化された。
内訳を確認するとこんな感じ。一番上のInitSessionを除き、他の3回のInitSessionに要する時間が大幅に削減されていて、ほとんど気にならないぐらいの時間となっていて、これが高速化につながっているとわかる。
InitSessionの内訳も確認。
最初の時間がかかっているほうのInitSessionではLoaderCtxVPL::FullLoadAndQueryが初回の呼ばれているが、その次のInitSessionではLoaderCtxVPL::FullLoadAndQueryが呼ばれなくなっていて、そのぶんの時間がごっそり無くなって速くなっている。
というわけでQSVEnc 6.03では起動を1秒弱と、まあ実感できるか怪しいぐらいのたいしたことは時間でしかないけど高速化することができた。
VTuneを使うと、どこで時間がかかっているのかを分析してくれるので、なんか遅いなとか、速くしたいなと思ったときに、どこをターゲットにしていけばよいのか絞り込みやすく、なかなか重宝する。あとGUIでわかりやすくすぐ表示してくれるのもありがたい。gprofとかのCUI系のツールは慣れてないせいか見るのちょっとしんどい…
QSVEncの起動速度は、今回よりももっと遅くなるケースがあって、OpenCLのフィルタとかを使うとあちこちでOpenCLのkernelのコンパイルを行ってこれが結構時間がかかってしまう。これはどうしたらいいのか…。
スレッドを別に立てて、バックグラウンドでコンパイルすればいいのかもだけどちょっと実装が面倒そう…(特にエラー処理が)。