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

その他

この記事は、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」の「Primitives」の節を取り上げています。

プリミティブ

プリミティブは、順方向畳み込み、逆方向 LSTM 計算、データ交換操作など特定の計算をカプセル化するファンクター・オブジェクトです。単一のプリミティブは、順方向畳み込みとそれに続く ReLU など、複雑な融合計算を表すことがあります。

プリミティブと純粋関数の大きな違いは、プリミティブは状態を格納できることです。

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

プリミティブ状態の変更可能な部分は、スクラッチパッドと呼ばれます。これは、プリミティブが計算中にのみ一時ストレージとして使用できるメモリーバッファーです。スクラッチパッドは、プリミティブ・オブジェクト (オブジェクトはスレッドセーフでない) が所有することも、実行時パラメーターにすることもできます。

概念的には、oneDNN は、計算を抽象的なものから具体的なものまで記述できるいくつかのレイヤーを持ちます。

  • プリミティブ記述子は、構築時に渡されたメモリー記述子 (dnnl::memory::desc) と属性で操作の計算を完全に定義します。また、エンジンに基づいて特定の実装をディスパッチします。プリミティブ記述子を使用して、プリミティブ実装の詳細を照会できます。例えば、プリミティブをインスタンス化することなくクエリーによって予測されるメモリー形式を調査することで、メモリー形式伝播を実装できます。oneDNN には、同じ計算を実行するのに使用できる同一プリミティブの複数の実装が含まれる場合があります。プリミティブ記述子は一方向の反復を許容し、複数の実装を検査できます。ライブラリーは、最も優先順位の高い実装から、最も優先度の低い実装の順に並べることが期待されるため、デフォルトで選択されたものを使用しても安全です。

  • プリミティブは最も具体的で、プリミティブの計算を実行するために行われる実際の実行可能コードを具体化します。

API レベル:

  • プリミティブは、dnnl::primitive を基本クラスに持つ dnnl 名前空間のトップレベルのクラスとして表されます (例えば、dnnl::convolution_forward)。

  • プリミティブ記述子は、primitive_desc クラスとして表され、基本クラスとして dnnl::primitive_desc_base を持つプリミティブ・クラス内にネストされます (dnnl::rnn_primitive_desc_base から派生する RNN プリミティブを除きます)。例えば dnnl::convolution_forward::primitive_descdnnl::primitive_desc::next_impl() メンバー関数は、実装を反復する方法を提供します。

namespace dnnl {
   struct something_forward : public primitive {
      struct desc {
         // プリミティブ固有のコンストラクター
      }
      struct primitive_desc : public primitive_desc_base {
         // コンストラクターとプリミティブ固有のメモリー記述子クエリー
      }
   };
}

プリミティブを作成する一連のアクションには次のものがあります。

  1. 適切なメモリー記述子、エンジン、属性に基づいてプリミティブ記述子を作成します。プリミティブがサポートする場合、プリミティブ記述子にはプレースホルダー dnnl::memory::format_tag::any メモリー形式の記述子を含めることができます。

  2. 手順 1 で取得したプリミティブ記述子を基にプリミティブを作成します。

このセクションには次の節が含まれます。

  • 要素単位
  • 内積
  • レイヤーの正規化
  • ローカル応答の正規化
  • 行列の乗算
  • プーリング
  • PReLU
  • リダクション
  • リオーダー
  • リサンプリング
  • RNN
  • シャッフル
  • ソフトマックス
  • 累積
  •  

    共通定義

    ここでは、すべてもしくは複数のプリミティブで使用される共通の型と定義を示します。

    プリミティブの基本クラス

    struct primitive

    すべての計算プリミティブの基本クラス。

    このクラスの詳細とパブリック関数については、こちら (英語) をご覧ください。

    プリミティブ記述子の基本クラス

    プリミティブ記述子には共通の基本クラスがあります。

    struct primitive

    すべてのプリミティブ記述子の基本クラス。

    このクラスの詳細とパブリック関数については、こちら (英語) をご覧ください。

    一般的な列挙型

    詳細については、こちら (英語) をご覧ください。

    正規化プリミティブのフラグ

    詳細については、こちら (英語) をご覧ください。

    実行引数のインデックス

    詳細については、こちら (英語) をご覧ください。


    法務上の注意書き

    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 またはその子会社の商標です。

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

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