CPU および GPU 上のハイパフォーマンス SIMD プログラミング向けオープンソース・コンパイラー
このページは、ispc github に公開されている https://ispc.github.io/index.html の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
概要
概要
インテル® インプリシット SPMD プログラム・コンパイラー (インテル® ISPC) は、「単一プログラム複数データ (SPMD)」 (英語) プログラミング向けの拡張機能を備えた、C プログラミング言語のバリアント・コンパイラーです。SPMD モデルでは、プログラマーは通常シリアルプログラムのように見えるプログラムを作成しますが、実行モデルでは、ハードウェア上で複数のプログラム・インスタンスが並列に実行されます (この概念を説明する詳しい説明と例については、インテル® ISPC ドキュメントを参照してください)。
インテル® ISPC は、C ベースの SPMD プログラミング言語をコンパイルして、CPU と GPU の SIMD ユニットで実行します。多くの場合、4 レーンのインテル® SSE ベクトルユニットをサポートするアーキテクチャーでは 3 倍以上、8 レーンのインテル® AVX ベクトルユニットをサポートするアーキテクチャーでは 5 倍から 6 倍の高速化が実現でき、組込みコードを記述するような煩わしさはありません。複数のコアを活用する並列処理もインテル® IPSC でサポートされるため、コア数とベクトルユニット幅の両方にスケーリングするパフォーマンス向上を実現するプログラムを作成できます。
インテル® ISPC の設計にはいくつかの重要な原則があります。
- CPU と GPU 上で SPMD を実行することを望むパフォーマンス志向のプログラマーに、良好なパフォーマンスを発揮する C 言語の拡張セットを提供します。
- プログラマーとハードウェアの間に軽量な抽象化レイヤーを提供します。特に、プログラマーがコンパイルされたアセンブリー言語とベースとなるハードウェアへのソース・プログラムのマッピングを明確に推論できる実行モデルとデータモデルを持ちます。
- 組込み関数を直接記述するような極めて生産性の低い作業を行うことなく、SIMD ベクトルユニットの計算能力を活用できます。
- C/C++ アプリケーション・コードとインテル® ISPC の SPMD コードが同一プロセッサー上で動作する際の緊密な連携を調査します。それには、2 つの言語間での軽量な関数呼び出しを行い、コピーや再構成なしにポインターを介して直接データを共有します。
インテル® ISPC は BSD ライセンス (英語) に基づくオープンソース・コンパイラーです。バックエンド・コードの生成と最適化に優れた LLVM コンパイラー基盤 (英語) を使用し、GitHub* で提供 (英語) されます。ホスト・オペレーティング・システムとして、Windows*、Linux*、および macOS* をサポートし、Android*、iOS*、および PS4*/PS5* をターゲットとすることもできます。現在、x86 (インテル® SSE2、SSE4、AVX、AVX2、および AVX-512)、ARM* (Neon*)、およびインテル® GPU アーキテクチャー (Gen9 とインテル® Xe アーキテクチャー・ベースのグラフィックス・ファミリー) をサポートしています。
インテル® ISPC のサポートは、GitHub* Issues (英語) と GitHub* Discussions (英語) ユーザーフォーラムによって提供されます。
機能
機能
インテル® インプリシット SPMD プログラム・コンパイラー (インテル® ISPC) は、開発者に多くの重要な機能を提供します。
- C プログラミング言語の拡張としての親しみやすさ: インテル® ISPC は SPMD プログラムを作成する機能を提供しつつ、馴染み深い C 構文とプログラミングの表現をサポートします。
- 高い品質の SIMD コードを生成: インテル® ISPC によって生成されたコードのパフォーマンスは、手動による組込み関数などを使用したコードに匹敵します。
- 既存のソフトウェア・システムで容易に採用: インテル® ISPC で記述された関数は、C/C++ で記述されたアプリケーション関数、およびアプリケーションのデータ構造と相互に運用できます。
- 10年以上の CPU 世代への移植性: インテル® ISPC は、インテル® SSE2、インテル® SSE4、インテル® AVX、およびインテル® AVX2 命令セットをターゲットにします。
- オペレーティング・システム間の移植性: インテル® ISPC は、Microsoft* Windows*、macOS*、および Linux* のすべてをサポートします。
- 標準ツールを使用したデバッグ: インテル® ISPC プログラムは、標準的なデバッガーでデバッグできます。macOS*、Linux* および Windows* をサポートします (Windows* でのデバッグには制限があります)。
ダウンロード
インテル® インプリシット SPMD プログラム・コンパイラーを入手する
インテル® インプリシット SPMD プログラム・コンパイラー (インテル® ISPC) は、ソースとバイナリーの両方を入手できます。
LLVM 13.0.1 ベースの最新リリースのインテル® ISPC バイナリーは以下です。
メインブランチに対応する最新のインテル® ISPC バイナリーは以下です (LLVM 14.0 ベース)。
- Windows* (64 ビット) 用インテル® ISPC バイナリーとサンプル (v1.19.0dev)
https://ci.appveyor.com/api/projects/ispc/ispc/artifacts/build%2Fispc-trunk-windows.zip?job=Environment%3A%20APPVEYOR_BUILD_WORKER_IMAGE%3DVisual%20Studio%202019%2C%20LLVM_VERSION%3Dlatest - Linux* (64 ビット) 用インテル® ISPC バイナリーとサンプル (v1.19.0dev)
https://ci.appveyor.com/api/projects/ispc/ispc/artifacts/build%2Fispc-trunk-linux.tar.gz?job=Environment%3A%20APPVEYOR_BUILD_WORKER_IMAGE%3DUbuntu1804%2C%20LLVM_VERSION%3Dlatest
以下は、実験的な NVPTX サポートを含む LLVM 3.5 ベースのバイナリーです。
コンパイラーをインストールするには、プラットフォームに対応したバイナリー実行可能ファイルを PATH にインストールします。次に、ディストリビューションの examples/ ディレクトリーにあるインテル® ISPC ユーザーガイドと例を参照してください。
以前のバージョンは GitHub* リリースページ (英語) からダウンロードできます。
また、ソースコードをダウンロードすることもできます。git を利用できる場合は、次を実行してください。
% git clone https://github.com/ispc/ispc.git ispc
ソースを含む zip および tar ファイルをダウンロードできます。
- ソースツリーの最上位からの zip ファイル (英語)
- ソースツリーの最上位からの tar.gz ファイル (英語)
- 上記のバイナリーに対応する v1.18.0 のソースの zip ファイル (英語)
- 上記のバイナリーに対応する v1.18.0 のソースの tar.gz ファイル (英語)
インテル® ISPC の Wiki に、Windows*、Linux*、および macOS* でのソースのビルド (英語) に関する手順が記載されたページがあります。
ドキュメント
ドキュメント
インテル® ISPC を使用したプログラミングを学ぶ際に参照できるリソースは、沢山あります。
インテル® ISPC 言語の使い方を紹介する、簡単なプログラム例を使用した手順 (英語) が用意されており、主要な機能と言語構造の一部が紹介されています。
この例を調査し、言語と標準ライブラリーに関する完全なリファレンスを提供するユーザーガイド と、GPU サポートに関する追加情報を示す インテル® Xe アーキテクチャー向けインテル® ISPC ユーザーガイドを参照してください。パフォーマンス・ガイドには、システムで最良の結果を得るために役立つ情報が説明されています。
インテル® ISPC ディストリビューションの examples/ ディレクトリーには、この言語を使用して各種計算を高速化する 10 あまりの例が用意されています。これらは、すべてシリアル C++ 実装をベースとしているため、それぞれのアルゴリズムのインテル® ISPC と C++ 実装の違いを簡単に比較できます (このコードは、GitHub* で直接閲覧 (英語) することもできます)。
インテル® ISPC: ハイパフォーマンス CPU プログラミング向けの SPMD コンパイラー:
InPar 2012 (英語) で紹介された Matt Pharr と William R. MarkA によるテクニカルペーパーです。インテル® ISPC 実装の設計と主要な特徴が説明されています。
よくある問い合わせ (FAQ) (英語) のリストには、新しいトピックが次々と追加されています。
リソース
リソース
パフォーマンス
パフォーマンス
インテル® ISPC の SPMD プログラミング・モデルにより、最新の CPU では SIMD ベクトルユニットから利用可能な計算能力を容易に引き出すことができます。また、C 言語をベースにしているため、プログラマーは容易に生産性を高めることができます。このページでは、インテル® ISPC ディストリビューションの examples/ ディレクトリーにあるワークロードを使用したインテル® ISPC のパフォーマンスについてまとめています。
これらの結果は、インテル® AVX 命令セットを使用し、4 コア 3.40GHz のインテル® Core™ i7 プロセッサーを搭載した Apple* iMac* で測定されました。比較の基準は、Mac* OS X* 10.7.2 で配布されている gcc 4.2.1 でコンパイルされたリファレンス C++ 実装です (リファレンス実装は、examples/ ディレクトリーにも含まれています)。
Workload | インテル® ISPC 1 コア |
インテル® ISPC 4 コア |
---|---|---|
AOBench (英語) (512 x 512 解像度) | 6.19x | 28.06x |
二項オプション (英語) (128,000 オプション) | 7.94x | 33.43x |
ブラック・ショールズ・オプション (英語) (128,000 オプション) | 8.45x | 32.48x |
遅延シェーディング (英語) (1280p) | 5.02x | 23.06x |
マンデルブロ集合 (英語) | 6.21x | 20.28x |
パーリンノイズ関数 (英語) | 5.37x | n/a |
レイトレーサー (英語) (Sponza データセット) | 4.31x | 20.29x |
3D ステンシル (英語) | 4.05x | 15.53x |
ボリューム・レンダリング (英語) | 3.60x | 17.53x |
次の表は、Microsoft* Windows Server* 2008 Enterprise を実行する、インテル® SSE4 命令セットをサポートするインテル® Xeon® E7-8870 プロセッサー (2.40Ghz、40 コア) システムでのスピードアップを示しています。シリアル C/C++ ベースラインのコードは、Microsoft* Visual C++* 2010 でコンパイルされています。
ワークロード | インテル® ISPC 40 コア |
---|---|
AOBench (2048 x 2048 解像度) | 182.36x |
二項オプション (2,000,000 オプション) | 63.85x |
ブラック・ショールズ・オプション (2,000,000 オプション) | 83.97x |
レイトレーサー (Sponza データセット) | 195.67x |
ボリューム・レンダリング | 243.18x |
製品および性能に関する情報
性能は、使用状況、構成、その他の要因によって異なります。詳細については、http://www.intel.com/PerformanceIndex/ (英語) を参照してください。
共著者
ドキュメント
インテル® インプリシット SPMD プログラム・コンパイラー (インテル® ISPC) は、現在インテルの Dmitry Babokin、Arina Neshlyaeva、および Deepak Rajendrakumaran によって開発されています。Matt Pharr、Ingo Wald、および Jean-Luc Duprat によって開発が開始されました。これは、Ingo Wald の IVL コンパイラーで開発された多くの言語機能と、Geoff Berry と Tim Foley によって記述された解析コードから発展しています。
ほかの貢献者にも感謝します。Alex Reece、Aleksandr Bezzubikov、Aleksandr Pronin、Andreas Wendleder、Andrey Guskov、Anton Mitrokhin、Anton Schreiner、Ben Harper、Daniel Schubert、Dmitry Ryabtsev、Evghenii Gaburov、Gabe Weisz、Giordano Salvador、Ilia Filippov、Jan Zielinski、Jefferson Amstutz、John Poole、Lu Guanqun、Mark Lacey、Michael Liao、Nipunn Koorapati、Peng Tu、Pete Couperus、Pierre-Antoine Lacaze および Vsevolod Livinskij。
インテル® ISPC は、GitHub* で「オープン」に開発されています。皆様による貢献と改善はいつでも大歓迎です。