HaswellとIntel Media SDK 2013
これまでのHaswell
Haswellそのいち。 - ついに来たHaswell
Haswellそのに。 - Haswellでx264エンコードほか
Haswellそのさん。 - Haswellでオーバークロック
Haswellそのよん。 - HaswellでQSV
この前書いたとおり、HaswellでQSVEncCを使うと同じ設定でもIvyより遅くなってしまう。GPUの演算力は大幅に向上しているはずで、かなり不可解な結果になっている。また、QSV実行中はBoostのかかった1200MHzの状態を維持できていたので、Boostのかかり具合の問題ではない。
ただ、テストとしてはちょっと簡単すぎるものなので、もう少しいろいろ試した方がいいとは思う。ご指摘をもらったのだけど、おっしゃってることはもっともで、別のソースやCQP以外のモードでもためしてみるべきかもしれない。
一方、ソフトウェア面のチューニングも必要な可能性が高い。
そこで、HaswellでのQSVと、新しくIntelから出ているIntel Media SDK 2013の更新内容についていろいろと。
Haswellで追加されたとされているもの (QSV関連)
後藤弘茂のWeekly海外ニュース - 次世代CPU「Haswell」の2倍強力なGPUコア
IDF 2012 - 次期Intel Core「Haswell」の内部構造を探る - Uncore(GPU/Media Block)編
このへんを参考にして見ていくと、HaswellでQSVに関係有りそうな変更としては、
・GPUの強化(演算性能の向上、DirectX 11.1対応)
QSVの速度にも効果あるかと。まあご存知かとは思うけど、こちらのPhoto 23にあるように、QSVはすべてハードウェアで行なっているのではなく、GPU EUとハードウェア回路を組み合わせた実装となっている。レート制御、動き探索、イントラ予測、イントラ・インターモード決定などはGPU EUで行われているようだ。なので、GPUの演算力は重要だし、ひいてはメモリ速度も重要になってくる。
これにより、柔軟性を維持しつつ(つまりある程度はドライバなどで拡張可能)、パフォーマンスを発揮できる、ということらしい。確かにドライバでなんとかなるかも…という期待もできなくはない。ただ、そのドライバも残念なことが多いのだが…。
・MPEG2エンコードのサポート
MPEG2エンコ、Haswellからだみたいなこと書いてあるけど、Sandy/Ivyでもできるはず…。QSVEncはその機能を使用してないだけで。
・MJPEGエンコードのサポート
・画質の向上
一番期待したいところ。現状QSVは高速だけど、どう設定しても高圧縮・高画質は達成できない。
・Video Qualtiy Engineの追加
たぶんフィルタリング処理のハードウェアあるいはGPU EUを使用する実装。
ノイズ除去
インタレ解除
Film mode detection
肌色検出
肌色補正
色調制御
適応的コントラスト補正
高品質拡大・縮小
ガンマ補正
フレームレート変換
Image Stabilization (ぶれ補正)
ガンマ補正
などが列挙されている。主にカメラで撮影された映像に対して行う処理系で、ウェブカメラ等での撮影をリアルタイムで処理するとか、そういうことを対象にしているんだと思う。
Intel Media SDK 2013 (API v1.6)で追加されるものの詳細
Intel® Media Software Development Kit 2013 Release Notes より。
・JPEG/MJPEGエンコードを追加。
Haswell新機能のやつ。ちなみにJPEG/MJPEGデコードの方はAPI v1.4から対応していたと思う。
・H.264/AVC Level 5.2のサポート。
・H.264 intra refresh(周期的イントラ更新)のサポート?
正直intra refreshがなんなのかあまりよくわかっていないのでなんとも。
・レート制御の拡張 その1 MBBRC
マニュアルには、「マクロブロックレベルのレート制御を行い、心理視覚的な画質を向上させる一方、(PSNR・SSIMのような)客観的画質とエンコード速度がやや低下するだろう。」とある。
・レート制御の拡張 その2 ExtBRC
マニュアルには、「レート制御を拡張し、心理的・客観的な画質を向上させる。しかし、エンコード速度がそれなりに低下し、またH.264のHRDに違反した出力になるかもしれない。」とある。
・VPP(フィルタリング)の拡張
Haswell新機能で出てきたブレ補正(Image Stabilization)と高品質拡大縮小。
レート制御の拡張は画質的に期待できそうな一方、やっぱダメみたいなオチもありそうで、実際Haswellを触ってみなきゃわからんところがある。個人的にはビットレート指定よりも品質一定系のレート制御の拡張をしてほしいものだが…?
マニュアルを見る限り、相変わらずあまり細かい設定はできなさそうだ。
現状QSVは、
・全体的に画質が悪い、特に実写だとディテールが相当潰れやすく、アニメだと輪郭付近やグラデーションなどが相当破綻する。
・実はIフレームの品質がそもそも悪いような…。
・適応的フレーム決定ができす、GOP構造は常に固定。0.15からQSVEncはシーンチェンジ検出させてるけど、あれはあくまで「任意のフレームをキーフレームにする」機能を使って、わたしが書いた謎コードでシーンチェンジ検出をしている。できればQSV(GPU側)でもっと高速にやって欲しいところ。
・ビットレート指定は使いにくいが、かといってCQPは動きが激しい動画などで容量膨れすぎ…
みたいな欠点があるけど、どうだろう。
また、これはQSVEncの課題だが、メモリ帯域が逼迫している…という問題。Haswellは相変わらずのDual-Channel DDR3なので、メモリ帯域の大幅な向上は見込めないし、公開されているベンチ等を見てもメモリアクセス速度は向上していない。Intelのここ最近のGPU強化路線からすると、メモリ帯域の向上は有効であるはずなので、なんとかならんものか。Quad Channel…は消費電力とかコストとかがやっぱり厳しいのかなあ。まあそもそも帯域よりもレイテンシの問題かもしれないけど。
そこでeDRAM、将来はTSVなんだろうけど、じゃあIrisちゃんをデスクトップにもおくれよ…。
最適化の余地は?
まず、新API v1.6への対応。ただこれによって速度が上がるとは思えない。
速度的に変わるかもしれないと思うのは、以下の2点。
・D3D11への対応
GPU側のメモリ確保に、DirectX系を使っているようなのだが、現在はDirectX9ベースとなっている。SampleプログラムにDirectX11系を使うサンプルがあるので、これを取り込む。
正直DirectXとかはよくわかっていないので、これがどういった効果があるかわからないけど、とりあえずやってみようと思う(サンプルプログラムのやつを取り込むだけのはずだし)。
・YUY2/YV12→NV12変換の修正等
まあ色変換といいつつメモリコピーのようなもんだけど、これをAVX2に対応させると速くなるかもしれない。たいして重い処理でもないので期待できないけど。
まあこんなところかなと。
でもその前に、もう少しいろいろなケースで測ってみて、本当に遅くなっているのか、遅くなっているならどこで遅くなっているのかを探るのが先だとは思う。
とりあえず今はafs + AVX2で苦戦してるので、QSVはそのあと?
追加機能も多そうなので、それなりに時間がかかると思う。
Haswellそのいち。 - ついに来たHaswell
Haswellそのに。 - Haswellでx264エンコードほか
Haswellそのさん。 - Haswellでオーバークロック
Haswellそのよん。 - HaswellでQSV
この前書いたとおり、HaswellでQSVEncCを使うと同じ設定でもIvyより遅くなってしまう。GPUの演算力は大幅に向上しているはずで、かなり不可解な結果になっている。また、QSV実行中はBoostのかかった1200MHzの状態を維持できていたので、Boostのかかり具合の問題ではない。
ただ、テストとしてはちょっと簡単すぎるものなので、もう少しいろいろ試した方がいいとは思う。ご指摘をもらったのだけど、おっしゃってることはもっともで、別のソースやCQP以外のモードでもためしてみるべきかもしれない。
一方、ソフトウェア面のチューニングも必要な可能性が高い。
そこで、HaswellでのQSVと、新しくIntelから出ているIntel Media SDK 2013の更新内容についていろいろと。
Haswellで追加されたとされているもの (QSV関連)
後藤弘茂のWeekly海外ニュース - 次世代CPU「Haswell」の2倍強力なGPUコア
IDF 2012 - 次期Intel Core「Haswell」の内部構造を探る - Uncore(GPU/Media Block)編
このへんを参考にして見ていくと、HaswellでQSVに関係有りそうな変更としては、
・GPUの強化(演算性能の向上、DirectX 11.1対応)
QSVの速度にも効果あるかと。まあご存知かとは思うけど、こちらのPhoto 23にあるように、QSVはすべてハードウェアで行なっているのではなく、GPU EUとハードウェア回路を組み合わせた実装となっている。レート制御、動き探索、イントラ予測、イントラ・インターモード決定などはGPU EUで行われているようだ。なので、GPUの演算力は重要だし、ひいてはメモリ速度も重要になってくる。
これにより、柔軟性を維持しつつ(つまりある程度はドライバなどで拡張可能)、パフォーマンスを発揮できる、ということらしい。確かにドライバでなんとかなるかも…という期待もできなくはない。ただ、そのドライバも残念なことが多いのだが…。
・MPEG2エンコードのサポート
MPEG2エンコ、Haswellからだみたいなこと書いてあるけど、Sandy/Ivyでもできるはず…。QSVEncはその機能を使用してないだけで。
・MJPEGエンコードのサポート
・画質の向上
一番期待したいところ。現状QSVは高速だけど、どう設定しても高圧縮・高画質は達成できない。
・Video Qualtiy Engineの追加
たぶんフィルタリング処理のハードウェアあるいはGPU EUを使用する実装。
ノイズ除去
インタレ解除
Film mode detection
肌色検出
肌色補正
色調制御
適応的コントラスト補正
高品質拡大・縮小
ガンマ補正
フレームレート変換
Image Stabilization (ぶれ補正)
ガンマ補正
などが列挙されている。主にカメラで撮影された映像に対して行う処理系で、ウェブカメラ等での撮影をリアルタイムで処理するとか、そういうことを対象にしているんだと思う。
Intel Media SDK 2013 (API v1.6)で追加されるものの詳細
Intel® Media Software Development Kit 2013 Release Notes より。
・JPEG/MJPEGエンコードを追加。
Haswell新機能のやつ。ちなみにJPEG/MJPEGデコードの方はAPI v1.4から対応していたと思う。
・H.264/AVC Level 5.2のサポート。
・H.264 intra refresh(周期的イントラ更新)のサポート?
正直intra refreshがなんなのかあまりよくわかっていないのでなんとも。
・レート制御の拡張 その1 MBBRC
マニュアルには、「マクロブロックレベルのレート制御を行い、心理視覚的な画質を向上させる一方、(PSNR・SSIMのような)客観的画質とエンコード速度がやや低下するだろう。」とある。
・レート制御の拡張 その2 ExtBRC
マニュアルには、「レート制御を拡張し、心理的・客観的な画質を向上させる。しかし、エンコード速度がそれなりに低下し、またH.264のHRDに違反した出力になるかもしれない。」とある。
・VPP(フィルタリング)の拡張
Haswell新機能で出てきたブレ補正(Image Stabilization)と高品質拡大縮小。
レート制御の拡張は画質的に期待できそうな一方、やっぱダメみたいなオチもありそうで、実際Haswellを触ってみなきゃわからんところがある。個人的にはビットレート指定よりも品質一定系のレート制御の拡張をしてほしいものだが…?
マニュアルを見る限り、相変わらずあまり細かい設定はできなさそうだ。
現状QSVは、
・全体的に画質が悪い、特に実写だとディテールが相当潰れやすく、アニメだと輪郭付近やグラデーションなどが相当破綻する。
・実はIフレームの品質がそもそも悪いような…。
・適応的フレーム決定ができす、GOP構造は常に固定。0.15からQSVEncはシーンチェンジ検出させてるけど、あれはあくまで「任意のフレームをキーフレームにする」機能を使って、わたしが書いた謎コードでシーンチェンジ検出をしている。できればQSV(GPU側)でもっと高速にやって欲しいところ。
・ビットレート指定は使いにくいが、かといってCQPは動きが激しい動画などで容量膨れすぎ…
みたいな欠点があるけど、どうだろう。
また、これはQSVEncの課題だが、メモリ帯域が逼迫している…という問題。Haswellは相変わらずのDual-Channel DDR3なので、メモリ帯域の大幅な向上は見込めないし、公開されているベンチ等を見てもメモリアクセス速度は向上していない。Intelのここ最近のGPU強化路線からすると、メモリ帯域の向上は有効であるはずなので、なんとかならんものか。Quad Channel…は消費電力とかコストとかがやっぱり厳しいのかなあ。まあそもそも帯域よりもレイテンシの問題かもしれないけど。
そこでeDRAM、将来はTSVなんだろうけど、じゃあIrisちゃんをデスクトップにもおくれよ…。
最適化の余地は?
まず、新API v1.6への対応。ただこれによって速度が上がるとは思えない。
速度的に変わるかもしれないと思うのは、以下の2点。
・D3D11への対応
GPU側のメモリ確保に、DirectX系を使っているようなのだが、現在はDirectX9ベースとなっている。SampleプログラムにDirectX11系を使うサンプルがあるので、これを取り込む。
正直DirectXとかはよくわかっていないので、これがどういった効果があるかわからないけど、とりあえずやってみようと思う(サンプルプログラムのやつを取り込むだけのはずだし)。
・YUY2/YV12→NV12変換の修正等
まあ色変換といいつつメモリコピーのようなもんだけど、これをAVX2に対応させると速くなるかもしれない。たいして重い処理でもないので期待できないけど。
まあこんなところかなと。
でもその前に、もう少しいろいろなケースで測ってみて、本当に遅くなっているのか、遅くなっているならどこで遅くなっているのかを探るのが先だとは思う。
とりあえず今はafs + AVX2で苦戦してるので、QSVはそのあと?
追加機能も多そうなので、それなりに時間がかかると思う。