デバイス分布#
oneMKL RNG ルーチンは、さまざまなタイプの分布を持つ乱数の生成に使用されます。各関数グループは、基礎となる分布タイプ別に以下で紹介されており、その機能の簡単な説明、呼び出しシーケンスの仕様、および入力および出力パラメーターの説明が含まれています。デバイス連続分布生成器テーブルとデバイス離散分布生成器テーブルには、乱数生成器ルーチンがデータタイプと出力分布とともにリストされ、生成器ルーチンのデータタイプと基本乱数生成器間の対応が設定されます。
デバイス連続分布生成器
分布のタイプ |
データタイプ |
BRNG データタイプ |
説明 |
|---|---|---|---|
float、double |
float、double |
区間 [ |
|
float、double |
float、double |
正規分布 (ガウス分布) |
|
float、double |
float、double |
指数分布 |
|
float、double |
float、double |
対数正規分布 |
|
float、double |
float、double |
ベータ分布 |
|
float、double |
float、double |
ガンマ分布 |
デバイス離散分布生成器
分布のタイプ |
データタイプ |
BRNG データタイプ |
説明 |
|---|---|---|---|
整数 |
|
区間 [ |
|
整数 |
整数 |
基礎となる BRNG 整数シーケンスのビット |
|
整数 |
整数 |
32/64 ビットのチャンクに均一に分布されたビット |
|
整数 |
float |
ベルヌーイ分布 |
|
整数 |
double |
ポアソン分布 |
注
integerの場合は、サポートされているデータタイプで必要な分布を確認してください。sycl::halfの連続的に分布する数値を取得するには、以下に示すように、生成された数値をsycl::halfに変換します。
queue.submit([&](sycl::handler& cgh) {
cgh.parallel_for(sycl::range<1>(n / VecSize), [=](sycl::item<1> item) {
size_t item_id = item.get_id(0);
oneapi::mkl::rng::device::mcg59<VecSize> engine(seed, item_id * VecSize);
oneapi::mkl::rng::device::uniform<float> distr;
auto res = oneapi::mkl::rng::device::generate(distr, engine);
if constexpr(VecSize == 1) {
r_acc[item_id] = static_cast<sycl::half>(res);
}
else {
sycl::vec<sycl::half, VecSize> res_;
res_ = res.template convert<sycl::half>();
res_.store(item_id, r_acc);
}
});
});