この記事は、もともとAmpere Computingによって公開されました このペーパーでは、Ampereプロセッサのアプリケーションパフォーマンスを最適化するためにGNUコンパイラコレクション(GCC)オプションを効果的に使用する方法について説明します。
アプリケーションを最適化しようとする場合、潜在的な最適化がパフォーマンスを改善するかどうかを測定することが不可欠です。これには、コンパイラオプションが含まれます。高度なコンパイラオプションを使用すると、コンパイル時間の増加、デバッグの難しさの増加、およびしばしばバイナリサイズが増加する可能性があるため、ランタイムパフォーマンスが向上する可能性があります。コンパイラオプションがパフォーマンスに影響する理由はこのペーパーの範囲を超えていますが、短い答えは、コード生成、最新のプロセッサアーキテクチャ、およびそれらの相互作用方法が非常に複雑であるということです。別の重要な点は、コンピューターアーキテクチャの変動と特定のマイクロアーキテクチャのため、異なるプロセッサが異なるコンパイラオプションから恩恵を受ける可能性があることです。最適化を繰り返し実験することは、パフォーマンスの成功の鍵ですアプリケーションのパフォーマンスを測定して制限要因を決定する方法と、最適化戦略は、以前に公開された記事ですでに取り上げられています。 Ampere Altraベースのインスタンスで実行中に答える最初の10の質問であるこの論文は、システム全体のパフォーマンスを理解するために収集するパフォーマンスデータについて説明します。 Ampere Altraファミリプロセッサを最適化するためのパフォーマンス分析方法論は、データ駆動型アプローチを使用して効果的かつ効率的に最適化する方法を説明します。
このペーパーでは、最初に最も一般的なGCCオプションを要約して、これらのオプションがアプリケーションにどのように影響するかを説明します。その後、議論はGCCオプションを使用してケーススタディを提示し、VP9ビデオエンコーディングソフトウェアとAmpereプロセッサのMySQLデータベースのパフォーマンスを改善します。同様の戦略が、Ampereプロセッサで実行される追加のソフトウェアを最適化するために効果的に使用されてきました。gccの推奨事項
GCCコンパイラは、アプリケーションのパフォーマンスを改善できる多くのオプションを提供します。詳細については、GCC Webサイトをご覧ください。 Ampereプロセッサで利用可能なすべてのパフォーマンス機能を活用するコードを生成するには、GCC -MCPUオプションを使用します。
GCC -MCPUオプションを使用するには、CPUモデルを設定するか、GCCが-MCPU =ネイティブを介して実行されているマシンに基づいてCPUモデルを使用するようにGCCに指示します。 Legacy X86ベースのシステムに注意するGCC -MCPUは、-Mtuneの非推奨同義語ですが、GCC -MCPUはARMベースのシステムで完全にサポートされています。詳細については、アーキテクチャ全体のコンパイラフラグのガイド:-march、-mtune、および-mcpuを参照してください。要約すると、可能な場合はいつでも、-MCPUのみを使用し、腕をコンパイルするときに-marchと-mtuneを回避します。以下は、VP9ビデオエンコードソフトウェアでGCC -MCPUオプションを設定することにより、パフォーマンスの向上を強調するケーススタディです。 -MCPUオプションの設定:
-MCPU = ampere1:Ampereoneプロセッサで実行されるコードを生成します。 Ampereoneは、Ampereの次世代クラウドネイティブプロセッサであり、高性能プロセッサのファミリーを新しい業界をリードするコアカウントに拡張します。これにより、Ampere AltraおよびAltra Maxプロセッサで実行されないコードを生成できます。このオプションは、最初はGCCバージョン12.1以降で利用可能でしたが、GCC 10.5およびGCC 11.3にバックポートしました。
-MCPU = neoverse-N1:アンペアアルトラ、アンペレアルトラマックス、およびアンペアアンペレオネで実行されるコードを生成します。 Ampere Ampereoneで実行されるコードにこのオプションを使用することがサポートされていますが、利用可能なすべての新しいパフォーマンス機能を利用できない可能性があります。注、Ampere AltraおよびAmpere Altra MaxプロセッサのCPU固有のチューニングを有効にするには、GCCバージョン9.1以下が必要です。
次の表には、Ampereプロセッサ-MCPU値をサポートするGCCバージョンを示します。
processor
プロセッサ固有のチューニングと最適化を有効にするために、アンペアプロセッサを構築するときに推奨されます。 (詳細については、上記の「-MCPUオプションの設定」セクションを参照してください。)
-O2は、標準のGCC最適化オプションを考慮し、他のGCCオプションと比較するためのベースラインとして使用するのに適しています。
-O3は、追加の最適化を追加してループのより効率的なコードを生成します。アプリケーションのパフォーマンスがループに費やされた時間に支配されているかどうかを試すのに役立ちます。
プロファイルガイド最適化(PGO):-fprofile -generate&-frofile -use。コンパイラが使用するプロファイルデータを生成し、インライン化、ループ最適化、デフォルトブランチなどの最適化についてより良い決定を下す可能性があります。これは、ビルドシステムの変更が必要なため、高度な最適化と見なされます。以下を参照してください。
リンク時間最適化(LTO):-flto。リンク時間の最適化を有効にし、コンパイラが個々のソースファイル間で最適化できるようにします。これにより、他のコンパイラの最適化の中で、ソースファイルに関数をインライン化できます。これも高度な最適化と見なされ、ビルドシステムの変更が必要になる可能性があります。このオプションは、全体的なビルド時間を長くします。これは、大規模なアプリケーションにとって劇的なものです。パフォーマンスの重要なソースファイルでLTOを使用して、ビルド時間を潜在的に減らすことができます。
VP9は、Googleが開発したビデオコーディング形式です。 LIBVPXは、GoogleのVP8およびVP9ビデオコーデックのオープンソースリファレンスソフトウェア実装およびOpen MediaのAlliance(Aomedia)です。 LIBVPXは、追加の計算時間を費用して、X264を超えるビデオ圧縮を大幅に改善します。 VP9とLibvpxの追加情報はWikipediaで入手できます。 このケーススタディでは、VP9ビルドがGCC -MCPU =ネイティブオプションを使用してパフォーマンスを改善するように構成されています。上記のように、Ampereプロセッサをコンパイルするときに-MCPUオプションを使用して、CPU固有のチューニングと最適化を有効にします。当初、LIBVPXはデフォルトの構成を使用して構築され、-MCPU = nativeを使用して再構築されました。 VP9のパフォーマンスを評価するには、1080p入力ビデオファイル、Original_videos_sports_1080p_sports_1080p-0063.mkv YouTubeのユーザー生成コンテンツデータセットから使用されました。 AmpereのFFMPEGチューニングとビルドガイドを参照してください。FFMPEGを構築する方法と、Ampereプロセッサ用のVP9を含むさまざまなコーデックを構築する方法。
デフォルトのlibvpxビルド:
-MCPU = native
でlibvpxビルドを最適化する方法$ git clone https://chromium.googlesource.com/webm/libvpx $ cd libvpx/ $ export CFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdeclaration-after-statement -Wdisabled-optimization -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wimplicit-function-declaration -Wmissing-declarations -Wmissing-prototypes -Wuninitialized -Wunused -Wextra -Wundef -Wframe-larger-than=52000 -std=gnu89" $ export CXXFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdisabled-optimization -Wextra-semi -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wmissing-declarations -Wuninitialized -Wunused -Wextra -Wno-psabi -Wc++14-extensions -Wc++17-extensions -Wc++20-extensions -std=gnu++11 -std=gnu++11" $ ./configure $ make verbose=1 $ ./vpxenc --codec=vp9 --profile=0 --height=1080 --width=1920 --fps=25/1 --limit=100 -o output.mkv /home/joneill/Videos/original_videos_Sports_1080P_Sports_1080P-0063.mkv --target-bitrate=2073600 --good --passes=1 --threads=1 –debug
VPX_CONVOLVE8_VERT_NEONの場合、CPUサイクルは2.46E 11から2.07E 11に減少し、16%減少しました。
全体として、-mcpu = nativeを使用して、アプリケーションスループットを改善することにより、Ampere altraプロセッサでファイルOriginal_videos_sports_1080p_sports_1080p -0063.mkvをファイルのトランスコーディングアップアップアップしてsped upped up aped up aped up up up aped up up up upが有効にします。次の表は、PERF RECORDおよびPERF REPORTユーティリティを使用して収集されたデータを示して、CPUサイクルと退職した命令を測定します。config
をビルドします
シンボルプロファイルデータを生成するための代表的なワークロードでアプリケーションを実行します。
プロファイルデータを使用してアプリケーションを再構築します。GCC-Fprofile -use。PGOを使用すると、GCCは、撮影されていない範囲の測定やループトリップカウントの測定などの追加情報を提供することにより、アプリケーションをより適切に最適化できます。 PGOは、パフォーマンスが向上するかどうかを試してみるための有用な最適化です。 PGOが役立つパフォーマンスシグネチャには、かなりの割合の支店誤差を含むアプリケーションが含まれます。これは、パフォーマンスを使用してCPUのパフォーマンス監視ユニット(PMU)Counter BR_MIS_PRED_RETIREDを読み取ることができます。多数の支店の誤解は、STALL_FRONTEND PMUカウンターで測定できるフロントエンドのストールの割合が高いことにつながります。 L2命令キャッシュミス率が高いアプリケーションは、おそらく誤って予測された支店に関連するPGOの恩恵を受ける可能性があります。要約すると、支店の予測、CPUフロントエンドのストール、L2命令キャッシュミスの大部分は、PGOがパフォーマンスを改善できるパフォーマンス署名です。
MySQLは、世界で最も人気のあるオープンソースデータベースであり、MySQLバイナリサイズが大きいため、GCC PGOの最適化を使用するのに理想的な候補です。 PGO情報がなければ、GCCが実行された多くの異なるコードパスを正しく予測することは不可能です。 PGOを使用すると、ブランチの誤解が大幅に削減され、L2命令キャッシュミスレートとCPUフロントエンドストールがアンペアAltra Maxプロセッサを削減します。 GCC PGO:
を使用してMySQLが最適化される方法を要約しますsysbenchを使用して、mysqlパフォーマンスを評価しました
アプリケーションを最適化するには、何が最適かを判断するために、さまざまな戦略を実験する必要があります。このペーパーでは、さまざまなGCCコンパイラの最適化に関する推奨事項を提供して、Ampereプロセッサで実行されている高性能アプリケーションを生成します。 Ampere Cloudネイティブプロセッサでサポートされているすべての機能を活用するコードを生成する最も簡単な方法として、-MCPUオプションを使用することを強調します。 MySQLデータベースとVP9ビデオエンコーダーの2つのケーススタディでは、GCCオプションを使用して、パフォーマンスが重要なこれらのアプリケーションを最適化することを示しています。持続可能なクラウドコンピューティングのために構築されたAmpereの最初のクラウドネイティブプロセッサは、業界で前例のない予測可能な高性能、プラットフォームのスケーラビリティ、電力効率を提供します。開発者の取り組みについて詳しく知り、開発者でベストプラクティスを見つけて、amperecomputing.comでベストプラクティスを見つけて、community.amperecomputing.comで会話に参加してください。
以上がアンペアプロセッサ用のGCCガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。