oneAPI 1.3 暫定仕様書 Rev. 1 の解説 (8)

その他

この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTMLPDF) をベースにしています。原文は2000 ページ近くあり、翻訳の時間とリソースも限られるため、全文翻訳ではなく、記事形式で区切った仕様とその解説を提供することにしました。


この回では、『oneAPI 1.3 Provisional Specification Rev. 1』の「oneDNN」の「Introduction」の節を取り上げています。

はじめに

この仕様は既存のオープンソース実装 (英語) をベースにしていますが、目標は移植可能な API のセットを定義することです。そのため、タイルやブロック化されたメモリー形式 (レイアウト) など実装固有の詳細を意図的に省略し、代わりにプレーンな多次元メモリー形式を記述して、実装固有の最適化されたメモリー形式を定義します。

oneDNN の主な概念は、プリミティブエンジンストリーム、およびメモリー・オブジェクトです。

oneDNN programming model

プリミティブ (dnnl::primitive) は、前方畳み込み、後方 LSTM 計算、データ交換操作など特定の計算をカプセル化するファンクター・オブジェクトです。単一のプリミティブは、前方畳み込みと後続の ReLU など、複雑な融合計算を表すことがあります。融合は、特にプリミティブ属性メカニズムを介して制御されます。

プリミティブと純粋関数の大きな違いは、プリミティブは入力パラメーターのサブセットとして特殊化できることです。

例えば、畳み込みプリミティブはテンソル形式のようなパラメーターを格納し、キャッシュ・ブロッキングなど他の依存関係があるパラメーターを事前計算できます。これにより、oneDNN プリミティブは要求された操作の実行に合わせて調整済みのコードを事前生成できます。oneDNN プログラミング・モデルは、同じプリミティブを再利用して計算を複数回実行することで、事前計算にかかる時間を相殺することを前提にしています。

プリミティブには、計算中に一時ストレージとして利用できる可変メモリーバッファーが必要になることがあります。そのようなバッファーはスクラッチパッドと呼ばれ、プリミティブ・オブジェクト (オブジェクトはスレッドセーフでない) が所有することも、実行時にパラメーターにすることもできます。

プリミティブの作成はコストがかかる操作です。プリミティブは一度だけ作成し、複数回再利用すべきです。実装は、同じパラメーターを持つプリミティブをキャッシュすることで、プリミティブの作成コストを軽減することがあります。このような最適化はこの仕様ではカバーされません。

エンジン (dnnl::engine) は計算デバイス (CPU、システム内の特定の GPU カードなど) を抽象化します。ほとんどのプリミティブは、対応する特定のエンジンで計算を実行するために作成されます。唯一の例外は、2 つの異なるエンジン間でデータを転送する可能性がある並べ替えプリミティブです。

ストリーム (dnnl::stream) は、特定のエンジンに関連付けられた実行コンテキストをカプセル化します。例えば、DPC++ コマンドキューに相当します。

メモリー・オブジェクト (dnnl::memory) は、特定のエンジンに割り当てられたメモリーへのハンドル、テンソルの次元、データタイプ、およびメモリー形式 (テンソル・インデックスが線形メモリー空間のオフセットにマップされる方法) をカプセル化します。メモリー・オブジェクトは実行中プリミティブに渡されます。

抽象化レベル

oneDNN には、最大限の柔軟性を提供するため、プリミティブとメモリー・オブジェクトの複数レベルを抽象化します。

ライブラリーは論理レベルで次の抽象化を提供します。

  • メモリー記述子 (dnnl::memory::desc) は、テンソルの倫理的な次元、データタイプ、およびデータをメモリーに配置する形式を定義します。特殊形式 (dnnl::memory::format_tag::any) は、実際の形式が後に定義されることを示します。

  • プリミティブ記述子 (dnnl::primitive_desc_base が基本クラスであり、サポートされるそれぞれのプリミティブには固有のバージョンがある) は、操作記述子とプリミティブ間の抽象化レベルにあり、予測されるメモリー形式など特定のプリミティブ実装を検査するために使用できます。プリミティブを完全にインスタンス化することなく、クエリーを使用してフォーマットしてメモリー形式の伝搬 (「メモリー形式伝搬」を参照) を実装します。

抽象化レベル メモリー・オブジェクト プリミティブ・オブジェクト
論理記述子 メモリー記述子 プリミティブ記述子
実装 メモリー・オブジェクト プリミティブ

グラフ拡張

グラフ拡張は、個別のプリミティブに代わって計算グラフを操作する oneDNN の高レベルの抽象化です。このアプローチによって操作の融合が可能になります。

  • 透過的: エンジンに対応する融合ロジックを抽象化することで、統合の労力が軽減されます。

  • スケーラブル: oneDNN 実装で利用可能な新しい融合パターンの恩恵を受けるため、融合コードを変更する必要はありません。

グラフ拡張のプログラミング・モデルについては、「グラフ・プログラミング・モデル」で詳しく説明します。

一般的な API の注意

oneDNN オブジェクトはにすることができ、その場合どのような用途にも有効ではありません。空のオブジェクトは、メモリー記述子がないことを示すゼロメモリー記述子と見なされるため特殊であると言えます。空のオブジェクトはデフォルトのコンストラクターを使用して作成されますが、オブジェクトの構築中のエラーによる可能性もあります (次の節を参照)。

エラー処理

すべての oneDNN 関数は、エラーが発生すると次の例外をスローします。

struct error : public std::exception

oneDNN 例外クラス。
このクラスは、失敗した関数呼び出しから返されたステータスを取得します。

oneDNN オブジェクトを構築または返す大部分の oneDNN 関数には、オブジェクトを構築できない場合、エラーをスローする代わりにデフォルトで false に設定され空のオブジェクト (メモリー記述子の場合はゼロオブジェクト) を返すブール値 allow_empty パラメーターがあります。

名前空間

すべての oneDNN 関数とクラスは ::dnnl 名前空間にあります。コマンドキューやバッファーなどの DPC++ オブジェクトを受け入れるまたは返す関数は、::dnnl::sycl_interop 名前空間にあります。

さらに、oneDNN は ::oneapi::dnnl 名前空間を定義します。これは ::dnnl のエイリアスです。


法務上の注意書き

The content of this oneAPI Specification is licensed under the Creative Commons Attribution 4.0 International License (英語). Unless stated otherwise, the sample code examples in this document are released to you under the MIT license (英語).

This specification is a continuation of Intel’s decades-long history of working with standards groups and industry/academia initiatives such as The Khronos Group*, to create and define specifications in an open and fair process to achieve interoperability and interchangeability. oneAPI is intended to be an open specification and we encourage you to help us make it better. Your feedback is optional, but to enable Intel to incorporate any feedback you may provide to this specification, and to further upstream your feedback to other standards bodies, including The Khronos Group SYCL* specification, please submit your feedback under the terms and conditions below. Any contribution of your feedback to the oneAPI Specification does not prohibit you from also contributing your feedback directly to other standard bodies, including The Khronos Group under their respective submission policies.

By opening an issue, providing feedback, or otherwise contributing to the specification, you agree that Intel will be free to use, disclose, reproduce, modify, license, or otherwise distribute your feedback at its sole discretion without any obligations or restrictions of any kind, including without limitation, intellectual property rights or licensing obligations.

This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice.

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

« パート 7        目次        パート 9 »
タイトルとURLをコピーしました