ChipStar を使用すると、デバイスの中間表現として SPIR-V をサポートするプラットフォーム上で HIP および CUDA アプリケーションをコンパイルして実行できます。低レベルのランタイム代替手段として OpenCL と Level Zero をサポートします。
ユーザードキュメント
開発者向けドキュメント
サポートされている(未)機能のリスト
ChipStar は当初、(現在は廃止されている) HIPCL プロジェクトと HIPLZ プロジェクトで行われたプロトタイピング作業を組み合わせて構築されました。
学術出版物で ChipStar を引用する場合は、OpenCL バックエンドについて議論する場合は HIPCL ポスター要約を参照し、レベル ゼロ バックエンドについて言及する場合は HIPLZ カンファレンス論文を参照してください。チップスターのコア開発者は統合チップスタープロジェクトの適切な記事を書いていますが、それは進行中です。
「chipStar」という名前は、 c
uda とhip
、および典型的なシェルのワイルドカードであるアスタリスクを意味するStar
という単語に由来しており、「CUDA および HIP アプリケーションをどこでも実行できる」ようにするという意図を示しています。このプロジェクトは以前は CHIP-SPV と呼ばれていました。
次のライブラリは、MKL 経由で Intel GPU で動作するように移植されています。
hipBLAS ( -DCHIP_BUILD_HIPBLAS=ON
を追加することで、chipStar の一部としてビルドできます)
hipFTT ( -DCHIP_BUILD_HIPFTT=ON
を追加することで、chipStar の一部としてビルドできます)
ヒップソルバー
ヒップカブ
次のライブラリが移植されており、どのプラットフォームでも動作するはずです。
ロックランド
ロックプリム
必要なライブラリがまだサポートされていない場合は、どのライブラリが必要か、どのようなアプリケーションを構築しようとしているかを記載した問題を開いてください。
これまでに、chipStar は次のアプリケーションを使用してテストされています。
libCEED 私たちのフォークにはいくつかの回避策が含まれています。
GAMESS ソースコードは公開されていません。
HeCBench CUDA ベンチマーク。
最も簡単に始める方法は、事前に構築された Docker コンテナーを使用することです。 Docker README を参照してください。すべてを自分で構築したい場合は、詳細な「はじめに」に従ってください。
ChipStar 1.1 はすでにさまざまな大規模 HPC アプリケーションを正常に実行するために使用できますが、まだ開発段階にあり、多くの既知の問題や未実装の機能があります。パフォーマンスの低い最適化がまだ行われていないことが知られています。ただし、ChipStar は広範囲のテストに対応できると考えており、再現可能なバグ レポートや高品質のプル リクエストの形でコミュニティからの貢献を歓迎します。
1.1、1.0、0.9 のリリース ノート。
cmake >= 3.20.0
Clang および LLVM 17 (Clang/LLVM 15 および 16 も機能する可能性があります)
たとえば、LLVM の Debian/Ubuntu リポジトリを追加し、パッケージ「clang-17 llvm-17 clang-tools-17」をインストールすることでインストールできます。
最良の結果を得るには、LLVM アップストリーム プロジェクトにまだ含まれていない修正が含まれる ChipStar LLVM/Clang ブランチから Clang/LLVM をインストールします。パッチ適用済みバージョンをビルドしてインストールするスクリプトによる方法については、以下を参照してください。
LLVM メジャー バージョンに一致するブランチからの SPIRV-LLVM-Translator: (LLVM 17 の場合は llvm_release_170)、llvm-spirv。
ビルドされた llvm-spirv バイナリが Clang バイナリと同じパスにインストールされていることを確認してください。そうしないと、Clang が別の llvm-spirv を見つけて使用し、エラーが発生する可能性があります。
まだアップストリームされていないパッチがいくつかある LLVM の ChipStar フォークを使用することをお勧めします。このために、chipStar リポジトリに含まれるスクリプトを使用できます。
./scripts/configure_llvm.sh 使用法: ./configure_llvm.sh --version <バージョン> --install-dir <ディレクトリ> --link-type static(デフォルト)/dynamic --only-necessary-spirv-exts <on|off> --binutils-ヘッダーの場所 <パス>--バージョン: LLVM バージョン 15、16、17、18、19 --install-dir: インストールディレクトリ --link-type: 静的または動的 (デフォルト: 静的) --only-necessary-spirv-exts: オンまたはオフ (デフォルト: オフ) --binutils-header-location: binutils ヘッダーへのパス (デフォルト: 空) ./scripts/configure_llvm.sh --version 17 --install-dir /opt/install/llvm/17.0cd llvm-project/llvm/build_17 make -j 16<sudo> make install
または、次の手順を手動で実行することもできます。
git clone -- Depth 1 https://github.com/CHIP-SPV/llvm-project.git -b chinpStar-llvm-17cd llvm-project/llvm/projects git clone -- Depth 1 https://github.com/CHIP-SPV/SPIRV-LLVM-Translator.git -b chinpStar-llvm-17cd ../..# DLLVM_ENABLE_PROJECTS="clang;openmp" OpenMP はオプションですが、多くの機能がありますアプリはこれを使用します# DLLVM_TARGETS_TO_BUILD 必要な CPU ホスト ターゲットのみをビルドすることでコンパイルを高速化します# CMAKE_INSTALL_PREFIX LLVMcmake -S llvm -B build をインストールする場所 -DCMAKE_BUILD_TYPE=リリース -DLLVM_ENABLE_PROJECTS="clang;openmp" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_INSTALL_PREFIX=$HOME/local/llvm-17 make -C build -j8 all install
少なくとも次の機能がサポートされている OpenCL 2.0 または 3.0 ドライバー:
粗粒度バッファ共有仮想メモリ (SVM)
SPIR-V入力
汎用アドレス空間
プログラムスコープ変数
コンパイルされた CUDA/HIP アプリケーションによっては、さらに OpenCL 拡張機能または機能が必要になる場合があります。たとえば、ワープ プリミティブをサポートするには、OpenCL ドライバーはシャッフル、投票、cl_intel_required_subgroup_size などの追加のサブグループ機能もサポートする必要があります。
インテル コンピューティング ランタイムまたは oneAPI
oneAPI レベルゼロローダー
HIP-SYCL と HIP-MKL の相互運用性の場合: oneAPI
最新のリリースされたソース パッケージをダウンロードして解凍するか、git 経由で開発ブランチのクローンを作成できます。私たちはmain
開発ブランチの安定性を維持することを目指していますが、開発サイクル中に安定性の問題が発生する可能性があります。
Github からソースのクローンを作成するには:
git clone https://github.com/CHIP-SPV/chipStar.gitcd ChipStar git サブモジュール update --init --recursive
mkdir build && cd build# LLVM_CONFIG_BIN は、LLVM が PATH で見つかる場合、または version-sufficed# バイナリ (llvm-config-17 など)cmake を使用していない場合はオプションです。 -DLLVM_CONFIG_BIN=/path/to/llvm-config -DCMAKE_INSTALL_PREFIX=/インストール先のパス すべての build_tests に -j8 をインストールさせる
| -DCHIP_BUILD_HIPBLAS=ON
を追加することで、hipBLAS をコンパイルしてインストールすることもできます。
注: libOpenCL.so (たとえば、 ocl-icd-opencl-dev
パッケージから) がなく、libOpenCL.so.1 だけがインストールされている場合、CMake はそれを見つけることができず、OpenCL バックエンドを無効にします。この問題では回避策について説明します。
ARM Mali G52 GPU で使用するためにチップスターを構築するには、次の手順を実行します。
前述のように LLVM と SPIRV-LLVM-Translator をビルドします。
-DCHIP_MALI_GPU_WORKAROUNDS=ON cmake オプションを使用してチップスターをビルドする
いくつかの制限があります。double 型を使用するカーネルは機能せず、サブグループを使用するカーネルは機能しない可能性があります。
なお、chipStar は ARM が提供する独自の OpenCL 実装に依存しています。 Ubuntu 22.04.2 LTS、ドライバー バージョン OpenCL 3.0 v1.r40p0-01eac0 を使用して、Odroid N2 デバイスでチップスターをコンパイルして実行することに成功しました。
PowerVR GPU で使用するために ChipStar をビルドするには、デフォルトの手順に従うことができます。 PowerVR の OpenCL 実装の問題には自動回避策が適用されています。
いくつかの制限があります。double 型を使用するカーネルは機能せず、サブグループを使用するカーネルは機能しない可能性があり、CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST などの予期しない OpenCL エラーやその他の問題が発生する可能性もあります。
ChipStar は、Imagination Technologies が提供する独自の OpenCL 実装に依存していることに注意してください。 VisionFive2 の事前構築済み Debian イメージ 202403、ドライバー バージョン 1.19 を使用して、VisionFive2 デバイスでチップスターをコンパイルして実行することに成功しました。他の SBC では追加の回避策が必要になる場合があります。
単体テストの実行に使用でき、さまざまなプラットフォームで失敗する既知のテストを除外するスクリプトcheck.py
があります。使い方は以下の通りです。
BUILD_DIR={ビルド ディレクトリへのパス。 build_tests ターゲットがビルドされていることを確認してください} BACKEND={opencl/level0} ^ テストするバックエンド/ドライバー/プラットフォーム: "opencl" = インテル OpenCL ランタイム、"level0" = インテル LevelZero ランタイム DEVICE={cpu,igpu,dgpu,pocl} # テストするデバイスの種類。^ これにより、予想されるテスト合格リストが選択されます。 「igpu」は Intel Iris Xe iGPU、「dgpu」は Data Center GPU Max シリーズや Arc などの一般的な最近の Intel dGPU です。export CHIP_PLATFORM=N # システム上に複数の OpenCL プラットフォームがある場合、どれを使用するかを選択します以下の方法でいつでもどのデバイスがチップスターで使用されているかを確認できます。 CHIP_LOGLEVEL=情報 ./build/hipInfo
python3 $SOURCE_DIR/scripts/check.py $BUILD_DIR $DEVICE $BACKEND
インストールされた ChipStar を使用して CUDA/HIP プログラムを構築する方法については、ユーザー ドキュメントを参照してください。
CHIP_BE=<opencl/level0> # 使用するバックエンドを選択します。レベル ゼロと OpenCL の両方が使用可能な場合は、デフォルトでレベル ゼロが使用されます。CHIP_PLATFORM=<N> # システム上に複数のプラットフォームが存在する場合、どれを使用するかを選択します。デフォルトは 0CHIP_DEVICE=<N> # システム上に複数のデバイスが存在する場合、どのデバイスを使用するかを選択します。デフォルトは 0CHIP_DEVICE_TYPE=<gpu/cpu/accel/fpga> または空 # 使用するデバイスのタイプを選択します。デフォルトは空です。CHIP_LOGLEVEL=<trace/debug/info/warn/err/crit> # ログ レベルを設定します。 RELEASE でコンパイルされた場合、err/crit のみが利用可能CHIP_DUMP_SPIRV=<ON/OFF(default)> # 生成された SPIR-V コードをファイルにダンプしますCHIP_JIT_FLAGS=<flags> # 追加の JIT フラグCHIP_L0_COLLECT_EVENTS_TIMEOUT=<N(30 秒のデフォルト)> # タイムアウトレベルゼロの収集にかかる秒数eventsCHIP_L0_EVENT_TIMEOUT=<N(0 デフォルト) # タイムアウトする前にレベル ゼロがイベントを待機する時間を秒単位でタイムアウトします。CHIP_SKIP_UNINIT=<ON/OFF(デフォルト)> # 有効にすると、プログラム終了時にチップスターのバックエンド オブジェクトの初期化をスキップしますCHIP_MODULE_CACHE_DIR=/ path/to/desired/dir # モジュール/プログラム キャッシュ ディレクトリ。デフォルトは $HOME/.cache/chipStar ですが、キャッシュが望ましくない場合は、空の文字列に設定します。つまり、export CHIP_MODULE_CACHE_DIR=
例:
╭─pvelesko@cupcake ~╰─$ clinfo -l プラットフォーム #0: インテル(R) OpenCL グラフィックス `- デバイス #0: インテル(R) Arc(TM) A380 グラフィックスプラットフォーム #1: インテル(R) OpenCL グラフィックス `- デバイス #0: インテル(R) UHD グラフィックス 770
これらの値に基づいて、OpenCL iGPU で実行する場合は次のようになります。
import CHIP_BE=openclexport CHIP_PLATFORM=1export CHIP_DEVICE=0
注: レベル ゼロには clinfo に相当するものはありません。通常、複数のレベル ゼロ デバイスがある場合、プラットフォームは 1 つだけになるため、CHIP_PLATFORM=0 を設定し、次に CHIP_DEVICE を使用するデバイスに設定します。 ※デバイス名はbuild/samples/0_MatrixMultiply/MatrixMultiply
などの名前を出力するサンプルを実行することで確認できます。
これは、インストールされている最新の GCC バージョンに libstdc++ が含まれていない場合によく発生しますが、Clang++ はデフォルトで、検出された最新のものをデフォルトで選択し、最終的に C++ プログラムのリンクに失敗します。この問題についてはここで説明します。
この問題は、GCC を強制的に希望どおりにする Clang++ 構成ファイルを定義することで解決できます。例:
echo --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/11 > ~/local/llvm-17/bin/x86_64-unknown-linux-gnu-clang++.cfg
倍精度浮動小数点数をサポートしていない OpenCL デバイスでテストを実行すると、複数のテストでエラーが発生します。
2 つの環境変数を設定して double を使用するカーネルを動作させることで、Intel iGPU の倍精度浮動小数点のソフトウェア エミュレーションを有効にすることができる場合がありますが、ソフトウェア エミュレーションの大きなオーバーヘッドが発生します。
import IGC_EnableDPEmulation=1export OverrideDefaultFP64Settings=1
デバイスがエミュレーションをサポートしていない場合は、cmake の設定時に-DSKIP_TESTS_WITH_DOUBLES=ON
オプションを指定して、これらのテストをスキップできます。