LLVM の紹介

同カテゴリーの次の記事

oneAPI Image Processing Library によるポータブルな高速画像処理

この記事は、インテル® デベロッパー・ゾーンで公開されている「Getting to Know LLVM」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


LLVM (英語) は、本来 C と C++ 言語向けに開発されたフリーのオープンソース・コンパイラー基盤です。LLVM は当初 Low Level Virtual Machine (低レベル仮想マシン) の略称として使用されていましたが、現在では仮想マシン以外の技術も表わすようになっています。もはや LLVM は上記の略称だけを示すものではありません。

LLVM の中核を成すコンポーネントは、言語に依存しない中間表現 (IR) です。IR はコンパイラー・システムの中間レイヤーとして機能し、低レベルの IR を生成します。そして、低レベル IR は、ターゲットマシンに最適化されたアセンブリー言語コードに変換されます。または、実行時にバイナリー・マシン・コードのレベルまで落とし込むこともできます。

この記事では、LLVM ベースのコンパイラーの利点とクロスアーキテクチャー機能を調査し、インテルの LLVM ベースの oneAPI コンパイラーの例をいくつか紹介します。

LLVM の歴史

LLVM プロジェクトは、2000年にイリノイ大学アーバナ・シャンペーン校の Vikram Adve 氏と Chris Lattner 氏によって開始されました。モジュール化され、異なるコンパイラーのフロントエンドやバックエンドと迅速に統合できるように設計されています。

今日、LLVM は研究目的のプロジェクトから、業界標準の多くの商用コンパイラーのベースとなるまでに成長しています。さらに、このプロジェクトは、Go*、Haskell*、OCaml、Rust*、Scala*、Nimrod*、JavaScript*、Objective-C*、C#、Fortran、Python* など多数の言語でも実装されています。

LLVM は、リンカー、アセンブラー、デバッガー、およびコンパイラー (インテル® oneAPI で利用可能な) など、さまざまなシステムで利用されています。インテルはこれまで、これらのコンパイラーは Open64 基盤をベースにしていました。現在、インテルは LLVM を採用した C/C++ と Fortran コンパイラーを提供しています。

LLVM ベース・コンパイラーの利点

LLVM ベースのコンパイラーは、開発者や企業の組織において多くの利点があります。いくつかの利点について考えてみます。

開発時間の短縮

LLVM は、さまざまなコンパイラー・フレームワークを提供する製品品質のコンパイラー基盤です。LLVM ベースのコンパイラーでは、同じコンポーネントを毎回スクラッチから記述することなく、LLVM コミュニティーですでに開発およびテストされたコンポーネントを利用できます。これにより、開発者はプロジェクトの独自な側面に集中でき、コードを新たに記述する時間を軽減できます。

容易な保守と最適化

LLVM コンパイラーは軽量で保守が容易です。LLVM コンパイラーは、コードを仮想マシンが実行できるネイティブ・オブジェクト・ファイルやバイトコードにコンパイルします。コンパイラーの中には、中間アセンブリー・コードを生成したり、バイナリー実行ファイルを出力できるものもあります。それらのコンパイラーは、メモリー容量に制限があったり、パフォーマンスが重視される組込みシステムでの利用が想定されています。また、スーパーコンピューターの分野では、大規模ワークロードの実行速度を最適化するために利用され、多くの成功を収めています。

LLVM はモジュール化されたライブラリーで構成されるため、必要なコンポーネントのみを利用することができます。コンパイラーがどのコンポーネントと最適化を利用するかを自由に選択できます。また、必要であれば独自の最適化機能をパイプラインに挿入することもできます。

柔軟性

LLVM コンパイラーは、低レベル (マシンコード) および高レベル (可読性があるコード) の機能を持つプログラミング言語をサポートする柔軟性を備えています。そのため、新機能を追加したり、既存の機能を変更する場合にコンパイラーをスクラッチから開発することなく、カスタム化されたプログラミング言語を作成することができます。

つまり、新しい言語やターゲット・アーキテクチャーに対応したフロントエンドやバックエンドを容易に作成することができます。さらに、LLVM コンパイラーの基盤を活用することで、コンパイラー自体を変更することなく、テストツールや解析ツールを開発することができます。

移植性

LLVM は、異なるコンパイラーのバックエンドをターゲットにできるよう設計されています。開発者が選択したプラットフォーム向けのマシンコードを生成するのに利用できます。また、LLVM は動的プログラミング言語向けのアセンブラー、逆アセンブラー、リンカー、JIT (ジャストインタイム) コンパイラーなどの機能も提供します。コンパイラーがマシンコードではなく、LLVM の IR コードをターゲットにすることにより、コンパイラーのフロントエンドから直接マシンコードを生成するよりも高い移植性を達成することができます。これによりコンパイラーはさまざまなプラットフォームで動作できるため、このコンパイラーで開発したアプリケーションは新しいプラットフォームに容易に移行できます。

