Introducing GNU Compiler Collection (GCC) and Clang/Low Level Virtual Machine (LLVM); comparing the performance of both C/C++ compilers
Visual C++, GNU Compiler Collection (GCC), and Clang/Low Level Virtual Machine (LLVM) are three mainstream C/C++ compilers in the industry. Visual C++はグラフィカルユーザーインターフェイス(Gui)を提供し、デバッグは簡単ですが、Linuxプラットフォームには適していません。 したがって、このドキュメントでは主にGccとClang/LLVMを比較します。GCCはGNUによって開発されたプログラム言語コンパイラです。 GNU General Public License(GPL)とGNU Lesser General Public License(LGPL)の下でリリースされたフリーソフトウェアのセットです。 これは、GNUおよびLinuxシステムの公式コンパイラであり、他のUNIXオペレーティングシステムをコンパイルして作成するための主なコンパイラです。
LLVMには、一連のモジュール化されたコンパイラコンポーネントとツールチェーンが含まれています。 コンパイル、実行時、およびアイドル時間中にプログラム言語とリンクを最適化し、コードを生成できます。 LLVMは、複数の言語のコンパイラの背景として機能することができます。 ClangはC、C++、Objective-C、またはObjective-C++コンパイラで、LLVMに基づいてC++でコンパイルされ、Apache2.0ライセンスの下でリリースされています。 Clangは主にGCCよりも優れたパフォーマンスを提供するために使用されます。
長期的な開発と反復を通じて、GCC、Clang、LLVMは業界で成熟したコンパイラになっています。 では、どのコンパイラが優れていますか? プログラムやシステムをコンパイルして構築するには、どれを使用すべきですか?
優れたコンパイラの重要性
現代のプロセッサはすべて、スーパースカラーと長いパイプライン、複雑な内部構造を持ち、複雑な命令セットコンピュータ(CISC)または縮小命令セットコンピュータ(RISC)アーキテクチャにおけるベクトル拡張ユニットをサポートしている。 一般的な計算集約型カーネルを含む多くのプログラムでは、プログラマはvector extensionコマンドを使用してプログラムの実行パフォーマンスを大幅に向上させることができます。 たとえば、行列演算とベクトル演算では、乗算と加算を組み合わせたコマンドを使用して、パフォーマンスと精度を向上させます。 ビットマスクコマンドは、ベクトル演算の分岐処理に使用されます。 しかし、最高のパフォーマンスを達成するためには、プログラマやコンパイラは、複雑なメモリアクセスモードや非標準カーネルでタスクを処理するために多くの労力を費やす必要があります。
さらに、現代の高度な言語の標準は、特定の操作命令やメモリアクセスパスの代わりに、より論理的で数学的な一般的なコードを生成するために、基になるハードウェアとデータ構造の詳細を常に抽象化しています。 C++標準はますます表現力と抽象化されています。 Pythonは、より読みやすく表現力があるため、実行速度が低くても人気があります。 表現力が高いほど、プログラマがコンパイルした複雑な構造から優れたアセンブリコードを生成するコンパイラの負担が増加します。 コンパイラは、コードを使用してパフォーマンスを最大化するために、よりスマートで、より懸命に働く必要があります。 すべてのコンパイラがこれを行うことはできません。 コンパイラを選択する際には、まず、同じコードセグメントがより効率的なアセンブリコマンドを生成できるかどうかを検討する必要があります。
高性能な実行可能プログラムを生成することに加えて、現代のコンパイラも高性能でなければなりません。 C++の大規模なソフトウェアプロジェクトには、数百から数千の個々の翻訳単位が含まれている可能性があります。 各翻訳単位には、何千行ものコードが含まれています。 C++コードでは、多数のテンプレートベースのプログラミング技術を使用することもできます。 これらの技術では、コンパイラがターゲットファイルを生成するために関連する情報を複数回転送する必要があります。 大規模なC++プロジェクトのコンパイルには数時間かかることがあり、開発中に相互に依存する複数の変更を同時に送信する必要があります。 各提出には、開発者がほとんどのコードライブラリを再コンパイルする必要があります。 したがって、大規模なチームの高い生産性を達成するためには、より高速なコンパイラ(ビルドツール)が重要です。
言語拡張の面では、複数のカーネル、ベクトル処理能力、およびアクセラレータを備えた現代のコンピューティングシステムは、一般的なプログラミング言語の自然な能力よりも優れた機能を提供します。 したがって、OpenMPやOpenACCなどの特定の高性能コンピューティング(HPC)フレームワークは、このギャップを埋めることができます。 これらのフレームワークは、プログラマがコード内で並列処理を表現するために使用できるアプリケーションプログラムインタフェース(Api)を提供します。 コンパイラと対応するランタイムライブラリは、並列コードをプロセッサアーキテクチャにマップする必要があります。 多くのHPCプロジェクトは、開発者やハードウェアメーカーによって拡張されているOpenMPとOpenACC標準に依存しています。 したがって、コンパイラは言語拡張標準の開発に追いつく必要があります。
結論として、優れたコンパイラは、その欠点と戦うのではなく、プログラミングのプロセスに焦点を当てることができます。 最新の言語標準をサポートし、最も抽象的なコードから最適化されたコマンドを生成し、より短い時間でソースコードをコンパイルできます。
GCC開発履歴
GCCを学ぶ前に、まずGNUプロジェクトを理解する必要があります。 Richard Stallmanは1984年にGNUプロジェクトを立ち上げ、UNIXのようなオープンソースソフトウェアシステムを構築しました。 GNUオペレーティングシステムは、時間の経過とともに広範囲に進化していません。 しかし、Make、Sed、Emacs、Glibc、GDB、GCCなど、多くの優れた有用なオープンソースソフトウェアツールをインキュベートしています。 これらのGNUオープンソースソフトウェアとLinuxカーネルは共にGNU/Linuxシステムを構成しています。 当初、GCCはGNUシステムのために、Cプログラミング言語に基づいた安定した信頼性の高いコンパイラを提供しました。 そのフルネームはGNU C Compilerです。 その後、より多くの言語(Fortran、Obj-C、Adaなど)がサポートされ、GCCの正式名称はGNU Compiler Collectionに変更されました。GCC-1.0は、30年以上前の1987年にRichard Stallmanによってリリースされました。 ソフトウェアの観点からは、それは非常に古いです。 誰かが1989年から2012年の間にGCCの開発記録を収集し、30分のアニメーションビデオ(GNU Compiler Collection dev history1989-2012)を制作し、GCCの開発プロセスを直感的に実証しました。 GCCの開発履歴については、そのバージョンから学ぶことができます。
- GCC-1.0:Richard Stallmanによって1987年にリリースされました。
- GCC-2.0:1992年にリリースされ、C++をサポートしました。 その後、リチャード-ストールマンがGCCをgnuシステムの信頼できるCコンパイラとして定義し、当時のGCCはGNUシステムにとって十分であり、開発の焦点はGCCからGNUシステム自体にシフトすべきであると考えたため、GCCコミュニティは分裂した。 他の主要な開発者は、GCCの改善を継続し、さまざまな面でより根本的な開発と改善を行うことを望んでいました。 これらの活発な開発者は1997年にGCCコミュニティを離れ、EGCSフォークを開発しました。GCC-3.0:明らかに、開発者は一般的に良いコンパイラに対する強い欲求を持っていました。 EGCSフォークはスムーズに開発され、より多くの開発者に認識されるようになりました。 最終的に、EGCSは新しいGCCバックボーンとして使用され、GCC-3.0は2001年にリリースされました。 分割された共同体は再び合併されたが、リチャード・ストールマンの影響力はある程度弱まっていた。 さらに、GCC産業委員会はGCCの開発方向を決定し始めていました。
- GCC-4.0:2005年にリリースされました。 このバージョンはTREE Serial Storage Architecture(SSA)に統合され、GCCは現代のコンパイラに進化しました。
- GCC-5.0:2015年にリリースされました。 その後、GCCのバージョンポリシーが調整され、毎年メジャーバージョンがリリースされました。 予想外の利点は、バージョン番号が年に対応することです。 たとえば、GCC-7は2017年にリリースされ、GCC-9は2019年にリリースされました。
今、GCCの開発は”現代のクロニクル”に入っています。 LLVMの競争圧力に直面して、GCCコミュニティは、コンパイルの加速やコンパイル警告情報の改善など、多くの調整を積極的に行ってきました。 過去30年間、GCCはコンパイラ業界の挑戦者からLinuxシステム用の主流のコンパイラに進化し、現在はLLVMの課題に直面しています。 幸いなことに、GCCコミュニティはGCCの開発を加速するための調整を行っています。 私たちは、二つのコンパイル技術の間の競争は、より良いコンパイラをソフトウェア開発者に提供し続けることを期待することができます。ClangとLLVMの開発史
LLVMは、2000年にChris LattnerがUUICで研究したことに由来しています。 Chris Lattnerは、すべての静的および動的言語の動的コンパイル技術を作成したいと考えていました。 LLVMは、BSDライセンスの下で開発されたオープンソースソフトウェアの一種です。 最初のバージョン1.0は2003年にリリースされた。 2005年、アップル社 Chris Lattnerと彼のチームを雇って、Appleコンピュータ用のプログラミング言語とコンパイラを開発し、その後LLVMの開発が急速に進んだ。 LLVM2.5からは、毎年2つのマイナーなLLVMバージョンがリリースされました(一般的には3月と9月にリリースされました)。 2011年11月、LLVM3.0がリリースされ、デフォルトのXCodeコンパイラとなった。 XCode5はデフォルトでClangとLLVM5.0を使用し始めました。 バージョンポリシーはLLVM5.0以降のバージョンで調整されており、毎年2つのメジャーバージョンがリリースされています。 現在の安定バージョンは8.0です。LLVMの名前は、最初に低レベル仮想マシンから省略されました。 このプロジェクトは仮想マシンの作成に限定されないため、LLVMという略語が疑問視されることがよくあります。 LLVMが開発された後、それは多くのコンパイルツールと低レベルのツール技術の総称となり、名前はあまり適切ではありませんでした。 開発者は、この略語の背後にある意味を放棄することに決めました。 現在、LLVMは正式なブランド名となり、LLVM Intermediate Representation(LLVM IR)、LLVMデバッグツール、LLVM C++標準ライブラリなど、LLVMの下のすべてのプロジェクトに適用されます。 LLVMは、従来のコンパイラ、JITコンパイラ、アセンブラ、デバッガ、静的解析ツール、およびプログラミング言語に関連する他の関数として使用できます。2012年、LLVMはUNIX、WWW、TCP/IP、TeX、Javaなどの伝統的なシステムとともに、Association for Computing Machinery(ACM)のソフトウェアシステム賞を受賞しました。 LLVMは、新しいプログラミング言語ツールチェーンの実装を大幅に簡素化します。 近年、Swift、Rust、Juliaなどの多くの新しいプログラミング言語がLLVMをコンパイルフレームワークとして使用しています。 さらに、LLVMはMac OS X、iOS、FreeBSD、Androidシステムのデフォルトのコンパイラになりました。
Clang
Clangは、GCCを置き換えることができるフロントエンドコンパイラを提供するように設計されています。 (株)アップル (NeXT laterを含む)は、GCCを公式コンパイラとして使用しています。 GCCは常にオープンソースのコミュニティで標準コンパイラとしてうまく機能してきました。 しかし、アップル社は、 コンパイルツールのための独自の要件を持っています。 一方で、Apple Inc. Objective-C言語(または後のC言語)に多くの新機能を追加しました。 しかし、GCC開発者はこれらの機能を受け入れず、これらの機能のサポートに低い優先順位を割り当てました。 その後、彼らは単に別々の開発のために二つのブランチに分割され、その結果、Apple Inc.によってリリースされたGCCバージョン。 公式バージョンよりもはるかに早いです。 一方、GCCコードは高度に結合されており、別々に開発することは困難です。 さらに、それ以降のバージョンでは、コードの品質が低下し続けています。 しかし、アップル社が必要とする多くの機能。 (統合開発環境(IDE)のサポートの改善など)は、モジュールとしてGCCを呼び出す必要がありますが、GCCはそのようなサポートを提供しません。 さらに、GCCランタイムライブラリの免除は、LLVM GCCの開発を根本的に制限します。 また、ライセンスによって制限され、Apple Inc. GCCに基づくコード生成品質をさらに向上させるためにLLVMを使用することはできません。 そのため、アップル社は、 GCCを完全に置き換えるために、c、C++、およびObjective-C言語のフロントエンドClangをゼロから書くことにしました。
名前が示すように、ClangはC、C++、およびObjective-Cのみをサポートしています。 Objective-C cloud用のClangは、2009年に本番環境で完全に使用されました。 C++のサポートもすぐに進歩しました。 Clang3.3はC++11を完全にサポートし、Clang3.4はC++14を完全にサポートし、Clang5はC++17を完全にサポートしており、当時はすべてGCCよりも大幅に先行していました。
Clang/LLVMとGCCコミュニティ
他のオープンソースソフトウェアコミュニティと同様に、GCCコミュニティはフリーソフトウェア愛好家やハッカーによっ 開発の過程で、GCCコミュニティの管理と参加メカニズムが徐々に形成されています。 現在、GCCコミュニティは、それぞれの人が明確な役割と義務を持っている比較的安定した明確に定義された知人の社会です。
- Richard StallmanとFree Software Foundation(FSF):GCCコミュ
- GCC産業委員会: これは、GCCコミュニティの問題、技術に依存しないGCC開発トピック、およびレビュアーとメンテナの任命と発表を管理します。 現在は13人のメンバーがいる。
- グローバルメンテナ:彼らはGCCの開発活動を支配しています。 ある程度、彼らはGCCの開発動向を決定します。 現在、GCC産業委員会には13人のグローバルメンテナがいますが、GCC産業委員会には全員が所属しているわけではありません。
- フロントエンド、ミドルエンド、バックエンドメンテナ:フロントエンド、バックエンド、およびその他のモジュールのメンテナです。 彼らは対応するGCCモジュールのコードを担当しており、その多くはモジュールコードの主な貢献者です。 査読者は一般的にこのグループに分類されていることは注目に値する。 違いは、レビュアーは自分のパッチを承認することはできませんが、メンテナはレビュアーの承認なしに責任の範囲内で自分の変更を提出することがで
- 貢献者:彼らはGCCコミュニティの中で最も広範な開発者グループです。 著作権契約に署名した後、すべての開発者は、コミュニティからの承認後の書き込み許可を申請し、自分でコードを提出することができます。
他のオープンソースコミュニティと同様に、成熟したGCCコミュニティはもはやハッカーによって支配されていません。 商業企業は、開発者の募集や開発会議のスポンサーなど、コミュニティで重要な役割を果たし始めました。 現在、GCCコミュニティは以下のタイプの商用企業によって支配されています。
- 主にRedHatとSUSEを含むシステムベンダー。
- 主にIntel、ARM、AMD、およびIBM(PowerPC)を含むチップベンダー、。
- Ada言語に基づいたCodeSourceryやadacoreのようなツールチェーンサービスプロバイダーなどの専門ベンダー。 CodeSourceryは素晴らしい歴史を持ち、多くの有名な開発者を募集しましたが、Mentorに買収された後に辞退しました。
現在のGCCコミュニティでは、チップベンダーがバックエンド開発を支配し、システムベンダーが他の開発分野を指導しています。 コミュニティ開発の面では、GCCコードは現在、独自のSVNサーバーでホストされています。 開発と提出を容易にするためにGit APIが提供されています。 パッチレビューはLinuxカーネルコミュニティのものと似ており、メーリングリスト形式を使用しています。 前述のように、GCCコミュニティは比較的安定した(または閉鎖された)知人社会です。 コミュニティには基本的に毎年150人から200人の積極的な貢献者がいて、毎年9月に開発者会議を開催しています。 2019年9月には、カナダのモントリオールで開発者会議が開催されます。
LLVMコミュニティ
LLVMコミュニティはnoobに優しいコンパイラコミュニティです。 それはすぐに新しいユーザーやパッチレビューの質問に応答します。 これはまた、その後のLLVM財団の議論とLLVMコミュニティ行動規範の採択の基礎と源でもあり、一連の政治的に正しい議論を引き起こします。
すべてのLLVMプロジェクトと問題はDevExpress電子メールリストを通じて議論され、コードの提出はcommits電子メールリストを通じて通知されます。 すべてのバグと機能の変更は、バグリストを通じて追跡されます。 提出されたパッチは、マスターブランチに推奨されます。 このスタイルはLLVMコーディング標準に準拠しており、コードレビューはPhabricatorを介して実行されます。 現在、LLVMコードリポジトリはGitHubに移行されています。GCCコミュニティとは異なり、LLVMコミュニティはLLVM Foundationのみを持っています。 LLVM財団には8人のメンバーがいます。 LLVMコミュニティの管理に加えて、LLVM財団の各メンバーは、技術に関連するLLVM開発の問題をガイドする必要があります。 現在、社長はTanya Lattner、Chris Lattnerの妻です。 Chris Lattner自身も財団のメンバーであり、LLVMコミュニティとLLVMの開発方向を強力に管理しています。
LLVMコミュニティのコードレビューポリシーは、基本的にGCCコミュニティのものと同じです。 違いは、LLVMの高速な開発のために、多くの貢献者はコミットアクセス権限を持たず、メンテナを通じてコードを送信する必要があることです。 現在、ClangおよびLLVMコミュニティには毎年1,000人以上の貢献者がいます。 一般的に、開発者会議は毎年4月と10月に開催されます。 2019年10月の開発者会議は、米国のサンノゼで開催されます。
LLVMライセンスがUIUCライセンスからAPACHE2.0ライセンスに変更され、LLVM例外があります。 主に、LLVMランタイムライブラリがMITライセンスに基づいており、プロジェクトに必要な特許承認が広すぎるという問題を解決するために使用され このライセンスの下では、LLVMは誰でも制限なしにLLVMから商用製品を派生させることができ、派生物がオープンソースコードを提供することを必要としないため、LLVMの広範な使用を促進している。:LLVMの全部または一部を個人的、社内的、または商業的な目的でダウンロードまたは使用すること。
- LLVMの全部または一部を個人的、社内的、または商業的な目的のためにダウンロードまたは使用すること。 プロジェクトに貢献することなくLLVMコードを変更する機能。
- LLVMを含むパッケージまたはリリースバージョンの作成。 LLVMと他のすべての主要なオープンソースライセンス(BSD、MIT、Gplv2、およびGplv3を含む)によって承認されたコードとの関連付け。
- LLVMを再度配布する場合は、著作権表示を保持する必要があります。 著作権ヘッダーを削除または置換することはできません。 LLVMを含むバイナリファイルには、著作権表示が含まれている必要があります。
GCCとLLVMのパフォーマンス比較
アーキテクチャ:x86_64
プロセッサ:Intel(R)Xeon(R)[email protected]
L1データキャッシュ:32KB
L2キャッシュ:1,024KB
L3キャッシュ:33,792KB
メモリ:800GB
オペレーティングシステム:Alibaba Group Enterprise Linux Server release7.2(パラディン)
カーネル:4.9.151–015.アリ3000アリオス7x86_64
コンパイラ:Clang/LLVM8.0GCC8.3.1
Benchmark
SPEC CPU2017は、CPU、キャッシュ、メモリ、およびコンパイラをテストするためのCPUサブシステストツールのセッ これには、整数速度と浮動小数点演算速度をテストするSPECspeed2017INTとFP、整数同時実行率と浮動小数点同時実行率をテストするSPECrate2017INTとFPなど、4つのカテゴ ClangはFortran言語をサポートしていません。 したがって、この例では、仕様速度テストセット内のC/C++プログラムを使用して、ClangとGCCによって生成されたバイナリプログラム間のシングルコ 次の表は、CPU2017CおよびC++セットの仕様を示しています。
CINT2017Speedcfp2017Speed600。6月19日にメジャー契約を結んでアクティブ-ロースター入りした。lbm_s602.gcc_s644.nab_s605.mcf_s620.623.625.x264_s631.deepsjeng_s641.657.XZ_s
テストメソッド
LLVM-lnt自動化フレームワークを使用してテストを実行し、パフォーマンスを比較します。 SPEC CPUのruncpuと同じように動作します。 LLVM-lntが実行される前に、キャッシュ(echo3>/proc/sys/vm/drop_caches)がクリアされ、テストデータセットが実行されます。 次に、refデータセットは3回実行されます。 3つのrefテスト実行結果の平均値が最終結果として使用されます。 CPUの移行やコンテキストスイッチによるパフォーマンスの変動を減らすために、テストデータセットとrefデータセットで実行されているプロセスは、CPU affinity tool コンパイル時のテストでは、このメソッドはスレッド1を使用してテストプログラムを構築し、長い間コンパイルされたテスト項目を比較します。 コンパイル時間にはリンカの実行時間は含まれません。 これには、すべてのテストプログラム内のすべてのソースファイルが生成された時刻のみが含まれます。
コンパイルパフォーマンスの比較
GCCのコンパイルプロセスは次のとおりです: ソースファイルを読み取り、ソースファイルを前処理し、IRに変換し、アセンブリファイルを最適化して生成します。 次に、アセンブラはオブジェクトファイルを生成します。 ClangとLLVMは独立したコンパイラに依存しませんが、バックエンドで自己実装されたコンパイラを統合します。 オブジェクトファイルを生成するプロセスでは、アセンブリファイルを生成するプロセスは省略されています。 オブジェクトファイルはIRから直接生成されます。 さらに、GCC IRと比較して、LLVM IRのデータ構造はより簡潔です。 コンパイル時のメモリ占有率が低く、より高速なトラバーサルをサポートします。 したがって、ClangとLLVMはコンパイル時間の点で有利であり、これは次の図に示すように、SPECコンパイルから得られたデータによって証明されます。 Clangは、GCCと比較してシングルスレッドコンパイル時間を5%から10%短縮します。 したがって、Clangは大規模なプロジェクトの建設に多くの利点があります。P>
スペックの比較コンパイル時間
実行パフォーマンスの比較
ほとんどのクラウドワークロードでは、アプリケーションを異なるクラスターで実行 これらのアプリケーションを作成するときは、マシン関連のパラメータを指定しないでください。 需要の変化に起因する高速イテレーションに適応するには、オフプレミスのワークロードもデバッグ可能である必要があります。 したがって、高いコンパイル最適化レベルを可能にするいくつかの安定した共通ライブラリとは別に、ワークロード自体は低いコンパイルと最適化レベ この要件を満たすために、このドキュメントでは、次の図に示すように、INT SpeedプログラムのO2およびO3最適化レベルでのさまざまなコンパイラのパフ:P>
スペックのパフォーマンス比較cpu2017int speed
gccは、o2およびo3レベルのほとんどのプログラムでclangおよびllvmよりも1%から4%のパフォーマンス上の優位性を持っており、平均してspec cpu2017int speedに対して約3%のパフォーマンス上の優位性を持っています。 600の面で。602となっている。gcc_s/O2、GCCは優れたパフォーマンス上の利点(10%以上)を持っています。 これら二つのテスト項目は顕著なホットスポットを持たず、コンパイラの包括的な最適化効果を反映することができます。 テスト結果は,GCCが性能最適化において常に有利であることを示した。 しかし、631を含む二つのAI関連のプログラムのために。deepsjeng_sと641.仕様テストに新たに追加されたleela_sは、ClangとLLVMはGCCと比較してパフォーマンスを3%以上向上させます。 これはまた、最適化の面でLLVMの急速な進歩を反映しています。 625のために。 x264_s O2最適化では、ケースのホットスポットがベクトル化されたルールに準拠しているため、LLVMはパフォーマンスを40%向上させます。 しかし、ClangとLLVMはo2レベルでベクトルを最適化し、GCCはo3レベルでベクトルを最適化します。 ベクトル化されたプログラムを除いて、GCCはO3レベルでのパフォーマンスをO2レベルでのパフォーマンスと比較して大幅に改善しません。 言い換えれば、プログラムはGCC O3最適化に敏感ではありません。 対照的に、ClangとLLVMはいくつかのプログラム(600など)のパフォーマンスを大幅に向上させます。 602となっている。 o3レベルでのgc_s)。
FP SpeedなどのHPCプログラムは、一般的にハイエンドサーバー上で実行されます。 安定したコアアルゴリズム、パフォーマンス関連のベクトル化と並列化に対する高い要件、および高レベルの最適化(O3以上)を可能にします。 したがって、このドキュメントでは、以下に示すように、O3+march=native(skylake-avx512)最適化レベルでのパフォーマンスを比較します:/div>仕様cpu2017fp速度の
二つのfpプログラムのために、gccはまた、約3%のパフォーマンスを向上させることができます。 ClangとLLVMはループ最適化において保守的であり、したがってパフォーマンスにおいて有利ではない。 しかし、ClangとLLVMのPollyサブプロジェクトは、機械学習、高性能コンピューティング、異種コンピューティング最適化に広く適用されている高レベルループとデータ局所性オプティマイザを提供しています。 私はPollyがベクトル化と並列化のルールに準拠したホットスポットループを含むプログラムのパフォーマンスを大幅に向上させることができると思 また、一連のベンチマークとワークロードでPollyのパフォーマンスを分析します。
おわりに
上記のベンチマークテストから、Clangは大規模プロジェクトの構築にはより多くの利点があり、GCCはパフォーマンスの最適化には常に Blaは特定のアプリケーションに依存します
パフォーマンスの比較に加えて、GCCとClangとLLVMの長所と短所を共有したいと思います。
GCCの利点
- GCCは、ClangとLLVMよりも伝統的な言語、Ada、Fortran、Goなどをサポートしています。
- GCCはあまり普及していないアーキテクチャをサポートし、ClangやLLVMよりも前のRISC-Vをサポートしています。
- GCCは、ClangやLLVMよりも多くの言語拡張とアセンブリ言語機能をサポートしています。 GCCはまだLinuxカーネルをコンパイルするための唯一のオプションです。 ClangやLLVMを用いたカーネルコンパイルに関する研究も業界で報告されているが、ソースコードやコンパイルパラメータを変更しなければカーネルをコンパイルすることはできない。ClangとLLVMの利点
- 新興言語は、Swift、Rust、Julia、RubyなどのLLVMフレームワークを使用しています。ClangとLLVMは、GCCよりも厳密にCおよびC++標準に準拠しています。 GCCのアップグレード中のGNU Inlineやその他の問題は発生しません。
- Clangは、スレッドセキュリティチェックの属性など、いくつかの拡張機能もサポートしています。
- Clangは、静的解析のためのscan-buildやclang static analyzer、構文解析のためのclang-formatやclang-tidy、エディタプラグインClangdなどの便利なツールを提供します。
- Clangは、より正確でわかりやすい診断情報を提供し、エラーメッセージ、エラー行、エラー行プロンプト、および修復提案を強調表示します。 Clangは、診断情報を機能と見なします。 診断情報はGCC5.0からのみ改善され始め、GCC8で成熟しました。
(Ma Jun马骏によるオリジナル記事)