インテル® oneAPI ディープ・ニューラル・ネットワーク・ライブラリー (oneDNN) の使い方

oneDNN は、インテル® 64 アーキテクチャーまたは互換プロセッサーをベースにするシステムをサポートします。サポートされる CPU およびグラフィックス・ハードウェアのリストは、「インテル® oneAPI ディープ・ニューラル・ネットワーク・ライブラリーのシステム要件」を参照してください。

oneDNN は実行時に命令セット・アーキテクチャー (ISA) を検出し、オンライン生成機能を使用して、サポートされる最新の ISA 向けに最適化されたコードを展開します。

アプリケーションが使用する CPU または GPU ランタイム・ライブラリーとの相互運用性を保証するため、オペレーティング・システムごとにいくつかのパッケージが提供されます。

表 9 オペレーティング・システム別のパッケージ

構成

依存関係

cpu_dpcpp_gpu_dpcpp

DPC++ ランタイム

cpu_iomp

インテルの OpenMP* ランタイム

cpu_gomp

GNU* OpenMP* ランタイム

cpu_vcomp

Microsoft Visual C++* の OpenMP* ランタイム

cpu_tbb

インテル® oneAPI スレッディング・ビルディング・ブロック

パッケージには必要なライブラリーが含まれていないため、ビルド時にインテル® oneAPI ツールキットまたはサードパーティーのツールを使用してアプリケーションで依存関係を解決する必要があります。

SYCL* 環境では、oneDNN は DPC++ SYCL* ランタイムを介して CPU または GPU ハードウェアと対話します。oneDNN は SYCL* を使用するほかのコードを使用することもできます。これを可能にするため、oneDNN は基盤となる SYCL* オブジェクトと相互作用する API 拡張機能を提供します。

そのような状況の 1 つとして、oneDNN が提供しないカスタム操作を行うため SYCL* カーネルを実行する場合が考えられます。その場合、oneDNN はカーネルをシームレスに送信するのに必要な API を提供し、同じデバイスキューを使用して実行コンテキストを oneDNN と共有します。

相互運用性を提供する API は、次の 2 つのシナリオを想定します。

  • 既存の SYCL* オブジェクトをベースとする oneDNN オブジェクトの構築

  • 既存の oneDNN オブジェクト向けの SYCL* オブジェクトへのアクセス

次の表に oneDNN オブジェクトと SYCL* オブジェクトのマッピングを示します。

表 10 oneDNN と SYCL* オブジェクトのマッピング 1

oneDNN オブジェクト

SYCL* オブジェクト

エンジン

cl::sycl::device and cl::sycl::context

ストリーム

cl::sycl::queue

メモリー

cl::sycl::buffer<uint8_t, 1> または統合共有メモリー (USM) ポインター

内部的にライブラリー・メモリー・オブジェクトは、1D uint8_t SYCL バッファーを使用しますが、異なる型の SYCL バッファーを介してメモリーを初期化およびアクセスできます。この場合、バッファーは異なるタイプの cl::sycl::buffer<uint8_t, 1> に再解釈されます。

表 11 oneDNN と SYCL* オブジェクトのマッピング 2

oneDNN オブジェクト

SYCL* オブジェクトからの再構成

エンジン

dnnl::sycl_interop::make_engine(sycl_dev, sycl_ctx)

ストリーム

dnnl::sycl_interop::make_stream(engine, sycl_queue)

メモリー

USM ベース: dnnl::memory(memory_desc, engine, usm_ptr)

バッファーベース: dnnl::sycl_interop::make_memory(memory_desc, engine, sycl_buf)

表 12 oneDNN と SYCL* オブジェクトのマッピング 3

oneDNN オブジェクト

SYCL* オブジェクトの抽出

エンジン

dnnl::sycl_interop::get_device(engine)

dnnl::sycl_interop::get_context(engine)

ストリーム

dnnl::sycl_interop::get_queue(stream)

メモリー

USM ポインター: dnnl::memory::get_data_handle()

バッファー: dnnl::sycl_interop::get_buffer(memory)

  • oneDNN でアプリケーションをビルドするには、コンパイラーが必要です。インテル® oneAPI DPC++/C++ コンパイラーは、インテル® oneAPI ベース・ツールキットに含まれています。

  • SYCL* 相互運用性 API を有効にするには、dnnl_sycl.hpp をインクルードする必要があります。

  • OpenMP* はランタイム・オブジェクトの受け渡しに依存しないため、oneDNN と連携する相互運用 API は必要ありません。