インテル® oneAPI レベルゼロ・バックエンドの仕様

概要

この拡張は、oneAPI レベルゼロ仕様 (英語) のレベルゼロランタイムをベースに構築されたデータ並列 C++ (DPC++) のレベルゼロ・バックエンドを導入します。サポートされるターゲットは、Gen9 以降のインテル® GPU です。

この仕様は暫定版です。内容は完全ではなく、網羅的でもありません。データ並列 C++ (DPC++) プログラミング・モデルをレベルゼロ API にマップする方法など、詳細な情報は今後公開される予定です。将来的には、SYCL* 2020 仕様に準拠する予定です。

必要条件

DPC++ ランタイムがレベルゼロ・バックエンドを認識して有効にするように、レベルゼロのローダーとドライバーがシステムにインストールされている必要があります。具体的な手順は、「インテル® oneAPI DPC++/C++ コンパイラーのシステム要件」 (英語) を参照してください。

ユーザーに表示されるレベルゼロ・バックエンドの選択とデフォルトのバックエンド

レベルゼロ・バックエンドは、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() メンバー関数で照会できます。

レベルゼロ API との相互運用性

以下のセクションでは、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++platformdevicecontextqueueevent、および 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_tDPC++ プラットフォーム・インスタンスを構築します。

make<device>(const platform &, ze_device_handle_t);

ze_device_handle_tDPC++ デバイス・インスタンスを構築します。platform 引数は、渡されたレベルゼロデバイスをサポートするレベルゼロドライバーをカプセル化する DPC++ プラットフォームを渡します。

make<context>(const vector_class<device> &, ze_context_handle_t);

ze_context_handle_tDPC++ コンテキスト・インスタンスを構築します。コンテキストは渡されたデバイスに対して作成されます。少なくとも 1 つのデバイスを指定する必要があり、すべてのデバイスは同じ DPC++ プラットフォーム (同じレベルゼロドライバー) でなければなりません。

make<queue>(const context &, ze_command_queue_handle_t);

ze_command_queue_handle_tDPC++ キュー・インスタンスを構築します。コンテキスト引数は、レベルゼロ・コンテキストをカプセル化する有効な DPC++ コンテキストでなければなりません。キューは、渡される DPC++ コンテキストの最初のデバイス にアタッチされます。

make<program>(const context &, ze_module_handle_t);

ze_module_handle_tDPC++ プログラム・インスタンスを構築します。コンテキスト引数は、レベルゼロ・コンテキストをカプセル化する有効な DPC++ コンテキストでなければなりません。レベルゼロモジュールは完全にリンクされていなければなりません (例えば、zeModuleDynamicLink でさらにリンクする必要がありません)。DPC++ プログラムは、リンクされた状態で作成されます。

レベルゼロハンドルの所有権とスレッドの安全性

レベルゼロランタイムはオブジェクトの参照をカウントしないため、レベルゼロハンドルの管理方法についてこれらの規則に従うことが重要です。