DPC++ L0 スイッチ

レベルゼロ (L0)

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

L0 に関する詳細は、仕様 (英語) を参照してください。

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

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

L0 ローダー

L0 は、さまざまな oneAPI コンピュート・デバイス・アーキテクチャーでサポートされています。L0 ローダーは、システム内のすべての L0 ドライバーを検出します。さらに、L0 ローダーは L0 SDK でもあります。L0 SDK は、プログラムのビルドに必要な L0 ヘッダーとライブラリーを提供します。

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

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

L0 GPU ドライバー

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

DPC++ プラグイン

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

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

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

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

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

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

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

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

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

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

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

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

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

推奨

コードがデフォルトの設定で動作しない場合は、SYCL_BE=PI_OPENCL で実行して、問題が L0 に関連しているかどうかを確認してみてください。
コードの実行場所の確認方法

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

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

システムで検出されたすべての SYCL* プラグインをロードする方法

sycl-ls ユーティリティーを使用して、システムのすべての SYCL* プラグインをロードできます。このユーティリティーは、プラグインを介して利用可能なすべてのプラットフォームとデバイスも照会します。

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