インテル® AVX-512 で x265 を高速化

この記事は、インテル® デベロッパー・ゾーンに公開されている「Accelerating x265 with Intel® Advanced Vector Extensions 512 (Intel® AVX-512)」の日本語参考訳です。


この記事の PDF 版はこちらからご利用になれます。

はじめに

目的

CPU のベクトルユニットは、メディアの高速化と SIMD (Single Instruction, Multiple Data) を利用して並列処理を行うその他のカーネルの事実上の標準となっています。1 ベクトルユニットは、単一のレジスターファイルを、合計幅がベクトル・レジスター・ファイルの幅と等しい複数のレジスターの組み合わせとして扱うことができます。そのため、単一命令でこのベクトルレジスターのすべてのデータを並列に操作して、このパターンに一致するデータアクセスを持つアプリケーションを大幅にスピードアップすることができます。インテル® MMX® テクノロジーにより拡張されたアーキテクチャーで 8 ビット・レジスターとして扱われる 64 ビット・ベクトル・レジスター・ファイルから、インテル® アーキテクチャー・プロセッサー上の SIMD では、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) とインテル® AVX2 世代の 32 個の並列 8 ビット操作が可能な 256 ビット・レジスター・ファイルに進化しました。

メディア・ワークロードのカーネルは、同じ操作 (例えばフィルタリング) がフレームの複数のピクセルに一様に適用されるため、この実行パターンに自然に合致します。そのため、いくつかの主要なオープンソース・プロジェクトではコードの高速化に SIMD 命令を活用しています。AVC (Advanced Video Coding) エンコードの x264 プロジェクト2 と HEVC (High Efficiency Video Coding) エンコードの x265 プロジェクト3 は、広く利用されているメディア・ライブラリーであり、インテル® MMX® テクノロジーからインテル® AVX2 まで、インテル® アーキテクチャー・プロセッサー上の複数世代の SIMD を活用しています。図 1 に示すように、x264 と x265 は SIMD コードを使用しないベースラインと比較して、それぞれ 2 倍と 5 倍のスピードアップを達成しています。HEVC のほうが AVC よりもフレーム当たりの作業量がはるかに多いため、x265 エンコーダーのほうが x264 よりもインテル® AVX2 から大きなパフォーマンス・ゲインが得られます。4

パフォーマンス・ゲインの比較を示すグラフ
図 1. インテル® Core™ i7-4500U プロセッサー上で Main プロファイルの 1080p エンコードにインテル® AVX2 を使用した場合の x264 と x265 のパフォーマンス・ゲイン

この記事の焦点

最近リリースされたインテル® Xeon® スケーラブル・プロセッサー (開発コード名 Purley) は、インテル® AVX-512 命令セットを採用しています。5 インテル® AVX-512 命令は、インテル® AVX2 と比較して、同じサイクル数で 2 倍の操作を実行することができます。このスループットを達成するため、より多くのダイ面積が利用されており、その結果、前世代の SIMD ユニットよりも消費電力が大きくなっています。そのため、特定のインテル® AVX-512 命令は、ほかの命令よりも CPU のクロック周波数低下幅が大きくなることが予想されます。6 このクロック周波数の低下は、インテル® AVX-512 命令のスループットによって相殺されますが、メディアカーネルは引き続き古い世代 の SIMD 命令 (すべてのカーネルがより広い幅によって利点が得られるわけではないため) と SIMD 変換に適していない単純な C コードに大きく依存するため、パフォーマンスが低下する可能性があります。

この記事は、インテル® AVX-512 の SIMD 命令を使用して x265 の計算負荷の高いカーネルを高速化した取り組みを紹介するケーススタディーです。エンコーダー全体のパフォーマンスを向上するため、CPU 周波数の低下を相殺する方法を説明します。この過程を通じて、HEVC エンコードの x265 でインテル® AVX-512 の使用が推奨される場合を示します。また、メディアカーネルを高速化する手段としてインテル® AVX-512 を選択する際の経験則を共有します。

主な取り組み

メディアカーネルでインテル® AVX-512 を使用する場合、微妙なバランスが必要となります。我々の経験から、次のことを推奨します。

  • インテル® AVX-512 で高速化可能なカーネルを選択する際は、計算とメモリーの比率を考慮すべきです。この比率が高い場合、インテル® AVX-512 の使用を推奨します。また、インテル® AVX-512 を使用する場合、キャッシュライン境界をまたぐロードを回避するため、バッファーを 64B にアライメントします。
  • デスクトップ SKU とワークステーション SKU (例えば、テストに使用したインテル® Core™ i9-7900X プロセッサー) では、CPU クロック周波数の低下がわずかであるため、すべてのエンコーダー構成でインテル® AVX-512 カーネルを有効にできます。
  • サーバー SKU (例えば、テストに使用したインテル® Xeon® Platinum 8180 プロセッサー) では、アクティブなコア数に比例して、周波数の低下幅が大きくなります。そのため、インテル® AVX-512 では、クロックサイクルの利点が周波数のペナルティーを相殺することで、エンコーダーのパフォーマンスを向上できる、ピクセルごとの計算量が多い場合にのみ有効にすべきです。

具体的には、Main10 プロファイルで slower または veryslow プリセットを使用して 4K コンテンツをエンコードする場合にのみインテル® AVX-512 を使用することを推奨します。その他の設定 (解像度/プロファイル/プリセット) では、エンコーダーのパフォーマンスに影響する可能性があるため、インテル® AVX-512 カーネルの使用は推奨しません。

この記事で紹介する結果と推奨事項は、評価や実験的近似に限定されず、コミュニティー全体がインテル® AVX-512 を使用してメディア・ワークロードを高速化する利点を理解するのに役立つでしょう。

「背景情報」セクションでは、この記事で紹介する技術資料に関する背景情報を示します。「インテル® AVX-512 で x265 カーネルを高速化する」セクションでは、高速化する x265 カーネルの選択と Main/Main 10 プロファイルでの結果を説明します。「インテル® AVX-512 で x265 エンコードを高速化する」セクションでは、Main/Main 10 プロファイルでのエンコーダー全体の結果を示します。そして最後のセクションでは、x265 でインテル® AVX-512 の使用が推奨される場合と、特定のカーネルを高速化するためインテル® AVX-512 を選択する際の一般的な推奨事項を提供します。また、今後の課題も提示します。

背景情報

背景情報のセクションでは、この記事で紹介する概念に関する背景情報を示します。「HEVC ビデオエンコード」では HEVC の背景情報を、「x265 オープンソース HEVC エンコーダー」では x265 における既存のパフォーマンス最適化手法に注目して述べます。「インテル® Xeon® スケーラブル・プロセッサー・プラットフォームについて」では、インテル® Xeon® スケーラブル・プロセッサーの概要を提供し、「インテル® AVX-512 を使用する SIMD ベクトル化」では、インテル® AVX-512 アーキテクチャーについて詳しく述べます。

HEVC ビデオエンコード

HEVC は、広く普及している AVC 規格の後継として、2013 年に JCT- VC (ビデオ・コーディングに関する共同作業チーム) によってエンコード規格として批准されました。4 HEVC ビデオのエンコード/デコードプロセスは、画像の各ブロックを表すコーディング・ユニット (CU)、CU の動き補償予測を含むモードの決定を表す予測ユニット (PU)、および予測と実際のブロック間の残差のコード化方法を表す変換ユニット (TU) の 3 つのユニットを識別して処理を行います。

最初に、フレームがコーディング・ツリー・ユニット (CTU) と呼ばれる、オーバーラップしない最大のコーディング・ユニットに分割されます。次に、CTU が、さまざまなサイズ (64×64、32×32、16×16、8×8) の複数の CU に分割され、クワッドツリーを形成します。その後、(同じフレームまたは異なるフレームにある) 候補ブロックのセットから各 CU が予測されます。予測に使用されるブロックが同じフレーム内にある場合はイントラ予測ブロックと言われ、異なるフレーム内にある場合はインター予測ブロックと言われます。

イントラ予測ブロックは、予測ブロックと予測の角度を示すモードの組み合わせで構成されます。イントラ予測で許可されるモードは、DC、平面、角度モードと呼ばれ、予測ブロックのさまざまな角度を表します。インター予測ブロックは、予測に使用されたブロック (リファレンス・ブロック) と現在のブロックとリファレンス・ブロック間の差分を示す動きベクトル (MV) の組み合わせで構成されます。MV がゼロのブロックはマージモードを使用し、それ以外は AMP (Advanced Motion Prediction) モードを使用します。スキップモードは、予測ブロックがソースと同一である (つまり、残余がない) 特殊なマージモードです。AMP モードは、CU と同じサイズの PU (2Nx2N PU) を使用するか、MV を計算するためさらに分割します (矩形および非対称 PU)。そして、オリジナル画像と予測画像の差として生成された残差は、予測モードに応じて、32×32 から最大 4×4 ブロックの TU を使用して量子化およびコード化されます。

