QSVEncの強いメモリ速度依存性

正直びっくりした。

QSVEncはメモリ速度に結構左右される、とは思っていたけど、これほどまでとは…。






ふと、QSVEncの速度がメモリの速度に左右されやすいのではないか、と思い至った。

調べてみると、
4.gamers - Ivy Bridge基礎検証。CPUの基本性能やGPGPU性能などから,Sandy Bridgeとの違いを徹底的に探ってみるのグラフ11などで、QSVにメモリ速度が関係あるかもしれない、ようなことが指摘されている。

そこで、実際に測ってみた。



環境



Win7 x64
Intel Core i7 3770K (4C/8T / 3.9GHz)
HD Graphics HD4000 @ 1150MHz
DDR3-xxxx 16GB Dual-Channel
(G.Skill F3-2133C9Q-16GAB)

Aviutl 0.99m
m2v.aui 0.7.5a
lsmashinput.aui 自ビルド (別に変わったことはしてないです)
QSVEnc 0.08
Intel HD Graphics 2761ドライバ

Aviutlのフィルタは無し
MPEG2 1440x1080i 29.97fps 10000frame

QSVEnc設定
品質: Quality
CQP: 24:26:27
Vpp: インタレ解除(通常)

この環境・設定で、
DDR3-1066 (17.1GB/s) [8-8-8-20] 1.40V
DDR3-1333 (21.3GB/s) [9-9-9-24] 1.40V
DDR3-1600 (25.6GB/s) [9-9-9-24] 1.40V
DDR3-1866 (29.9GB/s) [9-11-10-28] 1.50V
DDR3-2133 (34.1GB/s) [9-11-10-28] 1.62V
と変化させ、エンコード速度を測った。

また、比較のため、
x264 r2216 x64
x264guiEx 1.58
でも測った。
インタレ解除はAviutlの「自動」、
x264は--crf 23 --slow
という設定。



結果



まずはx264のエンコードから。デコーダはlsmashinput.aui。
QSVEnc_memory_02
こんな感じで、メモリ速度が速いほどエンコードも高速化するけど、さほど大きな差ではない。ふつう、メモリの速度はこんな感じであまり実行速度に影響しない。Aviutlでフィルタをかけたり、10bit版x264を使ったり、x264をもっと重い設定にするともっと差は縮まる。

DDR3-2133のメモリとかは相変わらず高いので、コストパフォーマンス的には微妙なところ?

今度はQSVEnc、QSVなのでそこそこ高速。こちらはlsmashinput.auiでデコードした場合m2v.auiでデコードした場合の両方を測った。
QSVEnc_memory_01

これほどまでとは…。

DDR3-1066からDDR3-2133へと2倍にする間に、エンコード速度は1.7倍になっている。

また、メモリ速度を上げていくとデコーダの速度差が効いてくるのも面白い。m2v.auiもlsmashinput.auiもデコード専用にスレッドを立てるけれども、m2v.auiは1スレッドなのに対してlsmahsinput.aui(というか内部のlibavcodec)はマルチスレッドなので、その差が出てくるんじゃないかと思う。

こうなってくると高いメモリ買ったかいもあるというもの…?



どうしてこうなった…?



基本的にCPUからするとメモリアクセスというのはかなり"遅い"操作になっていて、それをなんとかするためにL1/L2/L3の3段階のキャッシュがついている。

こちらのグラフ14やらグラフ15を見れば分かる通り、キャッシュ領域(~8MBまで)に比べ、メモリ領域(16MB超)のレイテンシは10倍以上、帯域は1/10以下だ。つまり、キャッシュ内に収まるデータについての計算やメモリコピーは高速で、メモリの速度は処理速度にあまり影響しないのだけど、キャッシュからあふれ始めると処理が遅くなり、またメモリ速度が処理速度に大きく影響するようになる。

そしてQSVEncでエンコ中は大容量のメモリアクセスを頻発させてしまう。

QSVEncで出力中のAviutlのおおまかな処理の流れはたぶんこんな感じ…。なんか間違ってたら教えてください。

QSVEnc_memory_03

GPU EUというのはGPUの実行ユニット、MFXというのがいわゆるQSV固定ハードウェアのこと。