インテル® oneAPI コンパイラーのオプション

コンパイラーを使い分けることで、コードの生成や最適化を制御できます。LLVM ベースの oneAPI コンパイラーとして、インテル® oneAPI DPC++/C++ コンパイラーとインテル® Fortran コンパイラー (IFX) があります。

インテル® oneAPI DPC++/C++ コンパイラー

oneAPI のデータ並列 C++ (DPC++) コンパイラーは、インテルが主導するプロジェクトであり、大規模で時間を要するコードを変更することなく異なる計算システム間で実行するプログラムを作成することができます。インテル® oneAPI DPC++/C++ コンパイラーは、CPU、GPU、FPGA、および他のアクセラレーター・ハードウェア向けのデータ並列 C++ コードをコンパイルする単一ソースコードのソリューションです。コンパイラーは、Linux* と Windows* オペレーティング・システムをサポートします。LLVM をベースに構築され、Clang フロントエンド、C++ をサポートする SYCL* 2020 規格、および OpenCL* カーネルを同一ソースファイルで利用できます。

SYCL* は、Khronos Group (英語) によるオープン標準です。標準 C++ をベースとした単一ソースのプログラミングを、ヘテロジニアス・コンピューティング・プラットフォーム向けに提供します。

インテルは DPC++ を通して SYCL* 仕様 (一部の拡張もあります) を実装しています。DPC++ コンパイラーは、SYCL* 2020 のプロトタイプで参照されただけではなく、提供する多くの機能も SYCL* 2020 で採用されています。これは、DPC++ コンパイラーが、SYCL* 2020 プロジェクトに関わるプログラマーにとって、最良の選択肢となることを意味します。インテルは DPC++ によって、インテル製の GPU、CPU、および FPGA をターゲットとしています。

Clang フロントエンドの LLVM テクノロジーをベースとした DPC++/C++ コンパイラーにより、すべてのアクセラレーターで動作するコードを共通の標準化されたプログラミング手法で記述できます。これにより、複数の開発工程を維持する必要がなくなり、開発コストの軽減にもつながります。また、ハードウェア・プラットフォーム間でのコードの移植も容易になります。OpenMP* 5.0 および 5.1 の target オフロードをインテル® GPU ターゲットで実現します。

コンパイラーには、icx、icpx、dpcpp の 3 つのコンパイラー・ドライバーが含まれており、固有のサポート要件に合わせてコードの調整をさらに簡素化できます。これらのドライバーは、それぞれ C プログラム (icx)、C++ プログラム (icpx)、SYCL* 拡張機能付きの C++ プログラム (dpcpp) のコンパイルとリンクに使用します。Windows* システムでは、dpcpp SYCL* 拡張をサポートするドライバーは、dpcpp-cl というエリアスがあります。dpcpp SYCL* 拡張機能でコンパイルすると、将来の高速化のニーズに対応できる柔軟性も備わります。

インテル® Fortran コンパイラー (IFX)

ifx (英語) は、LLVM バックエンド・コンパイラー技術を採用した Fortran コンパイラーであり、フロントエンドとランタイム・ライブラリーはインテル® Fortran コンパイラー・クラシックをベースにしています。Fortran 77 から Fortran 95 までの言語規格、Fortran 2003 から Fortran 2018 までのほとんどの機能をサポートする基本モードを備えています。また、OpenMP* 5.0/5.1 および OpenMP* 4.5 のオフロード機能、ディレクティブをサポートしています。

LLVM ベース・コンパイラーのクロスアーキテクチャー機能

多くのコンパイラーは、NVIDIA* GPU 向けの NVCC のように、単一アーキテクチャーをターゲットにしています。近年の LLVM コンパイラー基盤の進化により、LLVM ベースのコンパイラーは複数のアーキテクチャー・ドメインをターゲットにすることができるようになりました。例えば、Clang C/C++ コンパイラーは、LLVM フレームワークを利用して CPU 向けの実行コードを生成できます。Clang はまた、適切なランタイム・ライブラリーをターゲットにすることで、異なる GPU や FPGA デバイスで実行できるコードを生成することができます。

LLVM ベースのコンパイラーは、NVIDIA* NVPTX バックエンドを利用して、GPU と FPGA へのオフロードもサポートしています。これらのコンパイラーは、ソースコードを解析して中間表現 (IR) を生成するフロントエンドと、ユーザーが指定するさまざまなアーキテクチャーに対応したマシンコードを生成するバックエンドを備えています。アクセラレーターごとに個別のリソースを利用するのではなく、インテル® DPC++ の統合共有メモリーなどの機能を使用して、効率良くリソースを共有できます。