インター、イントラ、CU、PU、および TU の選択プロセス全体は、ビッグデータ、人工知能 (AI)、ハイパフォーマンス・コンピューティング、エンタープライズクラス IT、クラウド、ストレージ、通信、IoT を含む広範な使用モデルに利点をもたらします。1.5 倍のメモリー帯域幅、統合ネットワーク/ファブリック、統合アクセラレーター (オプション)、広範なワークロード向けのパフォーマンスなどが得られます。x265 の結果は、前世代のインテル® Xeon® プロセッサー E5-2600 と比較して、オフラインエンコードにおいて 50 – 67% の大幅なスピードアップを示しています。これは、主にレート歪み最適化 (RDO) によるもので、ターゲット・ビットレートで歪みが最小化されること、または歪みによって表されるターゲット品質レベルでビットレートが最小化されることを保証します。RDO プロセス全体を通して、CU、PU、TU のさまざまな組み合わせが、いくつかのカーネルを使用するエンコーダーによって試されます。この記事では、これらのカーネルをインテル® AVX-512 命令を使用するように変換してベクトル化します。

HEVC エンコードは、ビデオエンコードで複数のプロファイルをサポートしており、それぞれのプロファイルは各ピクセルを表現する異なるビット数を示します。Main と Main10 プロファイルは、HEVC の代表的なプロファイルです (対応する AVC のプロファイルはそれぞれ Main と High プロファイルです)。ピクセルの各コンポーネントは、Main プロファイルでは最小 8 ビットで表され、値は 0 -255 の範囲になります。Main10 プロファイルは、ピクセルあたり 10 ビットを使用し、ピクセルごとに 0 -1023 の範囲でエンコードされたビデオでより詳細な表現が可能です。x265 エンコーダーは、HEVC 規格に準拠したビデオ圧縮を提供するオープンソースの HEVC です。7 VLC*、HandBrake、8 および FFMpeg*9 を含む複数のオープンソース・フレームワークに統合されており、業界標準のオープンソースの HEVC ビデオ・エンコーダーです。x265 エンコーダーは、インテル® アーキテクチャー、ARM*、PowerPC* を含む複数のプラットフォーム向けにアセンブリー・レベルで最適化されています。

x265 エンコーダーは、複雑さを増す HEVC エンコードに対応するため、フレーム間とフレーム内の並列化手法を採用しています。10 フレーム間の並列化では、x265 はシステムレベルのソフトウェア・スレッドを使用して複数のフレームを並列にエンコードします。フレーム内の並列化では、x265 は HEVC 規格の波状並列処理 (WPP) ツールを利用します。この機能は、ブロックのエンコードを開始する前に、前の行からのイントラ予測に必要なブロックが確実に完了するようにしつつ、フレームの CTU の行を並列にエンコードすることを可能にします。つまり、現在の行の CTU のエンコードを開始する前に、前の行の次の CTU が確実に完了するようにします。これらの機能を組み合わせることで、公開されているリファレンス・エンコーダー HM と比較して、効率を損なうことなく大幅なスピードアップを達成できます。

インテル® Xeon® スケーラブル・プロセッサー・プラットフォームについて

インテル® Xeon® スケーラブル・プロセッサー (開発コード名 Purley) は、画期的な新しいレベルのパフォーマンスを一貫して提供するように設計されています。最先端のテクノロジーをベースにしており、インテル® Xeon® スケーラブル・プロセッサーで改良されたマイクロアーキテクチャー機能を提供します。

インテル® AVX-512 を使用する SIMD ベクトル化

インテル® AVX-512 ベクトルユニットは、512 ビットのレジスターファイルを提供し、インテル® AVX2 と比較して、サイクルあたり 2 倍の並列データ操作が可能です。インテル® AVX-512 アーキテクチャーを使用するためカーネルをベクトル化する利点は明白ですが、このタスクを開始する前にメディア・ワークロードに関していくつか重要な点を確認する必要があります。第 1 に、この向上した並列処理を活用するのに十分な並列性がメディアカーネルにあるかです。第 2 に、この並列処理を利用する実行の割合は、アムダールの法則に従って平均的なスピードアップを期待できる十分な大きさであるかです。そして、第 3 に、このようなベクトル化を行うことで、シリアルコードやベクトル化されていないコードの実行に影響がないかです。

インテル® AVX-512 で x265 カーネルを高速化する

高速化の最初のステップとして、インテル® AVX-512 アセンブリー命令を使用して、高速化する x265 カーネルを選択しました。ベクトル化された SIMD コードを生成する自動化ツールはありますが、手書きのアセンブリーのほうが自動ベクトル化ツールよりも優れていることが分かりました。そのため、この手法を使用することにしました。このセクションでは、この手法をどのように実行したか、そして Main と Main10 プロファイルでのこれらのカーネルのサンプル実行で観測されたサイクルカウントのゲインについて詳しく述べます。

高速化するカーネルを選択する

Main と Main10 プロファイルでインテル® AVX-512 命令を利用して最適化するため、x256 の基本計算から 1,000 を超えるカーネルを選択しました。これらのカーネルは、リソース要件に基づいて選択されました。異なるブロックコピーとブロックフィル・カーネルのように頻繁なメモリーアクセスを必要とするカーネルもあれば、DCT、iDCT、量子化カーネルのように計算を多用するカーネルもあります。また、それら 2 つをさまざまな割合で組み合わせたカーネルもあります。アセンブリー・ルーチンがアクセスするバッファーを 64 バイトでアライメントすることで、キャッシュミスが減り、一般にインテル® AVX-512 カーネルにとって利点があることが分かりました。インテル® AVX-512 命令で最適化された Main と Main10 プロファイルのカーネルの一覧はそれぞれ付録 A1 と A2 にあります。

サイクルカウントの向上を評価するフレームワーク

x265 エンコーダーは、アセンブリー・カーネルの正当性とパフォーマンスを測定するツールとして、サンプル・テスト・ベンチマークを実装します。このベンチマークは、カーネルに対して有効な引数を受け取り、C プリミティブと対応するアセンブリー・カーネルを呼び出して、両方の出力バッファーを比較します。ランダムに分散された値のセットを使用して、入力タイプで可能なすべてのコーナーケースを検証します。各アセンブリー・カーネルは 100 回呼び出され、正当性を保証するため C プリミティブの出力と照合されます。パフォーマンスの向上を測定するため、テスト・ベンチマークは 1,000 回の実行におけるアセンブリー・カーネルと C カーネル間のクロック数の差 (rdtsc 命令で取得) を測定して、その平均を報告します。

Main と Main10 プロファイルのカーネルのサイクルカウントの向上

図 2 は、インテル® AVX-512 を利用して高速化された Main プロファイルの 500 カーネルと、Main10 プロファイルの 600 を超えるカーネルのサイクルカウントの向上を示しています。それぞれの曲線においてカーネルは、対応するインテル® AVX-512 実装と比較したサイクルカウントのゲインで昇順にソートされています。付録 A は、インテル® AVX2 と比較したカーネルごとのサイクルカウントのゲインです。

Main と Main10 プロファイルのカーネルでは、平均サイクルカウントがインテル® AVX2 カーネルよりもそれぞれ 33% と 40% 向上しました。大幅なゲインの理由はいくつかあります。Main10 プロファイルでは、x265 は 16 ビットで各ピクセルを表します。一方、Main プロファイルでは、8 ビットを使用します。Main10 は技術的には 10 ビットで十分ですが、16 ビットを使用することで、ソフトウェアのすべてのデータ構造を簡素化できます。そのため、同じピクセル数に対する作業量が 2 倍になります。計算量が多いため、インテル® AVX2 とインテル® AVX-512 のゲインを比較した場合、Main10 プロファイルのカーネルのほうが Main プロファイルのカーネルよりもゲインが大きくなります。このことから、カーネルレベルでは、x265 を高速化するためインテル® AVX-512 を使用することで大きな利点が得られることが分かります。しかしこれは、インテル® AVX-512 命令を使用した場合と、インテル® AVX2 命令を使用した場合のクロック周波数低下の比較を考慮していません。次のセクションでは、この影響を考慮した全体のエンコード時間への影響について考えます。

インテル® AVX-512 で x265 エンコードを高速化する

このセクションでは、実際の x265 エンコードにインテル® AVX-512 カーネルを使用する影響を考察します。「テスト構成」では、選択したビデオ、使用した x265 プリセット、テストマシンのシステム構成を含むテスト構成について説明します。「インテル® Core™ プロセッサー上でのエンコード」では、インテル® Core™ i9-7900X プロセッサーを搭載したワークステーション・マシン上での結果を示し、「インテル® Xeon® スケーラブル・プロセッサー上でのエンコード」では、2 基のインテル® Xeon® Platinum 8180 プロセッサーを搭載した典型的なハイエンドサーバー上での結果を示します。

テスト構成