実線矢印を追えば処理の流れがわかり、破線も含めて矢印の色ごとにループを追えば、主な3つのループの動きがわかる…えと、わかる…よね? え、わかりにくい? すいません。

ここで、QSVというのはIntel iGPUにあるので、CPUメモリからGPUメモリへのコピーが発生し(物理的には同じメモリーだが、メモリコピーは発生する)、またVpp処理やエンコードのStage1(動き探索等)はGPU EUで行うため、このへんでも相当なメモリアクセスが発生するようだ。加えてAviutl側のメインループもx264エンコ時などよりはずっと高速に回るため、キャッシュを食い合い、メモリアクセスを乱発させる、ということになってるんじゃないかな…と予想できる。

つまり、高速で処理される結果、x264エンコ時と比べてメモリアクセスの頻度が相対的に大きくなって、メモリ速度が大きく影響するようになっているのだと思う。



ところで、さっきの記事ではSandyでは差が見られない、という話だった。

記事には、IvyBridgeからメモリコントローラが改善されていることが理由なのではないか、と書かれている。個人的にはそれに加えてGPU Boostの影響もあるかもしれないと思う。

SandyBridgeではIvyBridgeと比べるとGPU側のBoostがかかりにくかった記憶がある。そのため、メモリの速度云々以前の問題として、GPU Boostがかからないことも速度的に問題になっているかもしれないと思った。(GPUが通常駆動のままだとさすがに遅いです)
スポンサーサイト



コメントの投稿

非公開コメント

拡張QSV出力でBD規格のH264エンコード

こんにちは。いつも「x264guiEx」や「拡張 QSV 出力」を使用させていただいている者です。

コメントのタイトルにも記したままの質問なのですが、現状ではAviutlを用いた「拡張QSV出力」で、Blu-ray規格にそったH264の書き出しはできないのでしょうか?

拡張X264出力の方では、Blu-ray互換エンコードがオプションの調整で可能になっていますが、QSV出力の方では実装が難しいのでしょうか...。

QSV出力でのオプション設定もBlu-rayの標準に合わせた(近づけた)のですが、tsMuxeRでBDディスクを構築後、BDレコーダーで再生できませんでした。
映像のブロックノイズが酷く、見れませんでした。(ブロックノイズというよりか、TSがドロップした際のような乱れでした。)

Adobe EncoreでもH264ファイルが読み込みの際に弾かれた(X264でのBD準拠エンコードしたファイルは読み込まれます)ので、オプション等の設定の問題なのでしょうか。

QSVや映像フォーマットに関してそこまで知識を持ち合わせていない者ですので、失礼な質問でしたら申し訳ありません。


:パソコン環境:
OS:Win 7 x64
CPU:i7 3770 BOX (Z68環境)
MEM:DDR3-1333 (4GBx2)
Aviutl、拡張QSV出力 共に最新バージョン

再生に使用したBDレコーダー
SONY BDZ-T50(結構古い型です)

Re: 拡張QSV出力でBD規格のH264エンコード

おっしゃるとおり、現状QSVEncはBluray規格の出力に必要な実装をしていないため非対応となっています。対応できるかどうかは怪しいです。

また、対応できたとしても限定的なものとなってしまいます。一番問題なのが、CQPモードではどうやってもBluray向け出力はできないという点です。これは、CQPモードではBluray互換出力時に必要な上限ビットレート設定ができないためです。なのでVBRモードを使っていただく事になるかと思います。

とりあえず実装して試してみますので、お待ちいただければと。正直Blurayに詳しくないので…。

…うまくいくといいのですが。

Re: 拡張QSV出力でBD規格のH264エンコード

ありがとうございます。

Blu-rayの規格に沿うことになるので、エンコード条件が限定的になってしまうのはやはり仕方のないことですよね。PCと違って、BDレコーダーとなると、規格に厳密すぎるので...汗

CQPモードの品質基準エンコードでビットレート指定できない事は承知しております。

規格もH264とx264では厳密には違う上に、ハードウェアエンコードで、QSV自体も完全に安定しているわけでないので、対応は難しいと思いますが
可能なようでしたら、限定的な条件でも構いませんのでよろしくお願いします。
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

rkmppenc
- Rockchip系SoCのhwエンコーダ

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR