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

その他

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


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

SYCL* カーネル API

サポートされる C++ 標準ライブラリーAPI とアルゴリズム

oneDPL は、SYCL* カーネルで使用する C++ 標準 (英語) ライブラリー API のサブセットを定義します。これらの API は、一般的な CPU ベースのプラットフォームのコードと同様にカーネルでも使用できます。

乱数生成器

oneDPL は、SYCL* カーネル内での利用に適した標準 C++ 疑似乱数生成器のサブセットを提供します。API は <oneapi/dpl/random> ヘッダーで定義されています。

サポートされる機能

  • エンジン・クラス・テンプレート
    • linear_congruential_engine
    • subtract_with_carry_engine
  • エンジン・アダプター・クラス・テンプレート
    • discard_block_engine
  • 事前定義されたパラメーターを持つエンジンとエンジンアダプター
    • instd_rand0
    • minstd_rand
    • ranlux24_base
    • ranlux48_base
    • ranlux24
    • ranlux48
  • 分布クラス・テンプレート
    • uniform_int_distribution
    • uniform_real_distribution
    • normal_distribution
    • exponential_distribution
    • bernoulli_distribution
    • geometric_distribution
    • weibull_distribuion
    • lognormal_distribution
    • cauchy_distribution
    • extreme_value_distribution

linear_congruential_enginesubtract_with_carry_engine は、均一乱数ビット生成器の要件を満たします。

制限

次に示すように、C++ 標準 (英語) に準拠しない機能が適用される場合があります。

  • random_device seed_seq クラス、および他のクラスの関連 API は必要ありません。
  • operator>>()operator<<()operator==() は必要ありません。
  • 乱数エンジンの状態サイズを指定する必要はありません。
  • 分布は、サポートされる SYCL* デバイスに適用可能な浮動小数点タイプで動作することのみが求められます。

拡張機能

C++ 標準 (英語) の拡張機能として、sycl::vec<Type, N> をエンジン、エンジンアダプター、および分布のデータ・タイプ・テンプレートのパラメーターとして使用できます。ここで、Type は標準の対応するクラス・テンプレートでサポートされるデータタイプの 1 つです。このようなテンプレートのインスタンス化では、result_typesycl::vec<Type, N> に定義されます。

エンジン、エンジンアダプター、分布は、さらに以下と同様の scalar_type を定義します。

  • result_typesycl::vec<Type, N> の場合、using scalar_type = typename result_type::element_type;
  • それ以外の場合、using scalar_type = result_type;

scalar_type は、以下を含むスカラー・データ・タイプが予測されるすべてのコンテキストで、result_type の代わりに使用されます。

  • 構成パラメーターとプロパティーのタイプ
  • シード値のタイプ
  • コンストラクターの入力パラメーター
  • min()max() メソッドの戻り値タイプなど

scalar_type は、sycl::vec によるテンプレートのインスタンス化を除き、result_type と同一であるため、クラス・テンプレートは C++ 標準 (英語) の要件を満たします。

sycl::vec<Type,N> でインスタンス化された場合、linear_congruential_enginesubtract_with_carry_engine は、C++ 標準 (英語) で定義される均一乱数ビット生成器の要件を満たさない可能性があります。代わりに、次の代替要件が適用されます。タイプ G エンジン・オブジェクト g の場合、

  • G::scalar_type は、sycl::vec<Type,N>::element_type と同じ符号なし整数
  • G::min()G::max() は、 G::scalar_type の値を返す
  • 範囲 [0, N) の各インデックス i は、G::min() <= g()[i] および g()[i] <= G::max()

これらのエンジンは、operator() が返す sycl::vec の各要素に対する標準の均一乱数ビット生成器の要件を満たしています。

同様に、sycl::vec<Type,N> でインスタンス化されたテンプレートであるタイプ D の分布オブジェクト d の場合は、次のようになります。

  • D::scalar_type は、sycl::vec<Type,N>::element_type と同じ
  • D::min()D::max() は、D::scalar_typeD::min() <= D::max() の値を返す
  • 分布の operator() は、閉鎖区間 [D::min(), D::max()] 内のランダム値で満たされた sycl::vec<Type,N> を返す

次のような、事前定義されたパラメーターを持つエンジンとエンジンアダプターが定義されています。

template <int N>
using minstd_rand0_vec = linear_congruential_engine<sycl::vec<::std::uint_fast32_t, N>, 16807, 0, 2147483647>;

template <int N>
using minstd_rand_vec = linear_congruential_engine<sycl::vec<uint_fast32_t, N>, 48271, 0, 2147483647>;

template <int N>
using ranlux24_base_vec = subtract_with_carry_engine<sycl::vec<uint_fast32_t, N>, 24, 10, 24>;

template <int N>
using ranlux48_base_vec = subtract_with_carry_engine<sycl::vec<uint_fast64_t, N>, 48, 5, 12>;

template <int N>
using ranlux24_vec = discard_block_engine<ranlux24_base_vec<N>, 223, 23>;

template <int N>
using ranlux48_vec = discard_block_engine<ranlux48_base_vec<N>, 389, 11>;

呼び出しごとにランダムな値の sycl::vec を生成することを除いて、このエンジンの動作は、次の表に示すように対応するスカラーエンジンと同等です。

sycl::vec<> に基づくエンジンとエンジンアダプター C++ 標準との類似性 デフォルトで構築されたオブジェクトで連続的に生成される 10000 番目のスカラー乱数値
minstd_rand0_vec minstd_rand0 1043618065
minstd_rand_vec minstd_rand 399268537
ranlux24_base_vec ranlux24_base 7937952
ranlux48_base_vec ranlux48_base 61839128582725
ranlux24_vec ranlux24 9901578
ranlux48_vec ranlux48 1112339016

関数オブジェクト

oneDPL 関数オブジェクトは、<oneapi/dpl/functional> ヘッダーで定義されています。

namespace oneapi {
namespace dpl {
    struct identity
    {
        template <typename T>
        constexpr T&&
        operator()(T&& t) const noexcept;
    };
}
}

oneapi::dpl::identity クラスは ID 操作を実装します。関数オペレーターは型のインスタンスを受け取り、引数を変更することなく返します。


法務上の注意書き

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

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

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