このテストでは、主に Main プロファイルの 1080p ビデオのエンコードと Main10 プロファイルの 4K ビデオのエンコードに注目しました。テストには、4 つの一般的な 1080p クリップ (crowdrun、ducks_take_off、park_ joy、old_town_cross) と 3 つの 4K クリップ (Netflix_Boat、Netflix_FoodMarket、Netflix_Tango) を使用しました。10 付録 B に使用したビデオのスクリーンショットと詳細があります。次のビットレート (Kbps 単位) で Main プロファイルの 1080p をエンコードします: 1000、3000、5000、および 7000。4K クリップでは、Main10 プロファイルは次のビットレート (Kbps 単位) をターゲットにします: 8000、10000、12000、および 14000。

セクション 3 で示したすべてのカーネルを含むバージョンの x265 でこれらのビデオをエンコードします。これらのカーネルは、x265 のデフォルトのブランチの一部として提供されました。カーネルは、デフォルトでは無効に設定されており、x265 コマンドライン・インターフェイスで -asm avx512 オプションを指定して有効にできます。

グラフ
図 2. インテル® AVX-512 カーネルと対応するインテル® AVX2 カーネルを使用した場合の Main と Main10 プロファイルのサイクルカウントのゲイン

実験では、x265 の広範なユースケースを代表する 4 つのプリセットに注目しました: ultrafast、veryfast、medium、および veryslow。これらのプリセットは、エンコード効率と 1 秒あたりのフレーム数 (FPS) の異なるトレードオフを示しています。veryslow プリセットは、最も効率良いエンコードが可能ですが、最も低速です。OTT などのオフラインエンコードのユースケースに適しています。ultrafast プリセットは、x265 で最速の設定ですが、エンコード効率は最低です。veryfast と medium プリセットは、パフォーマンスとエンコード効率のバランスが良く、トレードオフの中間点と言えます。通常、より効率的なプリセットでは HEVC ツールが多く使用されるため、低効率のプリセットよりもピクセルあたりの計算量が増えます。前述のセクションの結果から分かるとおり、インテル® AVX-512 カーネルは、ピクセルあたりの計算量が多いほうが大きなスピードアップを得られる傾向にあるため、これは重要です。

インテル® Core™ プロセッサー上でのエンコード

図 3 は、インテル® Core™ i9-7900X プロセッサーを搭載したワークステーション構成において、x265 の単一のインスタンスでインテル® AVX2 を使用した場合と比較して、インテル® AVX-512 を使用した場合の Main と Main10 の 1080p と 4K ビデオのエンコード・パフォーマンスを示しています。システム構成の詳細は、付録 C にあります。単一のインスタンスは、このシステムで HEVC エンコードを実行する典型的なユースケースのすべての構成において CPU 使用率が高くなります。

インテル® Core™ i9-7900X プロセッサー
パフォーマンス・メトリックのグラフ
図 3. インテル® Core™ i9-7900X プロセッサーを搭載したワークステーション構成で測定された x265 の単一のインスタンスでインテル® AVX-512 カーネルを使用した場合のエンコーダー・パフォーマンス

図 3 の結果から、すべてのプロファイルとプリセットにおいて、インテル® AVX-512 カーネルを使用することでパフォーマンス・ゲインが得られることが分かります。インテル® Core™ i9-7900X プロセッサー・ベースのシステムでは、測定結果は大幅なクロック周波数の低下を示しませんでした。そのため、カーネルのサイクルカウントの向上は、エンコーダー・パフォーマンスに直接反映されます。エンコードごとのエンコーダー・パフォーマンスの比較では、インテル® AVX2 よりもインテル® AVX-512 のパフォーマンスが低くなるコマンドラインはありませんでした。

そのため、インテル® Core™ i9-7900X プロセッサーと周波数の低下がわずかである同様のシステムでは、x265 を使用する場合、すべてのエンコード・プロファイルと解像度でインテル® AVX-512 カーネルを有効にすることを推奨します。

インテル® Xeon® スケーラブル・プロセッサー上でのエンコード

このセクションでは、2 基のインテル® Xeon® Platinum 8180 プロセッサーを搭載したハイエンドサーバー構成 (デュアルソケット構成、CPU ごとに 56 ハイパースレッディング・コア) で、インテル® AVX-512 により高速化された x265 を使用した場合の結果を示します。システム構成の詳細は、付録 C を参照してください。

8 スレッドと 16 スレッドを使用した x265 の単一インスタンスのパフォーマンス

図 4 は、Main プロファイルで 1080p ビデオのエンコードと Main10 プロファイルで 4K ビデオのエンコードにインテル® AVX-512 カーネルを使用する場合と、インテル® AVX2 命令のみのカーネルを使用する場合を比較した、x265 の単一インスタンスのパフォーマンスです。グラフでは、CPU 上のアクティブなコア数を増やした場合の影響を理解するため、インスタンスごとに 8 スレッドと 16 スレッドの 2 つの構成を示しています。インスタンスごとのスレッド数は、x265 ライブラリーの --pools オプションで制御します。

グラフから、この 2 つの構成では、Main10 プロファイルの 4K コンテンツのエンコードのほうが、Main プロファイルの 1080p コンテンツのエンコードよりもゲインが大きいことが分かります。また、使用した解像度とプロファイルでは、ピクセルごとの作業量が多いプリセット (veryslow のように効率の良いプリセット) のほうが、高速なプリセットよりも大きなゲインが得られました。実際、Main プロファイルの 1080p コンテンツでは、平均してパフォーマンスの低下が見られました。これは、特定の構成においてピクセルごとの作業量が多いほうがインテル® AVX-512 を使用することで優れた利点が得られるという前述の結果と一致しています。さらに、これらのプロファイルの S 字カーブ (簡略化のためここでは示していません) を調査したところ、4K Main10 の veryslow 設定以外のいくつかのエンコーダー・コマンドラインでは、インテル® AVX2 と比較してパフォーマンスが低下しました。

そのため、インテル® AVX-512 が有効なカーネルは、Main10 プロファイルの veryslow 設定で 4K コンテンツをエンコードする場合のみ使用することを推奨します。ほかのプリセットとエンコーダー設定では、クロック周波数の低下を相殺してサイクルカウントのゲインを達成するのに十分なピクセルごとの作業量が得られません。

図 4 からもう 1 つ分かることは、x265 の単一インスタンスで 8 スレッドを使用した場合のほうが、16 スレッドを使用した場合よりも一般にシステム全体のパフォーマンス・ゲインが大きくなることです。さらなる解析により、インテル® Xeon® Platinum 8180 プロセッサーでインテル® AVX-512 命令を使用するコア数が増えると、周波数がさらに低下し、インテル® AVX-512 命令の使用によるゲインが小さくなることが分かりました。通常のサーバーでは、エンコーダー・ベンダーはすべての利用可能な CPU コアを利用して、スループットを最大化しようとします。
このユースケースについては、セクション 4.3.2 で説明します。セクション 4.3.2 では、4K Main10 エンコードでサーバーを飽和させ、アクティブなコア数の増加により周波数がさらに低下してゲインが消滅するかどうかを調査します。

インテル® Xeon® Platinum 8180 プロセッサー
パフォーマンス・ゲインの比較を示すグラフ
図 4. 2 基のインテル® Xeon® Platinum 8180 プロセッサーを搭載したサーバー構成において 8 または 16 スレッドでインテル® AVX-512 を使用した場合のインテル® AVX2 と比較した x265 の単一のインスタンスの相対パフォーマンス

x265 の複数のインスタンスでインテル® Xeon® Platinum 8180 プロセッサーを飽和させる

Main10 プロファイルで 4K をエンコードする場合に、アクティブなコア数を増やすことでパフォーマンスが低下するか調査するため、インスタンスごとに 16 スレッドを使用して、デュアルソケットのインテル® Xeon® Platinum 8180 プロセッサー・ベースのサーバーの一方または両方の CPU を飽和させました。インテル® AVX-512 を使用してすべての x265 インスタンスで同じクリップを異なるビットレートでエンコードした場合の合計 FPS を測定し、インテル® AVX2 を使用した場合と比較した結果を図 5 に 示します。

インテル® Xeon® Platinum 8180 プロセッサー – シングルまたはデュアルソケットの飽和
パフォーマンス・ゲインの比較を示すグラフ
図 5. x265 インスタンスでのインテル® Xeon® Platinum 8180 プロセッサーのシングルソケットとデュアルソケットの飽和

図 5 では、CPU の一方または両方が飽和しても、Main10 の 4K ビデオのエンコードは、インテル® AVX2 を使用した場合と比較してパフォーマンス・ゲインが得られることを示しています。しかし、より少ないコアを使用する x265 の単一インスタンスの場合と比較すると、ゲインが小さいことが分かります。さらに、veryfast や medium などの低効率なプリセットでは、アクティブなコア数を増やすと周波数がさらに低下してゲインが消滅します。

