x264のAVX2最適化

Introduction to AVX2 optimizations in x264に詳しく関数ごとの高速化率とか書いてあって面白い。2割ぐらいは速くなるのかな?

以下、Introduction to AVX2 optimizations in x264からおおまかに意味をとると、



x264は様々なデータ型を多様なSIMD命令を使って計算している。SIMDコードのうち、128bitから256bitへ素直に拡張できるのはほんの少しで、多くはもっと複雑である。64bitから128bitへの拡張した際に倍速になることがほとんどなかったように、128bitから256bitへの移行も倍速となることはほとんどないだろう。

SSE2からAVX2への移行は、MMXからSSE2への移行と似ている部分が多いけれども、いくつかの点で異なることもある。

1つは、初期のSSE2命令は遅かったりしたけど、HaswellのAVX2命令はちゃんと速いということである。
SSE2が最初に出たときは、SSE2命令が結構遅かった。初期のSSE2はMMX命令を2回(64bit×2)とSSE2を1回(128bit×1)が同速だったり、下手するとSSE2命令1回のほうが遅いなんてこともあった。この状態が解消され、MMX命令1回とSSE2命令1回がきちんと同速になるにはCore2の45nm世代までかかった。今回はそんなことはなさそうで、HaswellではAVX2命令はちゃんと速そうだ。

2つめは、AVX2命令はなんか変なことが多くて、一部のvpermdのような命令を除くと、256bitに素直に拡張したというよりは、128bit×2をやる命令、という形で拡張されている場合が多い。これによってIntelの実装は楽になるのだけど、コードを128bitから256bitに拡張するのに余計な手間がかかったりする。

3つめは、x264が256bit幅より狭いデータを扱う関数がそれなりにたくさんあって、こうしたものに対して、有効にAVX2を使うのは非常に難しかったり、不可能だったりする、ということだ。比較的複雑な関数の多くは、AVX2に移植しても予想よりあまり効果を上げられなかったりした。


多くの関数をAVX2に移植したけれども、まだ十分な最適化を行った、という段階ではないので、まだ高速化の余地はある。実際に動かしてみると、速いだろうと思っていたコードをさらに速くする方法を見つけられたりしたし、今後もそういう発見があるだろう。加えて、まだAVX2に対応できていない関数もあるので、全体としてはあと少し最適化の余地があるように思う。

加えて言えば、x264はすべてがSIMDコードというわけではなく、実行時間の半分ぐらいは普通のCのコードなため、すべてのSIMDコードが倍速になっても、x264全体としては1.33倍しか速くならない。実際にはAVX2によって倍速になることはほとんどないので、高速化率はさらに低めだろう。



で、あとは関数ごとの高速化率の一覧が書いてある。



というわけでAVX2の実装ありがとうございます。おかげで、Haswellが期待はずれに終わる、ということは無さそう。x264が対応したことで、Haswellはぐっと魅力的なものに…。うー、早く出ろ。

もうひとつ言うなら、表はHaswellにおいての「AVXまで」vs「AVX2」の比較なので、これをSandy/Ivyと比べたらもう少し高速化率に上乗せできそうな気がする。(さらに+10%ぐらい?)

あとは、256bit幅より狭いデータを扱う場合にAVX2が効果的でない、ということだけど、裏を返すと10bit版だとより高速化できるかもしれないのかな…と思う。


スポンサーサイト



コメントの投稿

非公開コメント

No title

多分7%くらいだったかと。AVX2は実装した価値はありそうですがコア増やしたほうがボトルネックなくなってよさそうな気はしますね。x264以外はまともに最適化されなそうな感じですし・・・

No title

x264関連に関しては確実に高速化するのでAVX2は大歓迎だけど、もっと劇的に高速化するのかと思ってただけにやや残念。
1.3倍でも十分といえば十分なのかも知れませんが・・・
very slowクラスでどれだけ高速になっているかが気になる。

No title

>コア数
そうですね。今度秋~冬に出るらしい6コア版は周回遅れのIvy6コアですからね…。Haswell6コアなら魅力的なんですが…。

>もっと劇的
うーん、ごもっとも。
HaswellはAVX2以外の上乗せが少ないというのも残念ですよね。IPCで+7~8%、クロックに至っては0というのがなんとも悲しい所です。
プロフィール

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対応版

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