この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTML、PDF) をベースにしています。原文は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_engine
と subtract_with_carry_engine
は、均一乱数ビット生成器の要件を満たします。
次に示すように、C++ 標準 (英語) に準拠しない機能が適用される場合があります。
random_device seed_seq
クラス、および他のクラスの関連 API は必要ありません。operator>>()
、operator<<()
、operator==()
は必要ありません。- 乱数エンジンの状態サイズを指定する必要はありません。
- 分布は、サポートされる SYCL* デバイスに適用可能な浮動小数点タイプで動作することのみが求められます。
C++ 標準 (英語) の拡張機能として、sycl::vec<Type, N>
をエンジン、エンジンアダプター、および分布のデータ・タイプ・テンプレートのパラメーターとして使用できます。ここで、Type
は標準の対応するクラス・テンプレートでサポートされるデータタイプの 1 つです。このようなテンプレートのインスタンス化では、result_type
も sycl::vec<Type, N>
に定義されます。
エンジン、エンジンアダプター、分布は、さらに以下と同様の scalar_type
を定義します。
result_type
がsycl::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_engine
と subtract_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_type
とD::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 またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。