これらの結果は、インテル® AVX-512 カーネルは Main10 で veryslow プリセットを使用して 4K コンテンツをエンコードする場合にのみ有効にすべきであるという我々の推奨を裏付けるものです。ピクセルごとの計算量が少ないプリセットでは、インテル® AVX-512 カーネルを使用すると、インテル® AVX2 カーネルを使用する場合よりもパフォーマンスが低下する可能性があります。

まとめと今後の課題

この記事では、新しいインテル® Xeon® Scalable プロセッサーで利用可能なインテル® AVX-512 命令を使用して、オープンソースの HEVC エンコーダー x265 を高速化した事例を紹介しました。この事例では、CPU 周波数の低下がサイクルカウントの利点によって相殺されるようにインテル® AVX-512 を使用した高速化に適したカーネルを選択し、エンコーダー・パフォーマンスを向上するためピクセルごとの計算量のバランスが良いエンコーダー構成を選択する必要がありました。

推奨事項

メディアカーネルでインテル® AVX-512 を使用する場合、微妙なバランスが必要となります。我々の経験から、次のことを推奨します。

  • インテル® AVX-512 で高速化可能なカーネルを選択する際は、計算とメモリーの比率を考慮すべきです。この比率が高い場合、インテル® AVX-512 の使用を推奨します。また、インテル® AVX-512 を使用する場合、キャッシュライン境界をまたぐロードを回避するため、バッファーを 64B にアライメントします。
  • デスクトップ SKU とワークステーション SKU (例えば、テストに使用したインテル® Core™ i9-7900X プロセッサー) では、CPU クロック周波数の低下がわずかであるため、すべてのエンコーダー構成でインテル® AVX-512 カーネルを有効にできます。
  • サーバー SKU (例えば、テストに使用したインテル® Xeon® Platinum 8180 プロセッサー) では、アクティブなコア数に比例して、周波数の低下幅が大きくなります。そのため、インテル® AVX-512 では、クロックサイクルの利点が周波数のペナルティーを相殺することで、エンコーダーのパフォーマンスを向上できる、ピクセルごとの計算量が多い場合にのみ有効にすべきです。

具体的には、slower/veryslow プリセットを使用して Main10 プロファイルで 4K コンテンツをエンコードする場合にのみインテル® AVX-512 を使用することを推奨します。その他の設定 (解像度/プロファイル/プリセット) では、エンコーダーのパフォーマンスに影響する可能性があるため、インテル® AVX-512 カーネルの使用は推奨しません。

この記事で紹介する結果と推奨事項は、評価や実験的近似に限定されず、コミュニティー全体がインテル® AVX-512 を使用してメディア・ワークロードを高速化する利点を理解するのに役立つでしょう。

今後の課題

インテル® AVX-512 を使用して x265 を高速化する作業を通して、今後取り組みが必要ないくつかの課題が明らかになりました。高速化されたカーネルは、公開メーリングリストから入手できます。インテル® AVX-512 によりさらなる高速化を実現するため、今後次の課題に取り組む必要があります: (1) x265 で利用可能なほかの解像度とプリセットのビデオでのインテル® AVX-512 の使用に関する詳細な解析、(2) CPU 周波数を監視してインテル® AVX-512 カーネルを動的に有効/無効にする方法の実現、および (3) ワーカースレッドを異なるタイプのスレッドに分割して、その一部のみがインテル® AVX-512 を実行することで CPU 周波数が低下するコアの数を制限するようにエンコーダーを再構築。我々は引き続きこれらのソリューションの開発に取り組み、オープンソースに貢献していきます。皆さんもぜひ http://x265.org (英語) でプロジェクトに貢献してください。

謝辞

この取り組みの一部には、インテル社からのエンジニアリング臨時援助金が使用されました。この取り組みを通じて幅広いサポートを提供してくれた MulticoreWare の多くの開発者とエンジニアに感謝します。特に、Thomas A. Vaughan 氏のアドバイスと Min Chen 氏のアセンブリー・パッチに関する専門的な助言に謝意を表します。

付録 A

A1 – Main プロファイルの 1 サイクルあたりの命令数 (IPC) ゲイン