GPU および FPGA オフロードは、次のインテル® oneAPI 製品ではデフォルトで有効になっています。

  • インテル® oneAPI HPC ツールキット
  • インテル® oneAPI ベース・ツールキット
  • インテル® AI アナリティクス・ツールキット

Clang コンパイラーは、GNU* コンパイラー・コレクション (GCC) とはフロントエンドが異なりますが、バックエンドは同じ LLVM です。GCC ツールチェーンと同じコード生成ツールチェーンと最適化パスを使用します。

1 つのコンパイラーでアプリケーションを構築しつつ、計算要件に応じてアプリケーションの一部をオフロードして GPU や FPGA で実行することが可能になります。これにより、特殊計算コアを最小限の労力で利用することができます。グラフィックスや AI アクセラレーターを必要とするアプリケーションでは、それらのプラットフォーム向けの並列化に必要な個別のコードベースの修正を回避できるため特に強力な機能であると言えます。

さらに、従来は手作業で行っていた最適化タスクを自動化できます。人材を追加雇用したり、コードの最適化に時間をかけることなく、複数のデバイスに対応するアプリケーションを迅速に作成できます。

最後に

XPU を含む使用事例を開発する、あるいは既存の GPU や FPGA コードから新しいアーキテクチャーに移行する場合、LLVM コンパイラーは皆さんの計画において重要なコンポーネントになります。LLVM ベースのコンパイラーは、ビルド時間を短縮し、柔軟性、移植性、そして保守と最適化の容易性を備えています。

インテル® oneAPI は、開発を簡素化し、多様なアーキテクチャー間でソフトウェアの移植性を可能にする標準的なプログラミング・モデルを提供します。

oneAPI を使用して、クロスアーキテクチャーの機能を理解し、アーキテクチャーを高速化する利用法を試してください。また、インテルは oneAPI の機能を最大限に活用できるよう、データ並列 C++ のトレーニング (英語) を提供しています。

導入のためのリソース

関連情報

記事

  • インテルの CPU とGPU 向けの LLVM および GCC のベクトル化
    読む
  • ヤコビ反復法を CUDA* から SYCL* へ移行する
    読む
  • ヘテロジニアスな処理にはデータ並列化が必要: SYCL と DPC++ から始めよう
    読む
  • ベクトル化を利用したデータ・アナリティクス向け LLVM コード生成の最適化
    読む

ウェビナー

  • 最新のインテルの LLVM ベースのコンパイラーを使ってみる
    見る (英語)
  • インテル® oneAPI DPC+/C+ コンパイラーのプラグマと組込み関数
    見る (英語)
  • 新しいインテル® oneAPI DPC++/C++ コンパイラーへの移行
    見る (英語)

ポッドキャスト

  • SYCL* 標準でイノベーションをさらに進化
    聴く (英語)
  • ヘテロジニアス・アーキテクチャー間での GROMACS の移植
    聴く (英語)

ソフトウェアの入手方法

インテル® oneAPI ベース・ツールキット
多様なアーキテクチャーでハイパフォーマンスなデータセントリックのアプリケーションを開発するツールとライブラリーを使用して開発を始めてください。

入手する (英語)
すべてのツールを見る (英語)

関連記事

  • インテル® oneAPI 2021.4 リリースインテル® oneAPI 2021.4 リリース この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® oneAPI 2021.4 update available」の日本語参考訳です。 公開日: 2021 年 10 月 1 日 インテル® oneAPI ツールキットの最新のアップデート (2021.4) […]
  • DPC++ への Codeplay の貢献により NVIDIA* GPU の SYCL* サポートを提供 この記事は 2020 年 2 月 3 日に Codeplay のウェブサイトで公開された「Codeplay contribution to DPC++ brings SYCL support for NVIDIA GPUs」を Codeplay の許可を得て日本語訳したものです。 Codeplay は当初から SYCL* […]
  • ヘテロジニアス・プログラミング向けのレベルゼロ API の紹介ヘテロジニアス・プログラミング向けのレベルゼロ API の紹介 この記事は英国マンチェスター大学の Dr. Juan Fumero のブログで公開されている「Introduction to Level Zero API for Heterogeneous Programming」を著者の許可を得て翻訳した日本語参考訳です。 この記事の PDF […]
  • 開発者が実感する oneAPI の価値開発者が実感する oneAPI の価値 この記事は、インテル® デベロッパー・ゾーンに公開されている「Developers Realize the Value of oneAPI」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。 Scott Apeland デベロッパー・リレーションズ […]
  • oneAPI が私をインテルに引き戻した理由oneAPI が私をインテルに引き戻した理由 この記事は、LinkedIn で公開されている James Reinders 氏の「How oneAPI enticed me back to Intel」を同氏の許可を得て翻訳した日本語参考訳です。 oneAPI は、2019 […]