x265エンコードにおける、AVX512 オプションの効果を調べてみた。
AVX512 オプション
AVX512 は、古くは SSEなどのSIMD拡張命令セットの一種で、
x265エンコードにおいては、AVX2 が割と効果的であることは知られている。
CPU性能が格段に向上した AMD の Ryzenなどでも
AVX2 が不得意な Zen+コアである Ryzen2000系までは
x265エンコードだけはいまいちな結果だったようだ。
# その後 Zen2/Ryzen3000系でほぼ克服したようですが。
一方、x265では v2.8 から AVX512 の利用を明示的に指定できるようになった。
AVX512 は メニコア製品群である Xeon Phi をルーツとする拡張命令セットで、
2017年以降一部の Xeonには搭載されてきたが、
core iシリーズなどの一般用は割と最近出回り始めた mobile用の IceLake が初となる。
テスト環境
- CPU: Xeon W-2155 (Skylake-X)
- x265: v3.0(2019年夏頃のコード), 10bit
-
テスト素材: 1080p のアニメ 100秒前後
-- サンプル#1:比較的よく動くオープニング、エンコード負荷が高い
-- サンプル#2:比較的静かなアバン的な箇所、エンコード負荷が低く、よく縮む
上記の2つのサンプルについて AVX512の有り、無し(AVX2まで) を比較する。
x265 でAVX512を使う場合は、
--asm avx512 を指定する(デフォルトはオフ)。
# ffmpeg などから x265 を呼ぶ時は x265-params に asm=avx512 を追加する。
エンコードオプションは #1/#2 のCRF値を除き、それ以外は全て共通。
結果
サンプル# | AVX512 | CRF | 処理速度[fps] | ビットレート[kbps] | ssim[raw/dB] |
---|---|---|---|---|---|
1 | off | 26 | 8.49 | 2590.46 | 0.9750605/16.031 |
1 | ON | 26 | 8.65 | 2589.91 | 0.9750604/16.031 |
2 | off | 27 | 21.29 | 239.76 | 0.9951872/23.176 |
2 | ON | 27 | 22.65 | 239.76 | 0.9951872/23.176 |
エンコードという観点では、AVX512の有無で等価なものができた。
処理速度は fps比 で、それぞれサンプル#1: +2%、#2: +6% だった。
x265 オフィシャルには、下記のように 4K以上での使用を推奨しており、
今回の 1080p では負荷が足りない、或いは別の箇所がネックになっているのかもしれない。
でもサンプル#2のほうが効果的というのとは若干矛盾しているような気もする。
For 4K main10 high-quality encoding, we are seeing good gains; for other resolutions and presets, we don’t recommend using this setting for now.
もう一つややこしい背景があって、いまのところ(?) AVX512 のCPU的な実装は、
その動作コストも少なくなく、AVX512 を使用すると動作周波数が上がりにくいようだ。
例えばこのページによると Xeon W-2155 で10コア全て使い切った場合の最大ターボ周波数は、
AVX2までと AVX512有りの場合でそれぞれ 3.6GHz, 3.3GHz のようだ。
10C20TでCPU使用率が45-50% に見えていたので、ほぼ10コアフルロードされており、
冷却は十分なので、少なくとも AVX2 のみ使用時は 3.6GHz で動作していることは確認した。
# AVX512 使用時の確認を失念。
AVX512 を利用しても、動作周波数が10%近く違ってはその恩恵は見えにくいのかもしれない。
Intel の大本営発表でも、x265 への効果は状況によって異なるが最大 +10% 程度のようである。
また、その手の性能比較サイトでは動作周波数をロックして比較した記事も散見した。
でも、周波数ロックして性能を犠牲 or OCして出た数字にはあまり意味がないように思える。
自分でやってみた感想としては、今の所 x265 への AVX512 の恩恵は非常に限定的と言える。
少なくとも悪さしているようには見えない、そんな感じだった。