プリミティブ IPC ゲイン プリミティブ IPC ゲイン プリミティブ IPC ゲイン プリミティブ IPC ゲイン
sad 0.16% i422 chroma_vss 32.70% i420 chroma_vpp 23.19% luma_vss 43.18%
pixelavg _pp 0.87% luma_vss 32.89% addAvg 23.37% luma_vss 43.35%
i444 chroma_vps 1.14% sad_x3 33.01% addAvg 23.38% i444 chroma_hpp 43.43%
i444 chroma_vps 1.18% luma_vps 33.05% i444 chroma_hps 23.53% ssd_s 43.57%
pixelavg _pp 1.41% i420 chroma_hpp 33.08% i420 chroma_hps 23.77% luma_hps 43.68%
convert_p2s 1.95% i444 chroma_hpp 33.14% var 23.95% luma_vss 43.75%
i420 chroma_vps 2.45% sad_x4 33.14% i420 chroma_hpp 24.03% luma_hps 43.84%
i420 chroma_vps 2.72% i444 chroma_vss 33.16% i422 chroma_vpp 24.11% luma_hps 43.94%
i422 chroma_hps 2.83% i420 chroma_vss 33.16% i444 chroma_vss 24.15% luma_vsp 44.06%
i420 p2s 3.21% copy _ps 33.33% i422 chroma_vss 24.15% luma_vsp 44.11%
i444 p2s 3.21% i420 copy _ps 33.33% i420 chroma_vss 24.15% sub_ps 44.11%
sad_x3 3.29% i444 chroma_vss 33.34% i420 chroma_vps 24.20% i444 chroma_hpp 44.15%
i420 chroma_vps 3.62% i422 chroma_vss 33.34% i444 chroma_vpp 24.20% convert_p2s 44.33%
sad_x4 4.50% i420 chroma_vss 33.34% i420 chroma_vpp 24.20% i444 chroma_hpp 44.35%
sad 4.62% i422 copy _ps 33.43% sad 24.21% luma_vss 44.42%
i420 chroma_hps 4.90% i444 chroma_vss 33.43% i444 chroma_vps 24.22% luma_hps 44.43%
i420 chroma_hps 5.19% i422 chroma_vss 33.43% i420 chroma_vps 24.22% luma_hpp 44.48%
pixel_satd 5.42% i420 chroma_hpp 33.55% i444 chroma_hps 24.25% luma_vpp 44.54%
i444 chroma_vps 5.43% i422 chroma_hpp 33.57% i420 chroma_hpp 24.42% luma_vss 44.61%
i422 chroma_hps 5.82% dequant_normal 33.60% sad_x4 24.53% cpy1Dto2D_shl 44.61%
i444 chroma_vps 6.78% sad_x4 33.62% i444 chroma_hps 24.57% luma_vsp 44.62%
dct 7.06% i444 chroma_vss 33.89% i422 chroma_hps 24.65% luma_vsp 44.66%
i444 chroma_hps 7.08% i420 chroma_vss 33.89% psyCost_pp 24.89% luma_vss 44.70%
i444 chroma_hps 7.26% sad_x3 33.92% i422 chroma_vps 25.00% luma_vpp 44.74%
i422 chroma_vss 8.85% i420 pixel_satd 34.01% i444 chroma_vss 25.17% luma_vsp 44.85%
luma_vss 9.76% i444 chroma_hps 34.02% i422 chroma_vss 25.17% i422 copy _sp 45.20%
i422 chroma_hps 10.27% luma_vps 34.04% i420 chroma_vss 25.17% getResidual32 45.24%
i444 chroma_hps 11.00% i444 chroma_hpp 34.20% i422 chroma_vps 25.66% luma_vpp 45.30%
i444 chroma_hps 11.14% i420 pixel_satd 34.20% luma_vps 25.82% luma_hps 45.35%
sad 11.26% i420 chroma_hpp 34.23% i444 chroma_vps 25.89% i444 chroma_hpp 45.41%
i420 chroma_hps 11.38% i444 chroma_vss 34.43% i444 chroma_vps 25.92% luma_hpp 45.49%
pixel_sa8d 11.55% i422 chroma_vss 34.43% i420 chroma_hps 25.95% convert_p2s 45.52%
i444 chroma_hps 11.91% i420 chroma_vss 34.43% i420 chroma_vps 26.07% luma_hps 45.58%
luma_vpp 11.96% i422 chroma_vsp 34.59% convert_p2s 26.25% luma_vpp 45.62%
i422 chroma_hps 12.10% i444 chroma_vss 34.71% i422 chroma_vps 26.42% convert_p2s 45.62%
copy _pp 12.54% i444 chroma_vss 34.76% i444 chroma_vps 26.56% luma_vpp 45.69%
ssd_s 12.58% addAvg 34.88% i444 chroma_vss 26.71% cpy2Dto1D_shl 45.75%
i420 chroma_vps 12.58% addAvg 35.14% i422 chroma_vss 26.71% i422 addAvg 45.76%
i444 chroma_hps 12.79% sad 35.43% i420 chroma_vss 26.71% convert_p2s 46.00%
idct 13.32% ssd_ss 35.45% sad_x4 26.80% i420 add_ps 46.09%
luma_vps 13.78% i444 chroma_vss 35.51% i422 chroma_hpp 27.06% add_ps 46.10%
i444 chroma_hps 13.87% i420 pixel_satd 35.55% i422 chroma_hps 27.13% luma_vsp 46.14%
sad 13.88% pixelavg _pp 35.56% luma_hpp 27.15% luma_hps 46.29%
copy _cnt 14.25% luma_vpp 35.62% i420 pixel_satd 27.23% luma_vss 46.31%
luma_vpp 14.28% luma_vpp 36.21% i444 chroma_vss 27.24% i444 chroma_vsp 46.52%
pixel_satd 14.45% i420 chroma_hpp 36.45% i422 chroma_vss 27.24% i422 chroma_vsp 46.52%
idct 14.49% i422 chroma_hpp 36.65% luma_hpp 27.29% i420 chroma_vsp 46.52%
pixel_satd 14.92% i422 chroma_hpp 36.76% luma_vps 27.45% luma_hps 46.65%
pixel_satd 14.99% sad 36.76% psyCost_pp 27.62% pixelavg _pp 46.67%
sad 15.21% i422 chroma_hpp 36.81% luma_vsp 27.72% luma_vss 46.88%
idct 15.23% copy _pp 36.82% i422 chroma_hps 28.00% i422 addAvg 46.88%
sad_x3 15.32% pixelavg _pp 36.84% pixel_satd 28.50% luma_hps 46.90%
i444 chroma_vpp 15.47% convert_p2s 36.87% cpy2Dto1D_shl 28.69% luma_vsp 46.97%
i422 chroma_vpp 15.47% i420 p2s 36.87% luma_vps 28.71% i422 p2s 47.10%
i420 chroma_vpp 15.47% i444 p2s 36.87% i444 chroma_hpp 28.78% copy _pp 47.11%
pixel_satd 15.52% i444 chroma_hpp 37.07% i420 pixel_satd 28.80% luma_vss 47.64%
pixel_satd 15.62% luma_vpp 37.11% i422 pixel_satd 28.81% i444 chroma_hpp 47.83%
pixel_satd 15.66% luma_vss 37.49% i422 pixel_satd 28.95% i422 addAvg 47.85%
sad_x3 15.70% addAvg 37.76% luma_vss 29.26% luma_hps 48.46%
pixel_satd 15.75% i444 chroma_vps 37.90% i444 chroma_vss 29.29% copy _ps 48.57%
i420 chroma_hps 15.83% i444 chroma_vss 38.04% i420 chroma_hps 29.42% sub_ps 48.83%
copy _pp 15.93% i444 chroma_vps 38.05% luma_vpp 29.43% luma_hpp 48.97%
luma_vpp 16.10% i444 chroma_vps 38.23% scale1D_128to64 29.50% i422 add_ps 49.02%
nquant 16.33% sad 38.42% luma_vss 29.59% i444 chroma_vsp 49.43%
sad 16.35% i444 chroma_hpp 38.45% i444 chroma_vpp 29.69% i420 sub_ps 49.46%
i444 chroma_vpp 16.39% Weight_sp 38.48% i422 chroma_vpp 29.69% add_ps 49.50%
i420 chroma_hps 16.60% i444 chroma_hpp 38.55% i420 chroma_vpp 29.69% i422 sub_ps 49.52%
i444 chroma_vpp 17.02% sad 38.56% i422 chroma_hps 29.71% i420 addAvg 49.74%
i422 chroma_vpp 17.02% luma_hpp 38.79% i422 pixel_satd 29.75% convert_p2s 49.75%
i420 chroma_vpp 17.02% pixel_satd 39.15% i444 chroma_vpp 29.82% i422 p2s 49.75%
pixel_satd 17.08% luma_hpp 39.21% i422 chroma_vpp 29.82% i444 p2s 49.75%
luma_vps 17.10% i444 chroma_hpp 39.30% luma_vss 29.91% luma_vss 49.84%
luma_vps 17.36% i444 chroma_vps 39.39% i444 chroma_vss 29.92% luma_hpp 50.00%
i444 chroma_vss 17.55% addAvg 39.51% i422 chroma_vss 29.92% copy _sp 50.11%
i420 chroma_vss 17.55% i420 chroma_hpp 39.55% i420 chroma_vss 29.92% luma_vss 50.22%
pixel_satd 17.59% i422 pixel_satd 39.57% luma_vps 30.19% luma_hpp 50.61%
pixel_satd 17.66% i422 chroma_hpp 39.61% sad_x4 30.24% luma_hpp 51.19%
i444 chroma_vss 18.42% convert_p2s 39.78% sad 30.30% i444 chroma_vsp 51.23%
i422 chroma_vss 18.42% i420 p2s 39.78% luma_vps 30.37% luma_hpp 51.70%
i420 chroma_vss 18.42% i422 p2s 39.78% luma_vps 30.39% nonPsyRdoQuant 51.74%
i444 chroma_vpp 18.49% i444 p2s 39.78% i444 chroma_vpp 30.39% i444 chroma_vsp 52.08%
i420 chroma_vpp 18.49% copy _sp 39.93% i422 chroma_vpp 30.39% copy _pp 52.17%
luma_vps 18.50% i420 addAvg 40.02% i420 chroma_vpp 30.39% i444 chroma_vsp 52.22%
luma_vpp 18.51% luma_hps 40.04% ssd_ss 30.44% i444 chroma_vsp 52.28%
sad_x3 18.99% i444 chroma_hpp 40.07% i422 chroma_hpp 30.45% nonPsyRdoQuant 52.32%
copy _pp 19.76% addAvg 40.64% i420 pixel_satd 30.53% i422 copy _ss 52.45%
luma_vss 19.80% luma_vsp 40.87% i422 chroma_vpp 30.54% nonPsyRdoQuant 52.56%
pixel_satd 19.89% i444 chroma_vsp 40.96% i444 chroma_hpp 30.54% i444 chroma_vsp 52.77%
sad 20.09% i420 chroma_vsp 40.96% i422 chroma_hpp 30.56% i422 chroma_vsp 52.77%
sad_x3 20.26% luma_vss 41.01% i444 chroma_hpp 30.63% blockfill_s 52.93%
i444 chroma_hps 20.52% i420 copy _sp 41.12% i420 chroma_hpp 30.85% i444 chroma_vsp 53.30%
i420 chroma_hps 20.80% copy _cnt 41.14% luma_vsp 30.95% i422 chroma_vsp 53.30%
psyCost_pp 21.15% luma_vsp 41.16% sad_x4 30.95% i420 chroma_vsp 53.30%
i444 chroma_hps 21.17% Weight_pp 41.23% i422 chroma_vss 30.99% i422 chroma_vsp 53.36%
pixel_satd 21.19% luma_hps 41.42% i444 chroma_hps 31.12% i444 chroma_vsp 54.34%
pixel_satd 21.21% addAvg 41.84% i444 chroma_vpp 31.17% i422 chroma_vsp 54.34%
quant 21.23% i420 addAvg 41.87% i444 chroma_vpp 31.20% i420 chroma_vsp 54.34%
sad_x3 21.29% luma_vsp 41.99% sad 31.29% psyRdoQuant 54.44%
i444 chroma_vpp 21.42% luma_hps 42.05% luma_vsp 31.33% luma_hpp 54.62%
i422 chroma_vpp 21.42% convert_p2s 42.13% sad_x3 31.34% i444 chroma_vsp 54.64%
i420 chroma_vpp 21.42% i420 p2s 42.13% i422 pixel_satd 31.46% i420 chroma_vsp 54.64%
i420 chroma_vps 21.60% i422 p2s 42.13% luma_hps 31.52% luma_hpp 54.78%
pixel_satd 21.61% i444 p2s 42.13% i444 chroma_vpp 31.57% luma_hpp 55.06%
i444 chroma_vps 21.69% i444 chroma_vsp 42.31% pixelavg _pp 31.62% luma_hpp 55.40%
i422 chroma_hps 21.99% i422 chroma_vsp 42.31% luma_vps 31.76% copy _pp 55.41%
i420 addAvg 22.01% i420 chroma_vsp 42.31% i444 chroma_hps 31.78% psyRdoQuant 55.70%
luma_vsp 22.09% luma_vsp 42.35% sad_x3 31.95% psyRdoQuant 55.72%
i444 chroma_vps 22.27% i420 chroma_hpp 42.43% i444 chroma_vss 31.96% var 55.75%
i422 chroma_vps 22.41% nonPsyRdoQuant 42.51% i420 chroma_vss 31.96% copy _ss 56.00%
sad_x4 22.44% luma_hps 42.54% i422 chroma_vss 32.01% i444 chroma_vsp 56.36%
var 22.51% addAvg 42.56% i444 chroma_hpp 32.12% i422 chroma_vsp 56.36%
i444 chroma_vpp 22.64% luma_hps 42.58% var 32.17% i420 chroma_vsp 56.36%
i420 chroma_vpp 22.64% luma_vss 42.82% i420 chroma_hpp 32.32% i420 copy _ss 56.63%
sad_x4 22.84% i422 addAvg 42.93% i444 chroma_hps 32.44% i444 chroma_vsp 57.60%
i444 chroma_vpp 22.87% luma_vpp 42.97% luma_vsp 32.61% i420 chroma_vsp 57.60%
i422 chroma_vpp 22.87% dequant_scaling 42.98% i444 chroma_vss 32.67% copy _pp 58.33%
i422 chroma_hpp 22.92% luma_hpp 42.99% i420 chroma_vss 32.67% copy _ss 60.09%
sad_x4 23.09% i444 chroma_vsp 43.05% i444 chroma_vss 32.69% psyRdoQuant 62.80%
i444 chroma_vpp 23.19% i422 chroma_vsp 43.05% i422 chroma_vss 32.69% i444 chroma_vsp 62.98%

 

 

 

 

