インテル® oneAPI レベルゼロのスイッチ

インテル® oneAPI レベルゼロの概要

データ並列 C++ (DPC++) は、oneAPI プロジェクトの多くのコンポーネントの 1 つに過ぎません。インテル® oneAPI レベルゼロ API は、oneAPI プロジェクトのデバイスに合わせた低レベルのダイレクト・ツー・メタル・インターフェイスを提供します。OpenCL* API など、ほかの低レベル API の影響を大きく受けていますが、レベルゼロは独立して進化するように設計されています。

レベルゼロに関する詳細は、oneAPI 仕様 (英語) を参照してください。

インストールするパッケージ

intel-level-zero-gpu および level-zero パッケージをインストールする必要があります。

レベルゼロローダー

レベルゼロは、さまざまな oneAPI コンピュート・デバイス・アーキテクチャーでサポートされています。レベルゼロローダーは、システム内のすべてのレベルゼロライバーを検出します。また、レベルゼロローダーは、レベルゼロプログラムを構築するためのレベルゼロヘッダーやライブラリーを含む、レベルゼロ・ソフトウェア開発キットでもあります。

Notes

レベルゼロローダーは、DPC++ には含まれないため、別途インストールする必要があります。

レベルゼロローダーに関する詳細は、oneAPI 仕様の「ローダー」セクション (英語) を参照してください。

レベルゼロ GPU ドライバー

最初のレベルゼロドライバーは、インテル® グラフィックス・プロセシング・ユニット (GPU) Gen9+ をサポートするために作成されました。ドライバーはオープンソースであり、定期的にリリースおよび保守されます。DPC++ には含まれないため、別途インストールする必要があります。レベルゼロドライバーと OpenCL* ドライバーは同じパッケージで提供されます。レベルゼロドライバーに関する詳細は、GitHub* (英語) を参照してください。

DPC++ プラグイン

DPC++ は、多様なデバイス (CPU、GPU、および FPGA) をターゲットとします。異なるデバイスは、FPGA 用の OpenCL*などの異なる低レベルのドライバーを介して操作できます。プラグイン・インターフェイス (PI) は、異なるデバイスを統一された方法で操作するための DPC++ API です。DPC++ のプラグインは、PI API の特定の翻訳を低レベルのランタイムに実装します。レベルゼロ PI プラグインは、レベルゼロシステムを介してサポートされるデバイスを利用できるようにするため DPC++ で作成されました。PI に関する詳細は、GitHub* (英語) を参照してください。

シナリオ 情報
DPC++ デバイスの選択

DPC++ の PI は、利用可能なすべての PI プラグインを介して利用可能なすべてのデバイスを検出します。同じ物理ハードウェア・デバイスを複数のプラグインがサポートしている場合、そのデバイスは異なる DPC++ デバイス (例えば、OpenCL* Gen90 とレベルゼロ Gen90 のように) と見なされます。DPC++ ランタイムは、デバイスセレクターに基づいて利用可能なデバイスからデバイスを選択します。ユーザー定義またはビルトイン (例えば、gpu_selector) のデバイスセレクターを使用できます。

複数の PI プラグインの検出

複数のプラグインの検出をサポートしているため、同じ GPU カードが異なる PI プラグインで利用可能な複数の異なる GPU デバイスと見なされる場合があります。

デバイスが正しく検出されるように、PI に対応するランタイム (OpenCL* やレベルゼロ) が個別に、適切にインストールされている必要があります。DPC++/SYCL* 仕様では、条件 (例えば、is_gpu()) に合致するデバイスが複数ある場合、どのデバイスを使用するかは定義されていません。
Linux* ではデフォルトでレベルゼロ GPU を使用

デフォルトでは、特別なアクションが取られず、レベルゼロランタイムがインストールされている GPU をサポートしている場合、DPC++ ランタイムはサポートされている GPU を使用します。これは、デフォルトの動作を変更するアクションが取られない場合の、標準のビルトインセレクターとカスタムセレクターに適用されます。

現在、Windows* では、OpenCL* GPU が優先されます。

レベルゼロランタイムでサポートされていないデバイス (CPU/FPGA) は、OpenCL* で動作します。

デフォルトの設定の変更方法

SYCL_BE 環境変数を使用してデフォルトの設定を変更できます。有効な値は、PI_OPENCLPI_LEVEL0 です。

例えば、SYCL_BE=PI_OPENCL を指定し、PI OpenCL* プラグインが必要なタイプのデバイスが利用可能であることを報告すると、そのデバイスが使用されます。インストールされているバージョンの OpenCL* で GPU がサポートされている場合、レベルゼロ GPU を優先するデフォルトの設定はオーバーライドされます。

SYCL_BE 設定は、複数の選択肢がある場合のみ有効です。

推奨

コードが動作しない場合は、SYCL_BE=PI_OPENCL で実行して、問題がレベルゼロに関連しているかどうかを確認してみてください。
コードの実行場所の確認方法

SYCL_PI_TRACE=1 環境変数を使用して、コードの実行場所を確認できます。ビルトインセレクターが使用されている場合、その選択を報告します。

SYCL_PI_TRACE=-1 を使用すると、PI の詳細なトレースが有効になり、PI の検出プロセスで検出されたすべてのデバイスが表示されます。

システムですべての SYCL* プラグインとサポートされるデバイスを検出する方法

sycl-ls ユーティリティーを使用して、システムのすべての SYCL* プラグインを検出できます。sycl-ls はプラグインを介して利用可能なすべてのプラットフォームとデバイスを照会し、SYCL* デバイスとその ID 番号に関する有用な情報を表示します。この情報は、特定のデバイスで SYCL* プログラムを実行するように指定する場合に役立ちます。SYCL_DEVICE_FILTER 文字列が各行に出力され、3 つの情報が表示されます。

  • プラグインがサポートするバックエンド
  • device_type
  • device_id

$ sycl-ls --verbose で詳細な出力が得られます。これにより、標準のビルトイン・デバイス・セレクターやほかのカスタム・デバイス・セレクターと同じ選択が可能になります。