この拡張は、oneAPI レベルゼロ仕様 (英語) のレベルゼロランタイムをベースに構築されたデータ並列 C++ (DPC++) のレベルゼロ・バックエンドを導入します。サポートされるターゲットは、Gen9 以降のインテル® GPU です。
レベルゼロ・バックエンドは、cl::sycl::backend 列挙子に追加されます。
enum class backend { // ... level_zero, // ... };
以下のセクションでは、レベルゼロ・バックエンドを選択する方法を説明します。
環境件数の使用
SYCL_DEVICE_FILTER 環境変数は、DPC++ ランタイムがシステムデバイスのサブセットのみを使用するように制限します。SYCL_DEVICE_FILTER でバックエンドに level_zero を使用することで、DPC++ バックエンドとしてレベルゼロの使用を選択できます。詳細は、「環境変数」を参照してください。
プログラミング API の使用
フィルターセレクター拡張については、「SYCL* Proposals: Filter Selector」 (英語) に説明があります。SYCL_DEVICE_FILTER がプロセス全体にフィルタリングを適用するのと同様に、このデバイスセレクターを使用して、レベルゼロ・バックエンドをプログラムで選択することが可能です。
環境変数やフィルター・デバイス・セレクターを使用しない場合、実装はインストールされているレベルゼロランタイムでサポートされている GPU デバイスのレベルゼロ・バックグラウンドを選択します。DPC++ プラットフォームのバックエンドは、cl::sycl::platform コマンドの get_backend() メンバー関数で照会できます。
以下のセクションでは、DPC++ とレベルゼロの間で可能なさまざまな相互運用性について説明します。このセクションで説明する相互運用 API を利用するには、アプリケーションは以下のヘッダーをインクルードする必要があります。これらのヘッダーは、以下の順序でインクルードする必要があります。
#include "level_zero/ze_api.h" #include "sycl/backend/level_zero.hpp"
DPC++ オブジェクトのレベルゼロハンドルへのマップ
これらの DPC++ オブジェクトは、対応するレベルゼロハンドルをカプセル化します。
DPC++ オブジェクト |
レベルゼロハンドル |
---|---|
プラットフォーム |
ze_driver_handle_t |
デバイス |
ze_device_handle_t |
コンテキスト |
ze_context_handle_t |
キュー |
ze_command_queue_handle_t |
プログラム |
ze_module_handle_t |
DPC++ オブジェクトからのビルトイン・レベルゼロ・ハンドルの取得
get_native<cl::sycl::backend::level_zero>() メンバー関数で生のネイティブ・レベルゼロ・ハンドルを使用して特定の DPC++ オブジェクトを取得できます。この関数は、DPC++ の platform、device、context、queue、event、および program クラスでサポートされています。メンバー関数の代わりに、cl::sycl 名前空間で定義されているフリー関数を使用できます。
template <backend BackendName, class SyclObjectT> auto get_native(const SyclObjectT &Obj) -> typename interop<BackendName, SyclObjectT>::type;
レベルゼロハンドルからの DPC++ オブジェクトの構築
cl::sycl::level_zero 名前空間で定義されている以下のフリー関数は、アプリケーションが対応するレベルゼロ・オブジェクトをカプセル化する DPC++ オブジェクトを作成できるようにします。
レベルゼロ相互運用関数 | 説明 |
---|---|
make<platform>(ze_driver_handle_t); | ze_driver_handle_t で DPC++ プラットフォーム・インスタンスを構築します。 |
make<device>(const platform &, ze_device_handle_t); | ze_device_handle_t で DPC++ デバイス・インスタンスを構築します。platform 引数は、渡されたレベルゼロデバイスをサポートするレベルゼロドライバーをカプセル化する DPC++ プラットフォームを渡します。 |
make<context>(const vector_class<device> &, ze_context_handle_t); | ze_context_handle_t で DPC++ コンテキスト・インスタンスを構築します。コンテキストは渡されたデバイスに対して作成されます。少なくとも 1 つのデバイスを指定する必要があり、すべてのデバイスは同じ DPC++ プラットフォーム (同じレベルゼロドライバー) でなければなりません。 |
make<queue>(const context &, ze_command_queue_handle_t); | ze_command_queue_handle_t で DPC++ キュー・インスタンスを構築します。コンテキスト引数は、レベルゼロ・コンテキストをカプセル化する有効な DPC++ コンテキストでなければなりません。キューは、渡される DPC++ コンテキストの最初のデバイス にアタッチされます。 |
make<program>(const context &, ze_module_handle_t); | ze_module_handle_t で DPC++ プログラム・インスタンスを構築します。コンテキスト引数は、レベルゼロ・コンテキストをカプセル化する有効な DPC++ コンテキストでなければなりません。レベルゼロモジュールは完全にリンクされていなければなりません (例えば、zeModuleDynamicLink でさらにリンクする必要がありません)。DPC++ プログラムは、リンクされた状態で作成されます。 |
レベルゼロハンドルの所有権とスレッドの安全性
レベルゼロランタイムはオブジェクトの参照をカウントしないため、レベルゼロハンドルの管理方法についてこれらの規則に従うことが重要です。