i420 chroma_vss 32.69% i420 chroma_vsp 62.98%

A2 – Main10 プロファイルの IPC ゲイン

プリミティブ IPC ゲイン プリミティブ IPC ゲイン プリミティブ IPC ゲイン プリミティブ IPC ゲイン
convert_p2s 1.26% i422 chroma_hps 39.92% i422 chroma_vpp 29.64% i444 chroma_hpp 49.20%
i420 p2s 1.26% i422 p2s 40.30% i420 chroma_vpp 29.64% i444 chroma_hps 49.45%
i444 p2s 1.26% luma_hpp 40.35% i444 chroma_vsp 29.82% cpy2Dto1D_shl 49.70%
addAvg 1.86% i422 chroma_hpp 40.52% i422 chroma_vsp 29.82% luma_hvpp 49.80%
addAvg 6.88% copy _cnt 40.55% i420 chroma_vsp 29.82% luma_vss 49.84%
dct 7.06% luma_vpp 40.58% luma_vss 29.91% i420 chroma_hps 49.85%
sad_x3 7.65% luma_vsp 40.59% i444 chroma_vss 29.92% convert_p2s 49.87%
sad 7.74% i444 chroma_vps 40.60% i422 chroma_vss 29.92% i420 p2s 49.87%
sad 8.29% i422 chroma_vps 40.60% i420 chroma_vss 29.92% i422 p2s 49.87%
i420 addAvg 8.36% i420 chroma_vps 40.60% i444 chroma_vps 29.93% i422 p2s 49.87%
sad_x3 8.77% sad_x3 40.64% i422 chroma_vps 29.93% i444 p2s 49.87%
luma_vss 9.76% nonPsyRdoQuant 40.70% i420 chroma_vps 29.93% luma_hps 49.94%
intra_pred_ang27 9.79% add_ps 40.71% luma_vsp 30.06% i422 chroma_hps 50.07%
cpy2Dto1D_shl 10.13% sad_x4 40.73% i444 chroma_vsp 30.11% i444 chroma_hpp 50.13%
sad_x3 10.81% luma_vpp 40.73% i422 chroma_vsp 30.11% luma_vss 50.22%
sad_x4 10.96% copy _pp 40.81% i420 chroma_vsp 30.11% luma_hpp 50.25%
i420 addAvg 11.05% i422 chroma_vps 40.88% pixel_satd 30.30% i420 chroma_vpp 50.28%
pixel_satd 11.05% luma_vss 41.01% i422 pixel_satd 30.30% luma_hps 50.67%
i420 pixel_satd 11.05% i444 chroma_vsp 41.02% i422 pixel_satd 30.35% addAvg 50.67%
i422 pixel_satd 11.05% i420 chroma_vsp 41.02% add_ps 30.69% i422 addAvg 50.67%
luma_vsp 12.64% i444 chroma_vsp 41.05% sad 30.94% luma_hpp 50.75%
copy _cnt 13.29% i420 chroma_vsp 41.05% dequant_normal 31.10% i420 chroma_hpp 50.82%
idct 13.32% sad 41.06% sad 31.37% copy _pp 50.95%
i444 chroma_vps 14.44% intra_pred_ang34 41.06% pixel_satd 31.43% i422 addAvg 50.99%
i422 chroma_vps 14.44% convert_p2s 41.09% i420 pixel_satd 31.43% luma_hps 51.17%
i420 chroma_vps 14.44% i444 p2s 41.09% i422 pixel_satd 31.43% i422 chroma_hpp 51.22%
idct 14.49% nonPsyRdoQuant 41.21% i444 chroma_vpp 31.60% i444 chroma_hpp 51.37%
i444 chroma_vpp 14.84% sad_x4 41.22% i422 chroma_vss 31.76% luma_hpp 51.48%
idct 15.23% i422 chroma_vpp 41.25% i444 chroma_vss 31.96% luma_hps 51.57%
luma_vsp 15.24% i420 chroma_vpp 41.25% i420 chroma_vss 31.96% copy _ss 51.58%
sad_x3 15.53% i420 chroma_vpp 41.36% sad 31.99% luma_hpp 51.63%
addAvg 15.60% i444 chroma_vsp 41.40% psyCost_pp 32.12% luma_hps 51.64%
i422 chroma_vpp 15.71% luma_vpp 41.43% i420 chroma_hps 32.32% luma_hps 51.65%
i420 chroma_vpp 15.71% luma_hvpp 41.46% i422 addAvg 32.46% luma_hps 51.70%
addAvg 15.90% luma_vpp 41.48% i422 chroma_vss 32.62% luma_hps 51.81%
i422 chroma_vpp 16.07% i444 chroma_vsp 41.51% i444 chroma_vss 32.67% i422 chroma_hpp 51.86%
intra_pred_ang25 16.22% luma_hvpp 41.54% i420 chroma_vss 32.67% luma_hps 51.89%
nquant 16.33% intra_pred_ang11 41.55% i444 chroma_vss 32.69% addAvg 51.89%
sad_x4 16.42% convert_p2s 41.58% i422 chroma_vss 32.69% i420 addAvg 51.89%
luma_vsp 16.55% sad_x4 41.71% i420 chroma_vss 32.69% i422 addAvg 51.89%
i420 addAvg 17.12% sad_x4 41.71% luma_vss 32.89% luma_hps 51.93%
sad_x4 17.33% luma_vsp 41.78% i444 chroma_vsp 33.14% luma_hps 51.99%
i444 chroma_vss 17.55% sad_x4 41.83% i422 chroma_vsp 33.14% i444 chroma_hpp 52.16%
i420 chroma_vss 17.55% i444 chroma_vsp 42.01% i444 chroma_vss 33.16% i422 copy _sp 52.45%
i444 chroma_vps 17.88% i444 chroma_vsp 42.08% i420 chroma_vss 33.16% i422 copy _ps 52.45%
i422 chroma_vps 17.88% i422 chroma_vsp 42.08% convert_p2s 33.27% i422 copy _ss 52.45%
i420 chroma_vps 17.88% nonPsyRdoQuant 42.13% i444 chroma_vss 33.34% i444 chroma_hps 52.94%
pixel_satd 18.02% pixelavg _pp 42.17% i422 chroma_vss 33.34% copy _ss 53.20%
i422 addAvg 18.13% i422 chroma_vpp 42.20% i420 chroma_vss 33.34% i420 chroma_hps 53.22%
i444 chroma_vss 18.42% i420 chroma_vpp 42.20% i444 chroma_vss 33.43% i422 chroma_hps 53.27%
i422 chroma_vss 18.42% luma_vps 42.30% i422 chroma_vss 33.43% i420 chroma_hpp 53.48%
i420 chroma_vss 18.42% sub_ps 42.52% pixelavg _pp 33.45% copy _pp 53.53%
addAvg 19.50% luma_vsp 42.55% pixel_satd 33.45% i422 chroma_hpp 53.81%
i444 chroma_vps 19.54% luma_hvpp 42.65% i420 pixel_satd 33.45% i422 chroma_hpp 53.89%
i422 chroma_vps 19.54% pixelavg _pp 42.65% addAvg 33.46% i444 chroma_hpp 54.31%
i420 chroma_vps 19.54% luma_vps 42.72% luma_vsp 33.47% ssd_ss 54.69%
sad_x3 19.75% convert_p2s 42.77% sad_x4 33.51% i422 chroma_hpp 54.77%
luma_vss 19.80% luma_vss 42.82% i444 chroma_vsp 33.79% i420 chroma_hpp 55.18%
i422 pixel_satd 19.95% luma_vsp 43.05% i422 chroma_vsp 33.79% luma_hpp 55.53%
pixel_satd 20.02% convert_p2s 43.11% i420 chroma_vsp 33.79% i444 chroma_hpp 55.56%
i420 pixel_satd 20.02% i444 chroma_hpp 43.15% i444 chroma_vss 33.89% i444 chroma_hpp 55.78%
i422 pixel_satd 20.02% luma_vsp 43.17% i420 chroma_vss 33.89% i444 chroma_hpp 55.94%
i444 chroma_vps 20.09% luma_vss 43.18% luma_vsp 34.08% luma_hpp 55.96%
i420 chroma_vps 20.09% luma_vsp 43.22% sub_ps 34.13% copy _sp 56.00%
i422 chroma_vss 20.53% luma_hvpp 43.24% i444 chroma_vsp 34.18% copy _ps 56.00%
sad_x4 20.69% luma_vss 43.35% i420 chroma_vsp 34.18% i444 chroma_hpp 56.07%
i444 chroma_vps 20.86% luma_vsp 43.36% i444 chroma_vsp 34.22% luma_hpp 56.16%
i422 chroma_vps 20.86% i420 chroma_hpp 43.38% i422 chroma_vsp 34.22% i420 copy _sp 56.63%
i444 chroma_vpp 20.98% cpy1Dto2D_shl 43.50% i420 chroma_vsp 34.22% i420 copy _ps 56.63%
quant 21.23% luma_vsp 43.50% i444 chroma_vss 34.43% i420 copy _ss 56.63%
i422 chroma_vpp 21.45% luma_vpp 43.51% i422 chroma_vss 34.43% i422 chroma_hpp 57.32%
sad 21.61% copy _pp 43.54% i420 chroma_vss 34.43% i444 chroma_hps 57.33%
i444 chroma_vpp 21.78% luma_hvpp 43.57% pixel_satd 34.59% luma_hpp 57.40%
i444 chroma_vps 22.06% luma_vpp 43.58% i444 chroma_vss 34.71% i420 chroma_hps 57.97%
i420 chroma_vps 22.06% luma_hvpp 43.60% i444 chroma_vss 34.76% luma_hpp 58.55%
i444 chroma_vsp 22.12% luma_vss 43.75% intra_pred_ang10 34.76% i444 chroma_hps 59.21%
i422 chroma_vsp 22.12% luma_vps 43.77% i444 chroma_vps 34.80% i420 chroma_hps 59.46%
i420 chroma_vsp 22.12% i444 chroma_vsp 43.80% i444 chroma_vps 34.98% blockfill_s 59.53%
i444 chroma_vsp 22.14% i420 chroma_vsp 43.80% luma_vps 35.07% luma_hpp 59.56%
i422 chroma_vsp 22.14% pixelavg _pp 43.94% i444 chroma_vps 35.34% i422 chroma_hps 59.75%
i420 chroma_vsp 22.14% psyRdoQuant 44.02% Weight_pp 35.37% copy _sp 60.09%
i422 chroma_vpp 22.28% sad_x3 44.17% i444 chroma_vss 35.51% copy _ps 60.09%
i420 chroma_vpp 22.28% pixelavg _pp 44.23% luma_vps 35.63% luma_hps 60.23%
i444 chroma_vpp 22.28% luma_hvpp 44.24% i422 chroma_hps 35.68% psyRdoQuant 60.25%
i422 chroma_vpp 22.35% luma_hvpp 44.28% i444 chroma_vps 36.38% luma_hpp 60.26%
ssd_ss 22.60% luma_vsp 44.31% i422 chroma_vss 36.56% i444 chroma_hps 60.28%
i444 chroma_vpp 23.06% dequant_scaling 44.37% sad 36.66% i420 chroma_hps 60.48%
sad_x4 23.09% convert_p2s 44.40% luma_vpp 36.68% luma_hps 60.76%
luma_vpp 23.67% luma_vpp 44.41% i444 chroma_vpp 36.70% copy _pp 60.87%
luma_vpp 23.82% luma_vss 44.42% luma_vsp 36.71% i444 chroma_hps 60.92%
i444 chroma_vpp 23.84% sad_x4 44.42% sad_x3 36.75% i422 chroma_hps 61.09%
i444 chroma_vss 24.15% luma_vpp 44.60% sad_x4 36.78% luma_hpp 61.28%
i422 chroma_vss 24.15% luma_vss 44.61% pixel_satd 36.88% i444 chroma_hpp 61.38%
i420 chroma_vss 24.15% luma_hvpp 44.61% i422 chroma_vpp 36.91% luma_hpp 61.43%
intra_pred_ang9 24.37% getResidual32 44.64% copy _pp 36.96% luma_hpp 61.44%
i444 chroma_vpp 24.41% luma_hpp 44.68% addAvg 37.08% i422 chroma_hps 61.55%
luma_vpp 24.48% luma_vss 44.70% sad_x4 37.09% luma_hpp 61.58%
i422 addAvg 24.62% luma_hvpp 44.73% i420 chroma_vpp 37.29% luma_hpp 62.26%
psyCost_pp 24.88% i444 chroma_vsp 44.76% i422 chroma_vpp 37.36% i422 chroma_hps 62.31%
i420 chroma_vpp 24.90% i422 chroma_vsp 44.76% i420 chroma_vpp 37.36% luma_hpp 62.35%
i422 chroma_vpp 25.11% i420 chroma_vsp 44.76% luma_vss 37.49% i420 chroma_hpp 62.39%
i420 chroma_vpp 25.11% sad_x4 44.85% luma_vpp 37.53% i420 chroma_hps 62.39%
i444 chroma_vps 25.17% luma_hvpp 45.15% i444 chroma_vps 37.54% i444 chroma_hpp 62.46%
i422 chroma_vps 25.17% luma_vps 45.19% i422 chroma_vps 37.54% luma_hpp 62.63%
i420 chroma_vps 25.17% i422 chroma_hpp 45.23% i420 chroma_vps 37.54% i444 chroma_hps 62.88%
i444 chroma_vss 25.17% intra_pred_dc 45.26% i444 chroma_vpp 37.59% i420 chroma_hps 62.95%
i422 chroma_vss 25.17% sad 45.31% i420 chroma_vpp 37.59% luma_hpp 63.07%
i420 chroma_vss 25.17% luma_vps 45.36% i444 chroma_vps 37.59% i444 chroma_hps 63.15%
i422 chroma_vps 25.28% psyRdoQuant 45.40% i422 chroma_vps 37.59% luma_hps 63.16%
i444 chroma_vps 25.97% i420 add_ps 45.40% pixel_satd 37.60% i420 chroma_hpp 63.34%
i422 chroma_vps 25.97% pixelavg _pp 45.52% i444 chroma_vps 37.60% luma_hpp 63.61%
i420 chroma_vps 25.97% addAvg 45.54% i420 chroma_vps 37.60% i420 chroma_hps 63.85%
luma_vpp 26.22% i420 addAvg 45.54% i444 chroma_vsp 37.66% luma_hpp 63.91%
sad 26.25% i422 addAvg 45.54% i422 chroma_vps 37.68% i420 chroma_hpp 64.12%
psyCost_pp 26.30% i444 chroma_vsp 45.57% i444 chroma_vpp 37.69% i444 chroma_hps 64.15%
i444 chroma_vsp 26.38% i422 chroma_vsp 45.57% i444 chroma_vps 37.71% i444 chroma_hpp 64.23%
i420 chroma_vsp 26.38% i420 chroma_vsp 45.57% i420 chroma_vps 37.71% i422 chroma_hpp 64.39%
i420 addAvg 26.39% luma_vps 45.58% convert_p2s 37.73% i422 chroma_hpp 64.56%
i422 addAvg 26.39% pixelavg _pp 45.61% i420 p2s 37.73% i444 chroma_hps 64.84%
pixel_satd 26.62% luma_vps 45.62% i422 p2s 37.73% i422 chroma_hps 64.87%
i444 chroma_vss 26.71% luma_vps 45.64% i444 p2s 37.73% i444 chroma_hpp 64.92%
i422 chroma_vss 26.71% sad_x3 45.65% i444 chroma_vpp 37.74% i420 chroma_hps 64.93%
i420 chroma_vss 26.71% i422 add_ps 45.68% i444 chroma_vpp 37.76% i422 chroma_hpp 65.05%
luma_vsp 26.77% addAvg 45.72% addAvg 37.80% i444 chroma_hps 65.06%
luma_vps 27.04% i420 addAvg 45.72% i422 chroma_vpp 37.99% i420 chroma_hpp 65.14%
luma_vpp 27.10% pixelavg _pp 45.80% i444 chroma_vss 38.04% i422 chroma_hps 65.35%
i444 chroma_vss 27.24% i444 chroma_hpp 45.95% i420 chroma_hpp 38.04% i422 chroma_hps 65.63%
i422 chroma_vss 27.24% psyRdoQuant 45.96% luma_vps 38.08% i444 chroma_hps 65.72%
i422 chroma_vps 27.26% luma_vsp 45.97% i444 chroma_vpp 38.09% i422 chroma_hpp 65.80%
i420 addAvg 27.28% sad 46.04% i444 chroma_vpp 38.27% i444 chroma_hpp 65.88%
i422 addAvg 27.28% luma_hvpp 46.17% i422 chroma_vpp 38.27% i420 chroma_hpp 65.92%
addAvg 27.55% luma_vss 46.31% i444 chroma_hps 38.30% i420 chroma_hpp 65.94%
i422 chroma_vpp 27.71% sad_x3 46.36% intra_pred_ang2 38.34% i444 chroma_hps 66.03%
i420 chroma_vpp 27.71% sad_x3 46.42% i444 chroma_hps 38.37% i422 chroma_hps 66.03%
pixel_satd 27.93% luma_vps 46.44% i444 chroma_vpp 38.48% i420 chroma_hps 66.15%
ssd_s 28.04% luma_hpp 46.46% copy _pp 38.51% i422 chroma_hpp 66.20%
pixel_satd 28.10% i444 chroma_vsp 46.66% addAvg 38.54% i422 chroma_hps 66.20%
pixelavg _pp 28.47% sad_x3 46.71% nonPsyRdoQuant 38.57% i420 chroma_hps 66.29%
i420 pixel_satd 28.54% luma_hpp 46.82% sad_x3 38.74% i422 chroma_hpp 66.32%
i422 pixel_satd 28.54% luma_vss 46.88% sad_x3 38.80% i444 chroma_hpp 66.38%
pixel_satd 28.56% i422 chroma_hps 46.99% sad 38.84% i444 chroma_vpp 66.41%
i420 pixel_satd 28.56% intra_pred_ang26 47.26% Weight_sp 38.86% i444 chroma_hps 66.50%
i422 pixel_satd 28.56% luma_vps 47.31% pixel_satd 38.88% i444 chroma_vpp 66.61%
i444 chroma_vps 28.75% luma_hvpp 47.44% i420 pixel_satd 38.88% i444 chroma_vpp 66.63%
luma_vps 28.78% pixelavg _pp 47.50% copy _pp 38.96% i444 chroma_hps 66.64%
luma_vps 28.82% luma_vss 47.64% i422 sub_ps 39.19% i444 chroma_hpp 66.64%
i422 chroma_hps 28.86% luma_vps 47.69% i420 sub_ps 39.34% i420 chroma_hpp 66.64%
i420 chroma_hps 29.02% i420 chroma_hpp 47.78% i420 chroma_hps 39.47% i420 chroma_hpp 66.65%
sad_x3 29.04% i422 chroma_hps 47.82% luma_vpp 39.54% i444 chroma_hps 66.71%
i444 chroma_hps 29.11% luma_vsp 47.93% luma_hvpp 39.63% i422 chroma_hpp 66.71%
luma_vsp 29.13% luma_hvpp 48.30% i444 chroma_vps 39.68% i444 chroma_hps 66.75%
luma_vss 29.26% addAvg 48.40% i420 chroma_vps 39.68% i444 chroma_hps 66.91%
i444 chroma_vss 29.29% i420 addAvg 48.40% luma_hpp 39.72% i422 chroma_hpp 66.92%
luma_vpp 29.39% luma_hps 48.96% addAvg 39.77% i444 chroma_hpp 67.59%
luma_vss 29.59% luma_hps 49.05% convert_p2s 39.79% i444 chroma_hpp 67.78%

 

 

 

 

i420 p2s 39.79% i420 chroma_hpp 69.14%

 

 

 

 

i444 p2s 39.79% i444 chroma_hpp 69.23%

付録 B

使用した 1080p テストクリップとビットレート

次の 1080p クリップをテスト結果の生成に使用しました。

passerby in a verdant sunny park
park_ joy _1080p.y4m

large crowd of joggers in a park
crowd_run_1080p50.y4m

ducks  loligagging in a blue pond
ducks_take_off_1080p50.y4m

古いヨーロッパの都市の都市景観
old_town_cross_1080p50.y4m

使用した 4K テストクリップとビットレート

次の 4K クリップをテスト結果の生成に使用しました。

バケーション・パノラマ
Netflix_Boat_4096x2160_60fps_10bit_420.y4m

タンゴ愛好者
Netflix_Tango_4096x2160_60fps_10bit_420.y4m

農村市場
Netflix_FoodMarket_4096x2160_60fps_10bit_420.y4m

 

付録 C

インテル® Core™ i7-4500U プロセッサー上でのテスト構成
システム属性
OS 名 Windows® 10 Professional
バージョン 10.0.16299 ビルド 16299
システムモデル MS-7A93
システムの種類 x64 ベースの PC
プロセッサー インテル® Core™ i7-4500U CPU @ 3.30GHz、 3312MHz、 10 コア、 20 論理プロセッサー
ソケットごとのコア数 2
コアごとのスレッド数 2
ソケット数 1
NUMA ノード数 1
   
BIOS
BIOS バージョン/日付 American Megatrends Inc. 1.00、6/2/2017
SMBIOS バージョン 3
BIOS モード UEFI
   
グラフィック・インターフェイス
バージョン PCI-Express*
リンク幅 x16
サポートされる最大値 x16
   
メモリー
タイプ DDR3
チャネル 1
サイズ 8GB
DRAM 周波数 800MHz
コマンドレート (CR) 2T

インテル® Core™ i9-7900X プロセッサー・ベースのテストシステム構成
システム属性
OS 名 Microsoft* Windows® 10 Enterprise
バージョン 110.0.16299 ビルド 16299
システムモデル MS-7A93
システムの種類 x64 ベースの PC
プロセッサー インテル® Core™ i9-7900X CPU @ 3.30GHz、 3312Mhz、 10 コア、 20 論理プロセッサー
ソケットごとのコア数 10
コアごとのスレッド数 2
ソケット数 1
NUMA ノード数 1
   
BIOS
BIOS バージョン/日付 American Megatrends Inc. 1.00, 6/2/2017
SMBIOS バージョン 3
BIOS モード UEFI
   
グラフィック・インターフェイス
バージョン PCI-Express*
リンク幅 x16
サポートされる最大値 x16
   
メモリー
タイプ DDR4
チャネル 2
サイズ 32GB
DRAM 周波数 1066.80MHz
コマンドレート (CR) 2T

インテル® Xeon® Platinum 8180 プロセッサー・ベースのテストシステム構成
システム属性
OS 名 CentOS*
バージョン 7.2
システムモデル インテル® S4PR1SY2B
システムの種類 x86_64
プロセッサー インテル® Xeon® Platinum 8180 CPU @ 2.50GHz
ソケットごとのコア数 28
コアごとのスレッド数 2
ソケット数: 2
NUMA ノード数 2
   
BIOS
BIOS バージョン/日付 SE5C620.86B.0X.01.0007.062120172 125 / 06/21/2017
SMBIOS バージョン 2.8
BIOS モード UEFI
   
グラフィック・インターフェイス
バージョン PCI-Express*
リンク幅 x16
サポートされる最大値 x16
   
メモリー
タイプ DDR4
チャネル 2
サイズ 192GB
DRAM 周波数 1333MHz
コマンドレート (CR) 2T

参考文献

  1. David A. Patterson and John L. Hennessey, Computer Organization and Design: the Hardware/Software Interface, 2nd Edition, Morgan Kaufmann Publishers, Inc., San Francisco, California, 1998, p.751.
  2. VideoLAN Organization, x264, The best H.264/AVC encoder. https://www.videolan.org/developers/x264.html (英語)
  3. MulticoreWare Inc., x265 HEVC Encoder/H.265 Video Codec. http://x265.org/ (英語)
  4. G. J. Sullivan, J.-R. Ohm, W.-J. Han and T. Wigand, "Overview of the High Efficiency Video Coding (HEVC) Standard," IEEE Transactions on Circuits and Systems for Video Technology, vol. 22, no. 12,pp. 1649-1668, 2012.
  5. Intel Corporation, Intel Advanced Vector Instructions 512. https://www.intel.in/content/www/in/en/architecture-and-technology/avx-512-overview.html (英語)
  6. Intel Corporation, "Intel® Xeon® Processor Scalable Family Specification Update", February, 2018. https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/xeon-scalable-spec-update.pdf (英語)
  7. x265.org (英語)
  8. HandBrake, An OpenSource Video Transcoder. https://handbrake.fr/ (英語)
  9. FFMPEG, A complete, cross-platform solution to record, convert and stream audio and video. (英語)
  10. MulticoreWare Inc., "x265 Receives Significant Boost from Intel Xeon Scalable Processor Family." http://x265.org/x265-receives-significant-boost-intel-xeon-scalable-processor-family/ (英語)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事